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