Ioc的来由与Ioc基本概念
传统的对象创建
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserMysqlDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
存在的问题:
当接口调用者想要改变成通过Oracle去执行数据查询时,我们程序员需要改变业务层代码,即:
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserOracleDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
这样就会造成我们程序员需要根据不同的接口调用者想要使用的查询方式去修改业务层代码,每次变动 , 都需要修改大量代码 . 这种设计的耦合性太高, 牵一发而动全身。此时对象的创建权在我们程序员手中
Ioc的对象创建本质
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
解决的问题:
现在把创建对象主动权交给了调用者 . 程序不用去管怎么创建,怎么实现 。 它只负责提供一个对外公开的setUserDao接口去给调用者选择创建想要的对象类型。
这种思想 , 从本质上解决了问题 , 我们程序员不再去管理对象的创建了 , 更多的去关注业务的实现 . 耦合性大大降低 . 这也就是IOC的原型 !
Ioc的概念
控制反转IoC,是一种设计思想,DI(依赖注入)是实现IoC的一种方法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给spring容器。
IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。
Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从Ioc容器中取出需要的对象。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。
通过Ioc生产和获取对象
public class UserServiceImpl implements UserService {
private String name;
private UserDao userDao;
public String getName() {
return name;
}
// 利用set进行动态实现值的注入
public void setName(String name) {
this.name = name;
}
public UserDao getUserDao() {
return userDao;
}
// 利用set进行动态实现值的注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public String toString() {
return "UserServiceImpl{" +
"name='" + name + '\'' +
'}';
}
public void getUser() {
userDao.getUser();
}
}
bean配置文件
<?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来创建对象,在spring这些都称为bean
类型 变量名 = new 类型();
User user = new User();
在bean中对应传统对象创建:
id = 变量名
class = new 的对象
property 相当于给对象中的属性设置一个值
ref:引用Spring容器中创建好的对象
value:具体的值,基本数据类型
-->
<bean id="userDaoImpl" class="com.dao.impl.UserDaoImpl"/>
<bean id="userMysqlDaoImpl" class="com.dao.impl.UserMysqlDaoImpl"/>
<bean id="userServiceImpl" class="com.service.impl.UserServiceImpl">
<property name="name" value="zhangsan"/>
<property name="userDao" ref="userMysqlDaoImpl"/>
</bean>
</beans>
测试:
public class myTest {
public static void main(String[] args) {
// 获取ApplicationContext,拿到Spring的容器
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// 获取具体的bean
UserService userService = (UserServiceImpl)context.getBean("userServiceImpl");
userService.getUser();
System.out.println(userService.toString());
}
}
输出:
mysql查询方式
UserServiceImpl{name='zhangsan'}
控制: 谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建,使用spring后,对象是由spring来创建
反转: 程序本身不创建对象,而变成被动接收对象
依赖注入: 就是利用set方法来进行注入
IOC是一种编程思想,由主动的编程变成被动的接收。
现在程序中不用再改动, 要实现不同的操作 , 只需要在xml配置文件中进行修改 , 所谓的IoC: 对象由Spring 来创建 , 管理 , 装配 !