spring——IoC控制反转
Posted 黄大姐の老公
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring——IoC控制反转相关的知识,希望对你有一定的参考价值。
遇见,拉着你的手,无论是在哪里,我都感觉像是朝天堂奔跑,你相信么?
Spring IOC控制反转
1、概述
Spring有IOC和AOP两个核心。其中IOC就是我们说的控制反转,也就是将创建对象并生命周期管理过程交给Spring处理,在开发中不再需要关注对象的创建和生命周期的管理,需要时由Spring框架提供,这个由Spring管理创建对象和生命周期的机制称为控制反转。创建对象的权力转给框架,他帮我们创建,我们不再使用new关键字来创建对象
2、原理
2.1 创建过程
在初始化一个Spring容器时,Spring会解析Spring的配置文件(applicationContext.xml),从上到下解析到
2.2 获取对象过程
当通过context.getBeans("id值")
方法来从容器中获取对象时,根据id从内置的map中寻找是否有匹配的键值,如果有则返回对象,如果没有则抛出异常
注意:默认情况下,多次获取同一id的bean对象得到的是同一个对象(默认情况下创建的对象是单例的,如果需要多例可以在该标签中设置多例)。如果使用一个类配置多个
3、IOC本质
控制反转IOC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IOC的一种方式,也有人认为DI只是IOC的另一种说法。没有IOC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的母的
控制反转是一种通过描述(XML或注解)并通过第三方去生产和获取特定对象的方式。在Spring中实现控制反转的是IOC容器,其实现方式是依赖注入(Dependency Injection,DI)
4、HelloSpring
思考:
- Hello对象是由谁创建的【hello对象是由Spring创建的】
- Hello对象的属性是怎么设置的【hello对象的属性是由Spring容器设置的】
这个过程就叫控制反转:
- 控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的
- 反转:程序本身不创建对象,而变成被动的接收对象
依赖注入:就是利用set方法来进行注入的
IOC是一种编程思想,由主动的编程变成被动的接收
通过newClassPathXmlApplicationContext浏览底层源码
<?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="mysqlImpl" class="com.xiaohua.dao.impl.UserDaoMySqlImpl"/>
<bean id="OracleImpl" class="com.xiaohua.dao.impl.UserDaoOracleImpl"/>
<bean id="ServiceImpl" class="com.xiaohua.service.impl.UserServiceImpl">
<!--注意: 这里的name并不是属性 , 而是set方法后面的那部分 , 首字母小写-->
<!--引用另外一个bean , 不是用value 而是用 ref-->
<property name="userDao" ref="OracleImpl"/>
</bean>
</beans>
测试:
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserServiceImpl serviceImpl = (UserServiceImpl) context.getBean("ServiceImpl");
serviceImpl.getUser();
}
OK,到了现在,我们彻底不用在程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的IOC,一句话搞定:对象由Spring来创建、管理、装配
5、IOC创建对象的方式
使用无参构造创建对象,默认
假设我们要使用有参构造创建对象
下标赋值
<!--第一种,下标赋值--> <bean id="user" class="com.xiaohua.pojo.User"> <constructor-arg index="0" value="黄大姐你好"/> </bean>
通过类型赋值
<!--第二种方式:通过类型创建,不建议使用--> <bean id="user" class="com.xiaohua.pojo.User"> <constructor-arg type="java.lang.String" value="黄二姐"/> </bean>
通过属性名赋值
<!--第三种,直接通过参数名实现赋值--> <bean id="user" class="com.xiaohua.pojo.User"> <constructor-arg name="name" value="黄三姐"/> </bean>
总结:在配置文件加载的时候,容器中管理的对象就已经初始化了
以上是关于spring——IoC控制反转的主要内容,如果未能解决你的问题,请参考以下文章