Spring的依赖注入(DI)
- 依赖注入,给对象设置属性,之前我们需要自己去创建对象,才能调用,现在交给spring创建,并且使用DI注入,直接拿来用,程序员可以更加的关注业务代码。
- 给对象设置属性的方法:
- 构造器
- set方法
- 1spring也是通过构造器以及set方法来实现属性设置
2.构造器依赖注入
- 创建Mapper接口
public interface UserMapper {
public void insert(User user);
public int delete(Long id);
}
- 创建Mapper实现类
public class UserMapperImpl implements UserMapper{
@Override
public void insert(User user) {
System.out.println("保存用户信息");
}
@Override
public int delete(Long id) {
System.out.println("删除ID="+id+"用户信息");
return 1;
}
}
- 将mapper交给容器管理
<bean id="UserMapper" class="com.zhy.mapper.UserMapperImpl"></bean>
- 创建Service接口
public interface UserService {
public void insert(User user);
public int delete(Long id);
}
- 创建Service接口实现类
public class UserServiceImpl implements UserService{
@Override
public void insert(User user) {
}
@Override
public int delete(Long id) {
return 0;
}
}
- service交给容器管理
<bean id="UserService" class="com.zhy.service.UserServiceImpl"></bean>
如果没有依赖注入,直接调用会出现异常报错。
3.配置构造器注入属性
- 配置Service构造器
public class UserServiceImpl implements UserService{
private UserMapper userMapper;
public UserServiceImpl(UserMapper userMapper){
this.userMapper =userMapper;
}
@Override
public void insert(User user) {
userMapper.insert(user);
}
@Override
public int delete(Long id) {
return userMapper.delete(id);
}
}
- 配置xml
<!--配置service-->
<bean id="UserService" class="com.zhy.service.UserServiceImpl">
<constructor-arg name="userMapper" ref="UserMapper"></constructor-arg>
</bean>
<!--配置mapper-->
<bean id="UserMapper" class="com.zhy.mapper.UserMapperImpl"></bean>
- 注意
- name :构造器参数名称
- ref :配置文件中其他bean的名称
4.构造器配置多个参数 引用数据类型
public class UserServiceImpl implements UserService{
private UserMapper userMapper;
private StudentMapper studentMapper;
public UserServiceImpl(UserMapper userMapper,StudentMapper studentMapper){
this.userMapper =userMapper;
this.studentMapper = studentMapper;
}
@Override
public void insert(User user) {
userMapper.insert(user);
}
@Override
public int delete(Long id) {
System.out.println("学生");
return studentMapper.delete(id);
}
}
- 配置XML
<!--配置service-->
<bean id="UserService" class="com.zhy.service.UserServiceImpl">
<constructor-arg name="userMapper" ref="UserMapper"></constructor-arg>
<constructor-arg name="studentMapper" ref="StudentMapper"></constructor-arg>
</bean>
<!--配置mapper-->
<bean id="UserMapper" class="com.zhy.mapper.UserMapperImpl"></bean>
<bean id="StudentMapper" class="com.zhy.mapper.StudentMapperImpl"></bean>
5.构造器配置多个参数 基本数据类型
public class UserServiceImpl implements UserService{
private UserMapper userMapper;
private StudentMapper studentMapper;
private String name;
private int age;
public UserServiceImpl(int age, String name,UserMapper userMapper,StudentMapper studentMapper){
this.userMapper =userMapper;
this.studentMapper = studentMapper;
this.name=name;
this.age=a;
}
- xml配置
<!--配置service-->
<bean id="UserService" class="com.zhy.service.UserServiceImpl">
<constructor-arg name="userMapper" ref="UserMapper"></constructor-arg>
<constructor-arg name="studentMapper" ref="StudentMapper"></constructor-arg>
<constructor-arg type="int" value="178" ></constructor-arg>
<constructor-arg type="java.lang.String" value="sy"></constructor-arg>
</bean>
<!--配置mapper-->
<bean id="UserMapper" class="com.zhy.mapper.UserMapperImpl"></bean>
<bean id="StudentMapper" class="com.zhy.mapper.StudentMapperImpl"></bean>
这种方式会出现属性覆盖的问题,解决方式删除type,添加index属性
<bean id="UserService" class="com.zhy.service.UserServiceImpl">
<constructor-arg name="userMapper" ref="UserMapper"></constructor-arg>
<constructor-arg name="studentMapper" ref="StudentMapper"></constructor-arg>
<constructor-arg index="0" value="178" ></constructor-arg>
<constructor-arg index="1" value="666" ></constructor-arg>
<constructor-arg type="java.lang.String" value="sy"></constructor-arg>
</bean>
<!--配置mapper-->
<bean id="UserMapper" class="com.zhy.mapper.UserMapperImpl"></bean>
<bean id="StudentMapper" class="com.zhy.mapper.StudentMapperImpl"></bean>
public class UserServiceImpl implements UserService{
private UserMapper userMapper;
private StudentMapper studentMapper;
private String name;
private int age;
private int a;
public UserServiceImpl(int age, int a,String name,UserMapper userMapper,StudentMapper studentMapper){
this.userMapper =userMapper;
this.studentMapper = studentMapper;
this.name=name;
this.age=age;
this.a=a;
}
}
这里需要注意,constructor-arg中的index 和 UserServiceImpl 类的构造方法参数一一对象。写的顺序可以颠倒,但是index的值和vlaue要一一对应。
setter属性注入
- 创建Mapper
userMapper接口
public interface userMapper {
int delete(int id);
}
userMapperImpl
public class userMapperImpl implements userMapper{
@Override
public int delete(int id) {
return 1;
}
}
- 创建service
public interface userService {
String delete(User user);
}
service接口实现类
public class userServiceImpl implements userService{
private userMapper userMapper;
private String s;
private int i;
public void setUserMapper(userMapper userMapper) {
this.userMapper = userMapper;
}
public void setS(String s) {
this.s = s;
}
public void setI(int i) {
this.i = i;
}
@Override
public String delete(User user) {
int i = userMapper.delete(user.getId());
if (i == 1){
System.out.println("ID :"+i+"----"+s+"删除了"+user.getName());
System.out.println("用户ID : "+user.getId()+"-------删除用户"+user.getName()+"成功!");
return "删除成功!";
}
return "删除失败!";
}
}
- 创建User
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User() {
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
}
- 配置XML文件
<?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.xsd">
<!--set属性注入-->
<bean id="userService" class="com.zhy.setter.service.userServiceImpl">
<!--set注入引用类型-->
<property name="userMapper" ref="userMapper"></property>
<!--set注入基本数据类型-->
<property name="s" value="小胡"></property>
<property name="i" value="18"></property>
</bean>
<bean id="userMapper" class="com.zhy.setter.mapper.userMapperImpl"></bean>
</beans>
- 创建测试类,获取容器bean
public class SetTest {
@Test
public void test1(){
ApplicationContext context =new ClassPathXmlApplicationContext("setbeans.xml");
userService userService = (userService) context.getBean("userService");
User user = new User(10,"小虎");
userService.delete(user);
}
}
-
setter 注入总结
- 对于引用数据类型来说使用
<property name="" ref=""></property>
- 对于简单数据类型
<property name="" value=""></property>**
- 对于引用数据类型来说使用
集合注入
- List
- Set
- Map
- Array
- Properties
1.添加CollectiosDemo类
public class CollectionsDemo {
private List<Integer> list;
private Map<String,String> map;
private Set<String> set;
private Properties properties;
private int[] arr;
public void print(){
System.out.println("list:"+list);
System.out.println("map:"+map);
System.out.println("set:"+set);
System.out.println("properties:"+properties);
System.out.println("arr:"+ Arrays.toString(arr));
}
public void setList(List<Integer> list) {
this.list = list;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public void setArr(int[] arr) {
this.arr = arr;
}
}
- 配置XML
<?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.xsd">
<bean id="collectionsDemo" class="com.zhy.Collections.CollectionsDemo">
<!-- 注入 list-->
<property name="list">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
<property name="map">
<map>
<entry key="name" value="sy"/>
<entry key ="age" value="18"/>
</map>
</property>
<property name="set">
<set>
<value>just some string</value>
<value>just string</value>
</set>
</property>
<property name="properties">
<props>
<prop key="url">@example.org</prop>
<prop key="user">root</prop>
<prop key="password">123456</prop>
</props>
</property>
<property name="arr">
<array>
<value>2</value>
<value>2</value>
<value>2</value>
</array>
</property>
</bean>
</beans>
如果不提供setter 方法会出现如下错误
- 容器获取bean
public class test {
@Test
public void test(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("co.xml");
CollectionsDemo collectionsDemo = (CollectionsDemo) context.getBean("collectionsDemo");
collectionsDemo.print();
}
}
测试输出结果