我们之前的业务中,用户的需求可能会影响我们原来代码,我们需要根据用户的需求去修改原代码,如果程序的代码量十分巨大,修改一次的成本代价十分昂贵!
原来:
private UserDao userDao=new UserDaoImpl();
我们使用一个set接口实现,已经发生了革命性的变化
private UserDao userDao; //利用set进行动态实现值的注入 public void setUserDao(UserDao userDao) { this.userDao = userDao; }
@Test public void test(){ UserService userService = new UserServiceImpl(); // ((UserServiceImpl) userService).setUserDao(new UserDaoImpl()); 可转变多个实现类 ((UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl()); userService.getUser(); }
之前,程序是主动创建对象,控制权在程序猿手上
使用了set注入后,程序不在具有主动权,而是变成了被动的接受对象
这种思想,从本质上解决了问题,我们程序猿不用再去管理对象的创建了。系统的耦合性大大降低,可以更加专注的在业务的实现上,这是IOC的原型。
控制反转(IOC:Inversion of Control)不是什么技术,而是一种设计思想
DI(依赖注入)是实现IOC的一种方法。
也有人认为DI只是IOC的另一种说法,没有IOC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓的控制反转就是:获得依赖对象的方式反转了
IoC是Spring框架的核心内容,使用多种方式完美的实现IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。
Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从IoC容器中取出需要的对象。
控制反转是一种通过描述(XML或者注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IOC容器,其实现方法就是依赖注入!
新建一个pojo包,在包下创建一个Hello实体类
public class Hello { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Hello{" + "name='" + name + '\'' + '}'; } }
添加Spring配置文件 beans.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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 使用Spring来创建对象 在Spring中这些都称为Bean Hello hell = new Hello() bean = 对象 new Hello() id=变量名 hello class=new Hello() property 相当于给对象中的属性设置一个值 ref:引用Spring容器中创建好的对象id Values: 具体的值,基本数据类型和String --> <bean id="hello" class="com.dada.pojo.Hello"> <property name="name" value="Spring"></property> </bean> </beans>
测试代码
@Test public void test(){ //获取Spring的上下文对象 ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml"); //我们的对象现在都在Spring中管理了。我们要使用直接去里面取出来就可以了 Hello hello = (Hello) context.getBean("hello"); System.out.println(hello); }
Hello对象是谁创建的?