Spring支持属性注入和构造器注入,它支持XML和注解两种方式。本文介绍Spring控制反转容器加载包含beans的XML文件,实现依赖注入。
一、创建bean实例
暂且抛开对象依赖,我们先看下如何通过Spring容器创建bean实例。这里要用到Spring的控制反转容器ApplicationContext,它的getBean方法可以创建bean实例
1.在Maven项目的pom.xml添加spring依赖项。
<dependencies> <!-- mybatis核心包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.5</version> <configuration> <configurationFile>${basedir}/src/main/resources/mybatis-generator-config.xml</configurationFile> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.21</version> </dependency> </dependencies> </plugin> </plugins> </build>
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 }
Category
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>
③运行结果同设置注入一样