拉勾笔记02(1)Spring IOC和AOP应用篇
拉勾笔记02(1)Spring IOC和AOP应用篇
1、应用
1.1、什么是IOC和DI
1.1.1、IOC
inversion of control(控制反转),控制反转是一个技术思想,而不是技术实现。
无需自己去new对象,而是由IOC容器去帮助我们实例化并管理,当需要对象的时候,直接去问IOC要即可。
1.1.2、AOP
AOP(Aspect Oriented Programming)面向切面编程,其实是OOP的延续。AOP的出现主要是解决在不改变原有业务逻辑情况下,增强横切逻辑代码。
切:指的是横切逻辑,原有业务逻辑代码不动,只操作横切代码逻辑。
面:横切逻辑往往要影响的是很多方法,每个方法如同一个点,多个点构成一个面。
1.2、BeanFactory与ApplicationContext区别
如上图的继承图可知,BeanFactory是Spring框架中IOC容器的顶层接口,用来定义一些基础和规范。而ApplicationContext是它的一个子接口,所以ApplicationContext是具备BeanFactory提供的全部功能。
1.3、Bean详解
1.3.1、xml方式
作用范围
如果使用xml方式创建bean,bean标签中会有scope属性用来声明作用范围
<!--配置service对象-->
<bean id="transferService"
class="com.lagou.service.impl.TransferServiceImpl" scope="singleton">
</bean>
scope中可选的属性值有如上几种
- 单例模式:singleton(ioc容器中仅有单例bean存在)
- 多例模式:prototype(每次从ioc容器中获取bean的时候,都会返回一个新实例)
- 多例模式:request(每次Http请求会创建一个新的实例)
- 多例模式:session(同一Http Session共享一个bean)
Bean标签属性
在基于xml的IoC配置中,bean标签是最基础的标签。它表示了IoC容器中的⼀个对象。换句话
说,如果⼀个对象想让spring管理,在XML的配置中都需要使⽤此标签配置,Bean标签的属性如
下:
- id属性: ⽤于给bean提供⼀个唯⼀标识。在⼀个标签内部,标识必须唯⼀。
- class属性:⽤于指定创建Bean对象的全限定类名。
- name属性:⽤于给bean提供⼀个或多个名称。多个名称⽤空格分隔。
- factory-bean属性:⽤于指定创建当前bean对象的⼯⼚bean的唯⼀标识。当指定了此属性之后,class属性失效。
- factory-method属性:⽤于指定创建当前bean对象的⼯⼚⽅法,如配合factory-bean属性使⽤,则class属性失效。如配合class属性使⽤,则⽅法必须是static的。
- scope属性:⽤于指定bean对象的作⽤范围。通常情况下就是singleton。当要⽤到多例模式时,可以配置为prototype。
- init-method属性:⽤于指定bean对象的初始化⽅法,此⽅法会在bean对象装配后调⽤。必须是⼀个⽆参⽅法。
- destory-method属性:⽤于指定bean对象的销毁⽅法,此⽅法会在bean对象销毁前执⾏。它只能为scope是singleton时起作⽤。
DI依赖注入
- 构造器注入:⽤带参构造函数实现对类成员的数据赋值
- set方法注入:它是通过类成员的set⽅法实现数据的注⼊
1.4、高级特性
1.4.1、延迟加载
ApplicationContext容器的默认行为是启动服务时将所有singleton bean提前进行实例化。提前实例化意味着作为初始化的一部分,ApplicationContext实例会创建并配置所有的singleton bean。
<bean id="testBean" class="cn.lagou.LazyBean" />
该bean默认的设置为:
<bean id="testBean" calss="cn.lagou.LazyBean" lazy-init="false" />
如果不想让singleton bean在ApplicationContext初始化时候提前实例化,那么可将bean设置为延迟实例化
<bean id="testBean" calss="cn.lagou.LazyBean" lazy-init="true" />
1.4.2、 FactoryBean和BeanFactory
BeanFactory是容器的顶级接口,定义容器的一些的基础行为,是负责生产和管理Bean的一个工厂
Spring中Bean有两种,一种是普通bean,一种是工厂Bean(FactoryBean),FactoryBean可以生成某一个类型的Bean实例,这里也就是说它的作用主要是自定义Bean的创建过程
1.4.3、SpringBean的生命周期
Spring容器启动的过程中,会将Bean解析为Spring内部的BeanDefinition结构
由上图BeanDefinition所有方法结构可知,BeanDefinition作用是将Bean的定义信息存储在BeanDefinition相应的属性中,例如类名、属性、构造函数参数列表等等,后续对Bean的操作就直接对BeanDefinition进行即可。
2、源码
因源码篇幅较长,单独开一篇