AOP(面向切面编程)

泛型依赖注入:
AOP(面向切面编程)

面向切面要解决的问题:
1、代码混乱:越来越多的非业务需求(日志、验证等)的加入使得业务方法变得急剧膨胀,每个方法在处理核心业务逻辑的同时还要兼顾其他多个关注点。
2、代码分散:以日志需求为例,为了实现这个单一需求,不得不在模块或方法中书写重复的日志代码,如果日志需求一旦发生变化,不得不修改所有的日志代码

使用动态代理解决上述问题:
代理设计模式的原理:使用一个代理将对象包装起来,然后用该代理对象取代原始对象,任何对原始对象的调用都要经过代理对象,代理对象决定将方法调用转到原始对象上面

面向切面原理(基于注解的方式和xml方式):
1、AOP(Aspect Oriented Programming)是一种新的方法论,是对传统OOP的补充
2、AOP的主要编程对象是“切面(Aspect)”,而切面模块化横切关注点
3、在进行AOP编程时,任然需要定义公共功能,但可以明确的定义这个公共功能在哪里以及如何应用。不必修改受影响的类,这样一来横切关注点就被模块化到对象(切面)里面。

AOP的好处:
1、每个事物逻辑位于一个位置,代码不分散,便于维护和升级
2、业务模块更简洁,只包含业务核心代码
实现步骤:
AOP(面向切面编程)
AOP(面向切面编程)
面向切面有五个通知类型:
1、环绕通知:包含前置、后置、返回、异常通知,类似于动态代理的全过程:
AOP(面向切面编程)
切面优先级问题:
注解:order:越小,优先级越高

定义一个方法。用于声明切入点表达式,一般地,该方法中不在写其他的代码
@Pointcut(“execution(* com.spring.aop.impl..(int,int))”)
public void declareJoinPoint(){}
@Before(“declareJoinPoint()”) // 引用了声明的切入点表达式(不同包下,可用包路径)
public void boforeMethod(JoinPoint joinPoint){
String methodName = joinPoint.getSignature().getName();
List args = Arrays.asList(joinPoint.getArgs());
System.out.println(“The method “+methodName+” begin with “+ args);
}