一、Spring的第一種注入方式,是使用property這個標簽配合Bean類屬性的set方法進行注入,代碼如下:
為了測試我創建了一個maven項目,並且在pom.xml中引入了以下依賴包:(日志系統不需要使用到)
1 <dependencies> 2 <!--springframewok模板--> 3 <dependency> 4 <groupId>org.springframework</groupId> 5 <artifactId>spring-context</artifactId> 6 <version>4.3.13.RELEASE</version> 7 </dependency> 8 <!--日志系統--> 9 <dependency> 10 <groupId>log4j</groupId> 11 <artifactId>log4j</artifactId> 12 <version>1.2.17</version> 13 </dependency> 14 <!--測試--> 15 <dependency> 16 <groupId>org.springframework</groupId> 17 <artifactId>spring-test</artifactId> 18 <version>4.3.13.RELEASE</version> 19 </dependency> 20 <!--junit單元測試--> 21 <dependency> 22 <groupId>junit</groupId> 23 <artifactId>junit</artifactId> 24 <version>4.12</version> 25 </dependency> 26 </dependencies>
在java包下創建一個包,這里我創建的是com.zm.a,再創建兩個測試類a1類和a2類,(這里的構造方法不寫的話在構造器注入那里會報錯)代碼如下
1 package com.zm.a; 2 3 4 public class a1 { 5 public a1() { 6 super(); 7 System.out.println("a1的無參構造方法"); 8 } 9 10 private a2 a2; 11 12 //使用set方法配合xml的property標簽進行注入裝配 13 public void setA2(com.zm.a.a2 a2) { 14 this.a2 = a2; 15 } 16 17 public void play(){ 18 System.out.println("a1的play方法"); 19 a2.play(); 20 } 21 }
1 package com.zm.a; 2 3 public class a2 { 4 public a2() { 5 super(); 6 System.out.println("a2的無參構造方法"); 7 } 8 9 public void play(){ 10 System.out.println("a2的play()方法"); 11 } 12 }
在resources包下創建一個applicationContext.xml的配置文件
下面是set方法注入的xml的配置,把a2注入到a1中,set方法和構造器的注入使用配置xml的方式:
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" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 <bean id="a1" class="com.zm.a.a1"> 6 <property name="a2" ref="a2"></property> 7 </bean> 8 <bean id="a2" class="com.zm.a.a2"></bean> 9 </beans>
最后我們在test下的java包下創建一個com.zm.a的包,並且創建一個測試類進行單元測試,代碼如下:
1 package com.zm.a; 2 import org.junit.Test; 3 import org.junit.runner.RunWith; 4 import org.springframework.beans.factory.annotation.Autowired; 5 import org.springframework.test.context.ContextConfiguration; 6 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 7 8 @RunWith(SpringJUnit4ClassRunner.class) 9 @ContextConfiguration("classpath:applicationContext.xml") 10 public class TestA { 11 12 13 @Autowired 14 private a1 a1; 15 16 @Test 17 public void test(){ 18 a1.play(); 19 } 20 }
第二種方法:使用構造器配合constructor-arg進行注入,只需要修改a1和a2類還有xml的代碼,如下
1 package com.zm.a; 2 3 4 public class a1 { 5 public a1() { 6 super(); 7 System.out.println("a1的無參構造方法"); 8 } 9 10 private a2 a2; 11 12 //使用構造器配合xml的constructor-arg進行注入裝配 13 public a1(com.zm.a.a2 a2) { 14 this.a2 = a2; 15 } 16 17 public void play(){ 18 System.out.println("a1的play方法"); 19 a2.play(); 20 } 21 }
1 package com.zm.a; 2 3 public class a2 { 4 public a2() { 5 super(); 6 System.out.println("a2的無參構造方法"); 7 } 8 9 public void play(){ 10 System.out.println("a2的play()方法"); 11 } 12 }
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" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 <bean id="a1" class="com.zm.a.a1"> 6 <constructor-arg ref="a2"></constructor-arg> 7 </bean> 8 <bean id="a2" class="com.zm.a.a2"></bean> 9 </beans>
第三種方法,使用注解實現自動注入裝配,代碼如下:
1 package com.zm.a; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Component; 5 6 @Component 7 public class a1 { 8 public a1() { 9 super(); 10 System.out.println("a1的無參構造方法"); 11 } 12 @Autowired 13 private a2 a2; 14 15 public void play(){ 16 System.out.println("a1的play方法"); 17 a2.play(); 18 } 19 }
1 package com.zm.a; 2 3 import org.springframework.stereotype.Component; 4 5 @Component 6 public class a2 { 7 public a2() { 8 super(); 9 System.out.println("a2的無參構造方法"); 10 } 11 12 public void play(){ 13 System.out.println("a2的play()方法"); 14 } 15 }
1 package com.zm.a; 2 import config.AppConfig; 3 import org.junit.Test; 4 import org.junit.runner.RunWith; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.test.context.ContextConfiguration; 7 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 9 @RunWith(SpringJUnit4ClassRunner.class) 10 @ContextConfiguration(classes = AppConfig.class) 11 public class TestA { 12 13 14 @Autowired 15 private a1 a1; 16 17 @Test 18 public void test(){ 19 a1.play(); 20 } 21 }
因為不使用xml配置bean,所以需要一個容器類,我們在com.zm.config包下創建一個AppConfig類,然后通過掃描指定包下的組件進行注入裝配,
這里使用的是com.zm.a,所以指定了com.zm.a包
1 package config; 2 3 import org.springframework.context.annotation.ComponentScan; 4 import org.springframework.context.annotation.Configuration; 5 6 @Configuration 7 @ComponentScan("com.zm.a") 8 public class AppConfig { 9 }
構造器注入和set注入還可以在xml中導入p,c命名空間簡化代碼,具體怎么實現我也不寫了
當然我是為了簡單測試一下才沒有使用分層結構,在實際開發中,比如dao下的接口的實現類會出現多個,這個時候需要涉及到
@Primary@Qualifier@Resource這些注解了,這些注解主要是指定需要裝配的類。看不懂就算了。