1. 依赖注入:
1.1 set注入:
基于set方法实现的, 底层会通过反射机制调用属性对应的set方法然后给属性赋值
这种方式要求属性必须对外提供set方法
set注入的核心实现原理: 通过反射机制调用set方法来给属性赋值, 让俩个对象之间产生关系
// xml
<!-- 配置userDao -->
<bean id="userDaoBean" class="com.powernode.bean.UserDao"/>
<!-- 配置vipDao -->
<bean id="vipDaoBean" class="com.powernode.bean.VipDao"/>
<!-- 配置User -->
<bean id="userBean" class="com.powernode.bean.User">
<!-- 想让Spring调用对应的set方法, 需要配置property标签
name属性怎么知道值: set方法的方法名, 去掉set, 然后把剩下的首字母小写
ref翻译为引用, ref后面指定的是要注入的bean的id -->
<property name="userDao" ref="userDaoBean"/>
<property name="vipDao" ref="vipDaoBean"/>
</bean>
// User类
public class User {
private UserDao userDao;
private VipDao vipDao;
public void setVipDao(VipDao vipDao) {
this.vipDao = vipDao;
}
// set注入, 必须提供一个set方法
// Spring容器会调用这个set方法, 来给userDao属性赋值
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void saveUser(){
userDao.saveId();
vipDao.save();
}
}
// @Test
public void setDI(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
User userBean = ctx.getBean("userBean", User.class);
userBean.saveUser();
}
1.2 构造注入:
核心原理: 调用构造方法来给属性赋值
set注入是在对象构建好了之后调用set方法来完成赋值, 构造注入是在对象实例化的过程中赋值的
// xml
<bean id="userDaoBean" class="com.powernode.bean.UserDao"/>
<bean id="vipDaoBean" class="com.powernode.bean.VipDao"/>
<!-- 构造注入3种方式 -->
<bean id="customerBean" class="com.powernode.bean.Customer">
<!-- 指定构造方法的第一个参数, 下标是0 -->
<constructor-arg index="0" ref="userDaoBean"/>
<!-- 指定构造方法的第二个参数, 下标是1 -->
<constructor-arg index="1" ref="vipDaoBean"/>
<!-- 根据构造方法参数的名字进行注入 -->
<constructor-arg name="userDao" ref="userDaoBean"/>
<constructor-arg name="vipDao" ref="vipDaoBean"/>
<!-- 这种方式实际上是根据类型进行注入, Spring会自动根据类型来判断把ref注入给哪个参数-->
<constructor-arg ref="userDaoBean"/>
<constructor-arg ref="vipDaoBean"/>
</bean>
// Customer类
public class Customer {
private UserDao userDao;
private VipDao vipDao;
public Customer(UserDao userDao, VipDao vipDao) {
this.userDao = userDao;
this.vipDao = vipDao;
}
public void insert(){
userDa