6、Spring 依赖注入的方式
在Spring中配置一个bean时,如果需要给该bean提供一些初始的值,则需要通过依赖注入方式实现。 依赖注入就是通过Spring将bean所需要的一些参数传递给bean实例对象的过程。
spring的依赖注入有3种方式:
• 使用属性的setter方法注入 ,这是最常用的方式;
• 使用构造器注入;
• 使用Filed注入(用于注解方式)
6.1、属性注入
属性注入是通过setXxx()方法注入Bean的属性值或依赖对象。
注意:使用属性注入,该类一定要有该属性的setter()方法
属性注入方式的优点:
• 具有可选择性
• 灵活性高
属性注入是实际应用中常采用的注入方式
注意:属性注入要求Bean提供一个无参的构造函数,并为需要注入的属性提供对应的Setter方法。 Spring先调用Bean的无参构造函数实例化Bean对象,然后通过反射的方式调用Setter方法注入属性值。
属性注入在XML配置的方式:



常量值


…… 6.2、构造函数注入 构造函数注入是除属性注入之外的另一种常用的注入方式 构造函数注入的方法: • 在类中,可以不用为属性设置setter方法,但是必须要生成该类带参数的构造方法。 • 在配置文件中配置该类的bean,并配置构造器,在配置构造器中用到 节点。 constructor-arg标签属性: • name属性:通过参数名找到参数列表中对应参数; • index属性:通过参数在参数列表中的索引找到参数列表中对应参数,索引从0开始; • type属性:通过参数数据类型找到参数列表中对应参数; • value属性:设置参数列表参数对应的值,用于设定基本数据类型和String类型的数据; • ref属性:如果参数值为非基本数据类型,则可通过ref为参数注入值,其值为另一个bean标签的id或name 属性的属性值; 注意: 对于由于参数数目相同(或参数名相同)而类型不同所引起的潜在配置歧义问题,Spring容器可 以正确启动且不会给出报错信息,它将随机采用一个匹配的构造函数实例化Bean,而被选择的构造函数 可能并不是用户所希望的。因此,必须特别谨慎,以避免潜在的错误。 例:数目相同,名称相同,索引相同,类型不同匹配顺序:构造器的前后顺序的 前顺序 -> 转化匹配成功的顺序如果输入的是指定类型的数据就会匹配指定参数类型的构造器(String包容“万物”),按照前后顺序 前顺序执行 XML转化匹配不了的,就会当做是String类型处理可以指定type属性来消灭歧义 6.3、使用Filed注入(用于注解方式,配合XML配置Bean实现) 1、编写一个IUserDao接口和对应的实现类

package com.gx.dao; 
import com.gx.model.User;
public interface IUserDao {
 boolean insert(User user);
 }
 package com.gx.dao.Impl;import com.gx.dao.IUserDao;
 import com.gx.model.User;public class UserDaoImpl implements IUserDao {
 @Override
 public boolean insert(User user) {
 System.out.println("UserDaoImpl#insert:user = " + user);
 return true;
 }
 }


2、编写IUserService接口和对应的实现类

package com.gx.service;
import com.gx.model.User;
public interface IUserService {
 boolean insert(User user);
 }
 package com.gx.service.Impl;import com.gx.dao.IUserDao;
 import com.gx.service.IUserService;
 import com.gx.model.User;import javax.annotation.Resource;
public class UserServiceImpl implements IUserService {
@Resource
 private IUserDao userDao;@Override
 public boolean insert(User user) {
 return this.userDao.insert(user);
 }
 }


3、配置对应的.xml文件
在 beans 属性内部最上部 添加配置:

context:annotation-config/


6.4、使用Filed注入(全注解方式) 1、编写一个IUserDao接口和对应的实现类

package com.gx.dao; 
import com.gx.model.User;
public interface IUserDao {
 boolean insert(User user);
 }
 package com.gx.dao.Impl;import com.gx.dao.IUserDao;
 import com.gx.model.User;
 import org.springframework.stereotype.Repository;//用于将数据访问层(DAO层)的类标识为Spring中的Bean
 //@Repository(value = “myUserDao”)
 public class UserDaoImpl implements IUserDao {
 @Override
 public boolean insert(User user) {
 System.out.println("UserDaoImpl#insert:user = " + user);
 return true;
 }
 }


2、编写IUserService接口和对应的实现类

package com.gx.service;
import com.gx.model.User;
public interface IUserService {
 boolean insert(User user);
 }
 package com.gx.service.Impl;import com.gx.dao.IUserDao;
 import com.gx.service.IUserService;
 import com.gx.model.User;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;import javax.annotation.Resource;
//通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与
 @Service
 public class UserServiceImpl implements IUserService {//用于对Bean的属性变量,属性的set方法及构造函数进行标注,配合对应的注解处理器完成Bean的自动配置工作
 // @Autowired//(required = false)//getBean(IUserDao.class)
 // @Qualifier(value = “myUserDao”)//与 @Autowired 注解配合使用(相当于给@Autowired加了个条件)
 @Resource
 // @Resource(name = “myUserDao”)//@Repository指定的value,不指定value,默认就是@Repository标识的类名
 private IUserDao userDao;@Override
 public boolean insert(User user) {
 return this.userDao.insert(user);
 }
 }


3、配置对应的.xml文件

<context:component-scan base-package=“com.gx.dao,com.gx.service”/>


4、编写测试方式

package com.gx.test;
import com.gx.model.User;
 import com.gx.service.IUserService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;//指定在Spring的Junit4单元测试环境下运行
 @RunWith(SpringJUnit4ClassRunner.class)
 //配置测试时使用的Spring配置文件,可以多个配置文件
 @ContextConfiguration(locations = {“classpath:对应的xml文件名.xml”})
 public class TestFiledAnnotation {@Autowired
 private IUserService userService;@Test
 public void test() {
 //insert
 User user = new User();
 user.setName(“Insert测试”);
 user.setAge(22);
 userService.insert(user);
 }
 }


6.5、Spring依赖注入的其他方式
1、p名称空间注入
使用之前需要在在Spring的配置文件上添加p名称空间

xmlns:p=“http://www.springframework.org/schema/p”


在.xml文件中的配置


2、复杂类型的注入 编写一个测试类:

package com.gx.model; 
import java.io.Serializable;
 import java.util.*;public class CollectionBean implements Serializable {
/**
 * 数组类型注入
 */
 private Object[] arr;/**
 * list类型注入
 */
 private List list;/**
 * set类型注入
 */
 private Set set;/**
 * map类型注入
 */
 private Map map;/**
 * properties类型注入
 */
 private Properties prop;//后面生成对应的gette

r(),setter()方法,重写toString()方法
}

在.xml文件中配置


值 值 值