目录
一、控制反转
二、依赖注入
三、set注入
四、构造注入
一、控制反转
1、控制反转是一种思想
2、控制反转是为了降低程序耦合度,提高程序扩展力,达到OCP原则,达到DIP原则。
3、控制反转主要有:①、将对象的创建权力交出去,交给第三方容器负责。②、将对象和对象之间的关系的维护权力交出去,交给第三方容器负责。
4、控制反转是思想,依赖注入是实现。
二、依赖注入
1、依赖注入实现了控制反转的思想
2、Spring通过依赖注入的方式来完成Bean管理。
3、Bean管理:Bean对象的创建,以及Bean对象中属性的赋值。
4、依赖注入:①、依赖指的是对象和对象之间的关联关系。②、注入指的是一种数据传递行为,通过注入行为让对象和对象产生关系。
5、依赖注入常见实现方式:①、set注入,②、构造注入
三、set注入
set注入,基于set方法实现的,底层通过反射机制调用属性对应的set方法然后给属性赋值,这种方式要求属性必须对外提拱set方法。
public class UserDao {
private static final Logger logger = LoggerFactory.getLogger(UserDao.class);
public void insert(){
logger.info("数据库正在报存用户数据");
}
}
public class UserService {
private UserDao userDao;
//这里选择使用系统自动生成的set方法,符合java规范,也可以自定义,但
//方法名必须要set开头
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void saveUser(){
userDao.insert();
}
}
spring的配置文件
<?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="userDaoBean" class="com.cjc.spring6.dao.UserDao"/>
<bean id="userServiceBean" class="com.cjc.spring6.service.UserService">
<!--spring要调用对应的set方法,需要配置property标签-->
<!--name:set方法名,去掉set-->
<!--ref:指定要注入的bean的id-->
<property name="userDao" ref="userDaoBean"/>
</bean>
</beans>
测试类:
public class UserTest {
@Test
public void getUser(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
UserService userServiceBean = applicationContext.getBean("userServiceBean", UserService.class);
userServiceBean.saveUser();
}
}
打印结果:
四、构造注入
通过构造方法给属性赋值
public class UserStructureService {
private UserDao userDao;
public UserStructureService(UserDao userDao) {
this.userDao = userDao;
}
public void save(){
userDao.insert();
}
}
<?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="userDao" class="com.cjc.spring6.dao.UserDao"/>
<!--根据索引下标配置-->
<bean id="userStrService1" class="com.cjc.spring6.service.UserStructureService">
<!--constructor-arg:构造方法注入
index:指定参数下标,按构造方法中的参数依次往后
ref:指定注入bean的id-->
<constructor-arg index="0" ref="userDao"/>
</bean>
<!--根据参数名配置-->
<bean id="userStrService2" class="com.cjc.spring6.service.UserStructureService">
<!--constructor-arg:构造方法注入
name:指定参数名
ref:指定注入bean的id-->
<constructor-arg name="userDao" ref="userDao"/>
</bean>
<!--spring自行判断配置-->
<bean id="userStrService3" class="com.cjc.spring6.service.UserStructureService">
<!--不指定下标,也不指定参数名,由spring自己判断-->
<constructor-arg ref="userDao"/>
</bean>
</beans>
测试类:
@Test
public void getUserStr(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring1.xml");
UserStructureService userStrService = applicationContext.getBean("userStrService3", UserStructureService.class);
userStrService.save();
}