1. 程式人生 > >spring註解使用

spring註解使用

spring

一、使用註解前,在配置文件中,引入context命名空間

xmlns:context=http://www.springframework.org/schema/context
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd">

二、在配置文件中加入context:annotation-config標簽

<context:annotation-config/>

這個配置隱式註冊了多個對註釋進行解析處理的處理器

AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor

PersistenceAnnotationBeanPostProcessorRequiredAnnotationBeanPostProcessor

三、用來裝配的註解

@Autowired

@Autowired 默認按類型裝配

@Autowired註解是按類型裝配依賴對象,默認情況下它要求依賴對象必須存在,如果允許

null值,可以設置它required屬性為false

@Autowired可用於屬性字段上,也可用於屬性set方法上。

@Autowired(request=false)
private UserService userService;
public void setUserService(UserService userService){
    This.userService= userService;
}

或者

private UserService userService;
@Autowired(request=false)
public void setUserService(UserService userService){
    This.userService= userService;
}

如果我們想使用按名稱裝配,可以結合@Qualifier註解一起使用。如下:

@[email protected](“UserService”)
private UserService userService;
public void setUserService(UserService userService){
    This.userService= userService;
}

@Resource

@Resource默認按名稱裝配,當找不到與名稱匹配的bean才會按類型裝配。

註:@Resource註解在spring安裝目錄的lib\j2ee\common-annotations.jar

當註解標註在字段上,即默認取字段的名稱作為bean名稱尋找依賴對象

當註解標註在屬性的setter方法上,即默認取屬性名作為bean名稱尋找依賴對象。

@Resource(name=”userService”)
private UserService userService;
public void setUserService(UserService userService){
    This.userService= userService;
}

或:

private UserService userService;
@Resource(name=”userService”)
public void setUserService(UserService userService){
    This.userService = userService;
}


註意:如果沒有指定name屬性,並且按照默認的名稱找不到依賴對象時, @Resource註解會回退到按類型裝配。但一旦指定了name屬性,就只能按名稱裝配了。

@PostConstruct

指定Bean的初始化方法

@PreDestroy

指定Bean的銷毀方法

四、掃描:

在大型項目中,通常會有上百至上千個組件,如果這些組件都采用xmlbean定義來配置,顯然會增加配置文件的體積,查找及維護起來也不太方便。spring2.5為我們引入了組件自動掃描機制,它可以在類路徑底下尋找標註了@Component@Service@Controller@Repository註解的類,並把這些類納入進spring容器中管理。它的作用和在xml文件中使用bean節點配置組件是一樣的。

使用掃描前同樣需要註意命名空間。

在配置文件中添加context:component-scan標簽

<context:component-scanbase-package="com.gg "/>

其中base-package為需要掃描的包(含子包)

@Service用於標註業務層組件、

@Controller用於標註控制層組件(如struts中的action)、

@Repository用於標註數據訪問組件,即DAO組件。

@Component泛指組件,當組件不好歸類的時候,我們可以使用這個註解進行標註。

五、註解AOP

啟用spring@AspectJ切面配置的支持,並確保自動代理

<aop:aspectj-autoproxy/>

以前置通知為例:

聲明一個接口:

public interface You {
    void buyApple();
    void buyBunana();
}

實現類:

public class YouImpl implements You {
    public void buyApple() {
      System.out.println("買蘋果!");
  }
 
  publicvoid buyBunana() {
    System.out.println("買香蕉!");
  }
}

攔截器:

@Aspect
public class MyInterceptor {
    @Pointcut("execution(*com.gg.test.aop.You.*(..))")
  private void anyMethod(){}//定義一個切點
  @Before("anyMethod()") 
  public void doSomthing(){   
      System.out.println("前置通知"); 
  }
}

配置文件:

<?xml version = "1.0" encoding= "UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
         <aop:aspectj-autoproxy/>
   <bean id="youImpl"class="com.gg.test.aop.YouImpl"></bean>
   <bean id="myInterceptor"class="com.gg.test.aop.MyInterceptor"/>
</beans>

測試:

public class Test {
    publicstatic void main(String[] args) {
  ApplicationContextapplicationContext = newClassPathXmlApplicationContext("aopdemo.xml");
    Youyou = (You)applicationContext.getBean("youImpl");
  you.buyApple();
  }
}

測試結果:

技術分享

如果有參數可用@Before("anyMethod() && args(name)")這種方式表示。



spring註解使用