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/>
這個配置隱式註冊了多個對註釋進行解析處理的處理器
AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,
PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor
三、用來裝配的註解
@Autowired:
@Autowired 默認按類型裝配
@Autowired註解是按類型裝配依賴對象,默認情況下它要求依賴對象必須存在,如果允許
@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的銷毀方法
四、掃描:
在大型項目中,通常會有上百至上千個組件,如果這些組件都采用xml的bean定義來配置,顯然會增加配置文件的體積,查找及維護起來也不太方便。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註解使用