控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,能够用来减低计算机代码之间的耦合度。编程
依赖反转在Spring中的体现是依赖注入。 缓存
类经过引用来进行合做,这种引用造成了类之间的依赖,若是这种依赖关系须要对象本身管理,那么代码会产生高度的耦合,致使开发和测试上的困难。若是这种依赖的管理交给框架来作,将简化面向对象系统的复杂性,这就是依赖的反转。框架
容器用来管理应用中的对象和其之间的依赖关系。BeanFactory是对容器的一种抽象,ApplicationContext是其高级实现。函数
总体过程分三步:测试
注意这里只是有Bean的载入,而不是依赖注入,依赖注入发生在第一次经过getBean
向容器获取Bean的时候。spa
在发起getBean
方法时,才会进行依赖注入,建立响应的bean。 设计
依赖注入过程以下:代理
最后建立目标bean实例。code
在IoC初始化后,Bean并无被实际的建立。在getBean
后,才会有bean的实例化,bean的生命周期以下: 对象
建立bean实例->设置bean的属性->调用bean的初始化方法(initialization)->应用可使用bean->容器关闭,销毁bean
上述可知,bean会在使用时才会真正的建立,这防止了建立大量用不到的bean实例。
固然,能够经过设置参数,让bean在IoC容器初始化完毕后就建立。
Bean通常状况下不须要知道IoC容器的存在,有时候则须要。Bean能够实现一些aware接口来得到想要的容器属性。
如ApplicationContextAware,能够在Bean中得到上下文,从而在Bean中使用上下文。
分离关注点使解决特定领域问题的代码从业务逻辑中独立出来。
Advice通知:描述方法调用注入的切面行为。
Pointcut切点:用来描述须要加强的方法集合。
Advisor通知器:将Advice和Pointcut结合起来。
在代理模式中,会设计一个和目标对象有着一致接口的代理对象Proxy,客户端对目标对象的请求都会发送给代理对象,而客户端对此毫无察觉。
该模式使得Proxy有机会对原始的对象的行为进行必定的修改,能够在执行前和执行后分别执行必定的动做,从而加强原始行为。
首先须要定义一些Advisor,这些Advisor定义了须要织入的加强功能,也就是涵盖了通知的内容。而后定义ProxyFactoryBean,它将会生成目标的代理对象。在配置中,ProxyFactoryBean须要知道其代理的目标是谁,代理的接口是哪一个,有哪些Advisor须要添加。
ProxyFactoryBean生成AopProxy过程:
生成代理对象。
AopProxy工做过程:
通知器封装为拦截器:
invoke
方法会根据before、after或者throw将advice的加强行为放置到适当位置。适配器默认是上述的三种,能够自定义adapter注册进来,以生成本身定制的intercepter。