什么是依赖注入?
DI (Dependency Injection):依赖注入是指在 Spring IOC 容器创建对象的过程中,将所依赖的对象通过配置进行注入。我们可以通过依赖注入的方式来降低对象间的耦合度。
在软件工程中,对象之间的耦合度就是对象之间的依赖性。对象之间的耦合越高,维护成本越高,因此对象的设计应使对象之间的耦合越小越好。
在使用依赖注入时,如果注入的是 Bean 对象,那么要求注入的 Bean 对象与被注入的 Bean 对象都需要 Spring IOC 容器来实例化。
依赖注入的方式有通过set方式注入、通过构造方法注入、命名空间,自动注入。
Setter注入
package com.woniu.service.impl;
import com.woniu.dao.UserDAO;
import com.woniu.service.UserService;
public class UserServiceImpl implements UserService {
private UserDAO userDAO;
public UserServiceImpl(){
}
//setter注入
public void setUserDAO(UserDAO userDAO){
this.userDAO = userDAO;
}
@Override
public void save() {
userDAO.save();
System.out.println("UserServiceImpl.save");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
DI 依赖注入
UserDAO userDAO = new UserDAOImpl();
UserService userService = new UserServiceImpl();
这时需要通过setter或者构造器注入
1、setter注入
-->
<bean id="userDAO" class="com.woniu.dao.impl.UserDAOImpl"></bean>
<bean id="userService" class="com.woniu.service.impl.UserServiceImpl">
<!-- 调用UserServiceImpl中的setUserDAO方法
name属性调用的是servoceImpl中的setter方法
ref引用的事userDao
-->
<property name="userDAO" ref="userDAO"></property>
</bean>
</beans>
构造器注入
package com.woniu.service.impl;
import com.woniu.dao.UserDAO;
import com.woniu.service.UserService;
public class UserServiceImpl implements UserService {
private UserDAO userDAO;
public UserServiceImpl(UserDAO userDAO){
this.userDAO = userDAO;
}
@Override
public void save() {
userDAO.save();
System.out.println("UserServiceImpl.save");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
2、构造器注入
-->
<bean id="userDAO2" class="com.woniu.dao.impl.UserDAOImpl"></bean>
<bean id="userService2" class="com.woniu.service.impl.UserServiceImpl">
<!-- 调用UserServiceImpl中的有参构造器 -->
<constructor-arg name="userDAO" ref="userDAO2"></constructor-arg>
</bean>
</beans>
命名空间
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
//添加下面两个命名空间
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
命名空间注入
本质还是setter和构造器注入,只是换了种方式
-->
<bean id="userDAO3" class="com.woniu.dao.impl.UserDAOImpl"></bean>
<bean id="userService3" class="com.woniu.service.impl.UserServiceImpl" c:userDAO-ref="userDAO3" p:userDAO-ref="userDAO3"></bean>
</beans>
自动装配
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
自动装配
byName 按照名字装配,要求bean的id于servcie中声明的对象一致
byType 按照类型装配,要求容器中该类型只能有一个实例
-->
<bean id="userDAO" class="com.woniu.dao.impl.UserDAOImpl"></bean>
<bean id="userService" class="com.woniu.service.impl.UserServiceImpl" autowire="byName"></bean>
</beans>