一、
1.什么是IOC与DI
IOC:控制反转,将对象的创建权反转给了Spring。
DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。
二、IOC——控制反转
1.为什么要使用IOC呢?
我们来看代码:
接口:
实现类:
传统使用方式:通过new关键字来创建对象。
这里不难看出,代码之间具有很高的耦合度。如果我们需要更换接口的实现类,例如 UserDao u = new UserDaoHibernateImpl(),那就需要更改很多代码!
(左边是问题,右边是解决方案)如图:右边是IOC的底层实现原理
我们把所有的实现类都交给Spring管理,我们需要时直接从Spring容器中获取。目的就是为了实现代码之间的解耦合,使得代码具有高扩展性。
2.如何让Spring来管理实现类呢?
创建applicationContext.xml文件,这是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="userDao" class="com.spring.demo1.UserDaoImpl">
</bean>
</beans>
3.重新编写测试类
@Test
public void demo2() {
//解析xml文件,创建Spring工厂
ApplicationContext applicationContext =new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao)applicationContext.getBean("userDao");
userDao.save();
}
三、DI ——依赖注入
1.什么是依赖?
Class A{}
Class B{
private Spring name;
public void xxx(A a){}
}
这里的 Class B 就依赖了属性 name 和 ClassA.
2.更改实现类,让其有依赖关系
public class UserDaoImpl implements UserDao {
private String name;//UserDaoImpl依赖了一个字符串名字为name的属性。
public void setName(String name) {
this.name = name;
}
@Override
public void save() {
System.out.println("开始执行save()");
}
}
传统的设置值:
@Test
public void demo1() {
UserDao u =new UserDaoImpl();
//u.set("XXX")这里是错误的,因为UserDao 没有set方法 所以要 用 UserDaoImpl u= UserDaoImpl();
u.save();
System.out.println();
}
3.更改applicationContext.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="userDao" class="com.spring.demo1.UserDaoImpl">
<property name="name" value="张三"></property>
</bean>
</beans>
测试:
张三 出来了。
我们在创建实例的过程中,Spring的DI就帮我们把UserDaoImpl类的属性name注入 张三。