最近有朋友问到Spring两大特性IOC(控制反转,依赖注入)与AOP(面向切面编程)的原理,希望我能解读一下。
(一). IOC
控制反转(IOC)与依赖注入(DI)是同一个概念,目的在于降低系统偶尔,将类的实例化工作转交给Spring代理,主要用到的设计模式为工厂模式,通过Java反射机制实现类的自动注入。
方式:
1)接口注入;2)Construct注入;3)Setter注入
目的:
1)脱开,降低类之间的耦合;
2)倡导面向接口编程,实施以来倒换原则;
3)提高系统可插入、可修改等特性;
核心包:
org.springframework.beans
org.springframework.context
初始化过程:
1. Resource定位(Bean的定义文件定位)
2. 将Resource定位好的资源载入到BeanDefinition
3. 将BeanDefiniton注册到容器中
(二). AOP
AOP意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
概念:
1)方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。
2)切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。
3)连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
4)通知(Advice):在特定的连接点,AOP框架执行的动作。
5)目标对象(Target Object):包含连接点的对象,也被称作被通知或被代理对象。
6)AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。
7)引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。
8)编织(Weaving):组装方面来创建一个被通知对象。
常见应用场景:
权限控制、异常处理、缓存、事务管理、日志记录、数据校验等等
AOP代理对象的生成:
Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,具体使用哪种方式生成由AopProxyFactory根据AdvisedSupport对象的配置来决定。默认的策略是如果目标类是接口,则使用JDK动态代理技术,否则使用Cglib来生成代理。
总结:
IOC与AOP都是Spring最核心的两大特性,能够有效解耦和提高开发效率,建议有时间阅读源码了解其底层运作方式,更好的了解这两大特性。
目前,随着区块链技术的兴起,架构师更倾向于使用前后端分离的框架理念,相对传统的SSH,SSM正向更清晰、更有效的专注后端接口的框架转移。可以多多了解其核心理念,对应用在其它框架上非常有帮助。