一、Spring 的设计初衷
1、基于POJO 的轻量级和最小侵入性编程;
2、通过依赖注入和面向接口松耦合;
3、基于切面和惯性进行声明式编程;
4、通过切面和模板减少样板式代码;
二、AOP编程理念
1.AOP介绍
AOP即面向切面编程,是一种编程思想。它允许程序员对横切关注点或横切典型的职责分界线的行为进行模块化。其核心构造是切面,它将拿下影响到多个类的行为封装到可重用的模块中。在Spring中AOP集成到了Spring事务、日志和其他各种特性的上下文中。
AOP编程的常用场景有:Authentication 权限、Caching 缓存、Error handling 错误处理、Debugging 调试、Logging日志、Transactions 事务。
主要解决了面向对象编程部分场景代码重复率高的问题。
2.AOP使用方法
@Aspect声明这是一个切面Bean(类注解)
@Pointcut(“execution(切入点的地址)”) 注解,用来定义一个切点,即上文中所关注的某件事情的入口,切入点定义了事件触发时机。(方法注解)
@Before(“@Pointcut注解的方法名”)前置通知
@After(“@Pointcut注解的方法名”)后置通知
@Around(“@Pointcut注解的方法名”)环绕通知
@AfterReturn配置返回后通知。
@AfterThrowing 配置异常通知。
3.AOP原理
1.SpringAop接入由BeanPostProcessor后置处理器开始。
该后置处理器的掉用发生在SpringIoc容器完成Bean实例对象的创建的依赖注入之后。
public interface BeanPostProcessor {
//bean初始化方法调用前被调用
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
//bean初始化方法调用后被调用
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
2 AbstractAutowireCapableBeanFactory 类的CreateBean()和initializeBean()方法
为容器创建的Bean实例对象添加BeanPostPrecessor后置处理器。
/**
* Initialize the given bean instance, applying factory callbacks
* as well as init methods and bean post processors.
* <p>Called from {@link #createBean} for traditionally defined beans,
* and from {@link #initializeBean} for existing bean instances.
*/
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
// 回调BeanPostProcessor的postProcessBeforeInitialization方法
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
// 调用 bean的 initializingBean的接口方法:afterPropertiesSet:调用自定义的initMethod。
invokeInitMethods(beanName, wrappedBean, mbd);
}
...
// 调用 BeanPostProcessor的 postProcessorAfterInitialization方法
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}
其中PostProcessorsAfterInitialization()方法中掉用了方法wrapIfNecessary()其中又掉用了poxyFactory.getProxy()方法获取代理。
代理对象执行目标方法
得到目标方法的拦截器链(增强器包装成拦截器MethodInterceptor)
利用拦截器的链式机制,依次进入每一个拦截器进行执行;
总结
Spring AOP(面向切面编程)是在Bean初始化过程中通过代理的机制生产一个代理对象,实现在切入点方法的前置、后置统一处理。从而达到解耦、提升代码复用率等作用。