1.IOC介绍
控制反转IOC是一种思想,可以降低耦合度提高程序拓展力,反转的是将创建对象的权力以及对象与对象之间的维护权交出去给第三方容器负责,实现控制反转思想主要采用的是依赖注入DI
依赖注入的意思是Spring创建对象的过程中,将对象的依赖属性通过配置进行注入
IOC在Spring的实现主要是两种方式 : BeanFactory 以及 ApplicationContext ( 配置文件 )
BeanFactory : 是 ApplicationContext 的父接口 ,Spring 的核心容器, 主要的 ApplicationContext 实现都【组合】了它的功能, 意味着BeanFactory是ApplicationContext的成员变量
表面上只有 getBean Bean 的生命周期的各种功能, 都由它的实现类提供
ApplicationContext 组合并扩展了 BeanFactory 的功能 国际化、通配符方式获取一组 Resource 资源、整合 Environment 环境、事件发布与监听 增加了一种代码之间解耦途径
Bean的初始化时机不同,原始BeanFactory是在首次调用getBean时才进行Bean的创建,而ApplicationContext则是配置文件加载,容器一创建就将Bean都实例化并初始化好。 BeanFactory是Spring的早期接口,称为Spring的Bean工厂
,ApplicationContext是后期更高级接口,称之为Spring容器
; BeanFactory需要手动注册,而ApplicationContext则是自动注册
2. IOC 的使用
基于XML管理Bean : setter注入 ,构造注入 (根据类型获取的时候,指定类型的bean只能是一个)
如果组件实现了接口,根据接口类型能够获取bean,但是前提必须是bean唯一 如果一个接口有很多实现类,都配置了bean,根据接口类型不能获取bean,因为bean不唯一
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");//类型获取
HelloWorld bean = ac.getBean(HelloWorld.class);
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");//id和类型获取
HelloWorld bean = ac.getBean("helloworld", HelloWorld.class);
<bean id="studentOne" class="com.xszx.bean.Student">
<!-- property标签:通过组件类的setXxx()方法给组件对象设置属性 -->
<!-- name属性:指定属性名(这个属性名是getXxx()、setXxx()方法定义的,和成员变量无关) -->
<!-- value属性:指定属性值 -->
<property name="id" value="1001"></property>
<property name="name" value="张三"></property>
<property name="name"><null /></property>//null值注入,小于号也不能随意使用
</bean>
<!-- index 属性:指定参数所在位置的索引(从0开始) -->
<!-- name 属性:指定参数名 -->
<bean id="studentTwo" class="com.xszx.bean.Student">
<constructor-arg value="1002"></constructor-arg>
<constructor-arg value="李四"></constructor-arg>
</bean>
特殊值处理 :<null/>,小于号 对象、集合、map、list、引用集合 p命名空间 引入外部属性文件<context:property-placeholder location="classpath:jdbc.properties"/>
bean作用域 :scop属性指定,有单例(默认singleton)和多例(prototype) bean生命周期 :
bean对象创建、bean对象设置属性 bean后置处理器(初始化之前) bean对象初始化,指定初始化方法 bean后置处理器(初始化之后) bean对象就绪使用 bean对象销毁,指定销毁方法 IOC容器关闭
FactoryBean :获取 bean 的时候得到的并不是 class 属性中配置的这个类的对象,而是getObject() 方法的返回值 基于xml的自动装配 ,autowire属性设置 : byType 和 byName
基于注解管理实现自动装配Bean步骤 : 引入依赖--开启组件扫描--使用注解定义 Bean--依赖注入
开启扫描组件 <context:component-scan base-package="com.xszx"/>
,记得在 XML 配置的一级标签 <beans> 中添加 context 相关的约束。 @Autowired 注解进行属性注入,默认根据类型装配 。【默认是 byType】,
构造方法、普通方法、形参、属性、注解上 ; 当带参数的构造方法只有一个,@Autowired 注解可以省略。 如果要根据名称注入的话,需要配合 @Qualifier 注解一起使用。 注解是Spring框架自己的
@Resource 注解进行属性注入,默认根据名称装配也就是byName。
未指定name时,就会将属性名作为name,通过name找不到就会自动通过byType装配。 属性上,setter方法上 属于JDK拓展包,需要额外引入依赖使用