1、IOC推导
public class UserServiceImplimplements UserService{
//第一种,直接new对象,每次新增都需要修改源代码
//private UserDao userDao = new UserMysqlDaoImpl();
//private UserDao userDao = new UserDaoImpl();
//第二种,set动态注入,不用修改源代码,注入的时候修改
private UserDaouserDao;
public void setUserDao(UserDao userDao) {this.userDao = userDao;}
public void getUser(){userDao.getUser(); }
}
public class MyTest {
public static void main(String[] args) {
UserServiceImpl service =new UserServiceImpl();
//service.setUserDao(new UserMysqlDaoImpl());
service.setUserDao(new UserOracleDaoImpl());
service.getUser();
}
}
根据用户需求修改源代码,代码量大的话,修改工作量大。使用set接口实现,革命性变化。
之前,程序是主动的,控制权在程序猿手上。使用set之后,程序不再具有主动性,而是被动接收对象。
这种思想从根本上解决问题,程序猿不用在管理对象的创建了,系统耦合性降低,专注业务实现。
2、IOC本质
xml方式配置Bean,Bean的定义和实现分离,而注解方式两者合一,Bean的定义信息直接以注解的形式定义在实现类中从而达到零配置的目的。
控制反转是一种通过描述(xml或注解)并通过第三方生产或获取特定对象的方式。Spring中实现控制反转的是IOC容器,其实现方式是依赖注入(DI)。
3、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">
<!--spring创建对象Hello hello = new Hello();
id 变量名 class new的对象 property 给对象属性设置值-->
<bean id="hello" class="com.kuang.pojo.Hello">
<property name="name" value="Spring">
</bean>
<!--spring创建对象 ref 引用的对象 value 基本类型-->
<bean id="mysqlDaoImpl" class="com.kuang.dao.UserMysqlDaoImpl"/>
<bean id="oracleDaoImpl" class="com.kuang.dao.UserOracleDaoImpl"/>
<bean id="userService" class="com.kuang.service.UserServiceImpl">
<property name="userDao" ref="mysqlDaoImpl">
</bean>
</beans>
spring创建对象,对象属性在spring容器中设置,这个过程叫做控制反转。
控制指谁来控制对象创建,传统对象由程序本身创建,使用spring后由spring创建。
反转指程序本身不创建对象,变成被动接收对象。
依赖注入就是set方法进行注入的。
调用
//spring上下文对象
ApplicationContext applicationContext =new ClassPathXmlApplicationContext("beans.xml");
//spring中获取对象
Hello hello = (Hello) applicationContext.getBean("hello");
System.out.println(hello);
IOC就是对象由spring创建、管理、装配
以上参考,kuangshen视频。