Spring支持屬性注入和構造器注入,它支持XML和注解兩種方式。本文介紹Spring控制反轉容器加載包含beans的XML文件,實現依賴注入。
一、創建bean實例
暫且拋開對象依賴,我們先看下如何通過Spring容器創建bean實例。這里要用到Spring的控制反轉容器ApplicationContext,它的getBean方法可以創建bean實例
1.在Maven項目的pom.xml添加spring依賴項。
<properties>
<spring.version>4.3.5.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
2. 新建java類Category。

1 package bean; 2 3 public class Category { 4 private int cateId; 5 private String cateName; 6 public int getCateId(){ 7 return this.cateId; 8 } 9 public void setCateId(int id){ 10 this.cateId=id; 11 } 12 public String getCateName(){ 13 return this.cateName; 14 } 15 public void setCateName(String cateName) { 16 this.cateName = cateName; 17 18 } 19 20 @Override 21 22 public String toString() { 23 24 return " 商品類型 id="+this.cateId+",name="+this.cateName; 25 26 } 27 28 }
3. 新建xml配置文件,路徑為resources/spring-config.xml,用來配置bean對象。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="category" class="bean.Category"></bean> </beans>
可以為bean指定一個id或name作為標識。
4. 調用。
首先使用ClassPathXmlApplicationContext加載配置文件,然后通過ApplicationContext的getBean方法獲取Category實例。
public class Main {
public static void main(String[] args){
//創建bean實例
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml"); Category category=applicationContext.getBean(Category.class);
//設置屬性
category.setCateId(1);
category.setCateName("書籍");
//顯示結果
System.out.println(category.toString());
}
}
運行結果為:
商品類型 id=1,name=書籍
二、向構造函數傳參
1.為Category添加構造函數:
public Category(int cateId,String cateName){
this.cateId=cateId;
this.cateName=cateName;
}
2.修改xml配置
向構造函數傳參有兩種配置方式。
①通過指定參數名name傳遞參數
<!--方式一:name--> <bean id="category" class="bean.Category"> <constructor-arg name="cateId" value="99"/> <constructor-arg name="cateName" value="其他"/> </bean>
②通過指定參數索引順序index傳遞參數
<!--方式二:index--> <bean id="category" class="bean.Category"> <constructor-arg index="0" value="99"/> <constructor-arg index="1" value="其他"/> </bean>
③修改main調用進行測試。
public class Main { public static void main(String[] args){ //創建bean實例 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml"); Category category=applicationContext.getBean(Category.class); //輸出默認值 System.out.println(category.toString()); //設置屬性 category.setCateId(1); category.setCateName("書籍"); System.out.println(category.toString()); //運行結果: // 商品類型 id=99,name=其他 // 商品類型 id=1,name=書籍 } }
三、依賴注入
依賴注入通常有以下兩種方式:
- 設置注入:IoC容器使用屬性的setter方法來注入被依賴的實例。
- 構造注入:IoC容器使用構造器來注入被依賴的實例。
1.設置注入
①新建類product,它依賴前面的Category類。

package bean; public class Product { private int productId; private String productName; private Category productCategory; public int getProductId(){ return this.productId; } public void setProductId(int productId){ this.productId=productId; } public String getProductName(){ return this.productName; } public void setProductName(String productName) { this.productName = productName; } public Category getProductCategory() { return productCategory; } public void setProductCategory(Category productCategory) { this.productCategory = productCategory; } @Override public String toString() { return " 商品 id="+this.productId+";name="+this.productName+this.productCategory.toString(); } }
②.配置xml
在spring-config.xml中新增bean節點,對應的class屬性為Product。product通過配置property元素來調用相應的setter方法以設置值,需要注意的是prodcuctCategory是通過ref來配置對category的引用。
<bean id="product" class="bean.Product"> <property name="productId" value="100"></property> <property name="productName" value="一千零一夜"></property> <property name="productCategory" ref="category"></property> </bean>
③.main調用
Product product=applicationContext.getBean(Product.class);
System.out.println(product.toString());
2.、構造注入
①為product新增構造函數。
public Product(int productId,String productName,Category category){ this.productId=productId; this.productName=productName; this.productCategory=category; }
②修改配置文件 spring-config.xml 中的product bean。
<bean id="product" class="bean.Product"> <constructor-arg index="0" value="101"/> <constructor-arg index="1" value="童話鎮"/> <constructor-arg index="2" ref="category"/> </bean>
③運行結果同設置注入一樣
源碼:點此下載