今天看了注解注入覺得確實簡化了xml配置,一般情況下Spring容器要成功啟動的三大要件分別是:Bean定義信息,Bean實現類,以及spring本身。如果采取基於XML的配置,Bean信息和Bean實現類本身是分離的,而采用注解基於注解配置的方式,Bean定義信息通過在Bean實現類上標注注解實現,這種方式確實簡化了xml配置,但是是不是某種程度增加了耦合?
常用的注解有Autowired、Resource、Qualifier、Service、Controller、Repository、Component,其中作用如下:
Autowired是自動注入,自動從spring的上下文找到合適的bean來注入,主要用來消除setter和getter方法
Resource用來指定名稱注入
Qualifier和Autowired配合使用,指定bean的名稱
Service,Controller,Repository分別標記類是Service層類,Controller層類,數據存儲層的類,spring掃描注解配置時,會標記這些類要生成bean。
Component是一種泛指,標記類是組件,spring掃描注解配置時,會標記這些類要生成bean。
- 基於注解的方式
1 package com.xsf.springtest; 2 3 import org.springframework.stereotype.Repository; 4 5 6 @Repository 7 public class kiteDao { 8 9 private String driverType = "天空"; 10 11 public kiteDao(String palce) { 12 this.driverType = place; 13 } 14 15 public kiteDao() { 16 17 } 18 19 public void flyKite(String kite) { 20 String insertMsg = String.format("把風箏 %s 放到了 %s", kite, driverType); 21 System.out.println(insertMsg); 22 } 23 24 }
下面使用常用的Autowired將剛才定義的Bean注解到addkite中去,該類為service類,因此該類標注@Service注解
1 package com.xsf.springtest; 2 3 import javax.annotation.Resource; 4 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.beans.factory.annotation.Qualifier; 7 import org.springframework.stereotype.Service; 8 9 @Service 10 public class kiteService { 11 12 @Autowired 13 //將前面定義的kiteDao類的實例就會自動注入到kitedao的實例中了 14 private kiteDao kitedao; 15 16 public void addkite(String kite) { 17 this.kitedao.flyKite(kite); 18 } 19 }
最后一個寫一個測試代碼,運行下面的測試代碼即可看到信息
1 package com.xsf.springtest; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.annotation.AnnotationConfigApplicationContext; 5 import org.springframework.context.support.ClassPathXmlApplicationContext; 6 7 8 public class flyKiteTest 9 { 10 public static void main( String[] args ) 11 { 12 //它的構造函數接受一個package的名稱,來限定要掃描的package。然后就可以通過appContext的getBean方法獲得的實例了 13 ApplicationContext appContext = new AnnotationConfigApplicationContext("com.xsf.springtest"); 14 15 ; 16 kiteService service = appContext.getBean(kiteService.class); 17 service.addkite("大蝴蝶"); 18 } 19 }
- 注解與xml混合的方式
在source文件夾下面新建spring.xml文件這里的bean id為kitedao與kiteService中的一致若不一致會報錯(或者在@Autowired 后加上 @Qualifier("###")將kiteService中的kitedao換做對應的###即可)
1 <?xml version="1.0" encoding="utf-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 6 http://www.springframework.org/schema/context 7 http://www.springframework.org/schema/context/spring-context-3.0.xsd "> 8 9 <context:annotation-config /> 10 <!-- 掃描包 --> 11 <context:component-scan base-package="com.xsf.springtest"> 12 </context:component-scan> 13 14 <!-- 定義一個id為kitedao的Bean 他的構造函數palce的值為sqlite --> 15 <bean id="kitedao" class="com.xsf.springtest.kiteDao"> 16 <constructor-arg name="place" value="樹上" /> 17 </bean> 18 </beans> 19
此時測試代碼中使用ApplicationContext appContext = new ClassPathXmlApplicationContext("/spring.xml");連接配置文件即可
1 package com.xsf.springtest; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.annotation.AnnotationConfigApplicationContext; 5 import org.springframework.context.support.ClassPathXmlApplicationContext; 6 7 8 public class flyKiteTest 9 { 10 public static void main( String[] args ) 11 { 12 //它的構造函數接受一個package的名稱,來限定要掃描的package。然后就可以通過appContext的getBean方法獲得的實例了 13 //ApplicationContext appContext = new AnnotationConfigApplicationContext("com.xsf.springtest"); 14 //通過spring配置文件加載類 15 ApplicationContext appContext = new ClassPathXmlApplicationContext("/spring.xml"); 16 kiteService service = appContext.getBean(kiteService.class); 17 service.addkite("大蝴蝶"); 18 } 19 }