当某个Java对象(调用者)需要调用另一个Java对象(被调用者,即被依赖对象)时:
在传统模式下,调用者通常会采用“new被调用者”的代码方式来创建对象,
这种方式会导致调用者与被调用者之间的耦合性增加,不利于后期项目的升级和维护
在使用了Spring框架之后,对象的实例不再由调用者来创建,
而是由spring容器来创建,spring容器会负责控制程序之间的关系,
而不是由调用者的程序代码直接控制。
这些,控制权由应用代码转移到了spring容器,控制权发生了反转,这就是spring的控制反转。
从spring容器的角度来看,spring容器负责将被依赖对象赋值给调用者的成员变量,
这相当于为调用者注入了它依赖的实例,这就是spring的依赖注入。
依赖注入的两种实现方式,
属性setter方法注入
构造方法注入
//定义一个UserService 接口
public interface UserService {
public void say();
}
//编写一个UserDaoImpl 实现类
public class UserDaoImpl implements UserDao{
@Override
public void say() {
System.out.println("userdao说Hello World!!");
}
}
//在applicationContext.xml中实例化Bean
<!-- 添加一个id为userService的实例 -->
<bean id="userService" class="com.daier.ioc.UserServiceImpl">
<!-- 将id=userDao的Bean实例注入到userService实例中 -->
<property name="userDao" ref="userDao" />
</bean>
//编写测试类TestDI
public static void main(String[] args) {
//1.初始化spring容器,加载配置文件
@SuppressWarnings("resource")
ApplicationContext applicationcontext=
new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取UserService实例
UserService userService=
(UserService) applicationcontext.getBean("userService");
//调用实例中的say方法
userService.say();
/**
* userdao说Hello World!!
* userService说 Hello World!!
*/
}
<!-- 将id=userDao的Bean实例注入到userService实例中 -->
<property name="userDao" ref="userDao" />
<property>时<bean>元素的子元素
用于调用Bean实例中的setUserDao()方法完成属性赋值,从而实现依赖注入。
name属性表示bean实例中的相应的属性名,ref属性用于指定其属性值