Spring 三種不同的裝配方式。set注入、構造器注入與自動裝配


 

一、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這些注解了,這些注解主要是指定需要裝配的類。看不懂就算了。

 

 

 

 

 

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM