spring aop

aop就是业务逻辑和非业务逻辑的隔离,记录日志,事务,权限校验这些。

我要在一个订单类,我们的课程访问,考试里面加入一些日志。

spring aop_第1张图片
就是这样

直接的代码加入,就是这样,你还做事务等,看到@Transational之后,就没有事务了,这就是AOP的效果。

怎么分离呢?SXT是一步一步的来优化这个过程的。装饰者模式。

spring aop_第2张图片
装饰者

所有的业务都多实现一个Command接口,然后,使用的时候。日志和性能统计两个装饰器

spring aop_第3张图片
NB
spring aop_第4张图片
日志

装饰者模式是最好的解决办法,静态的方式,现在你有500多个bean,都这样?

那就是动态的代理,两个代码就解决这个问题了。

spring aop_第5张图片
spring aop_第6张图片
这样

认为就是这样的,使用方式的方式来实现这个过程。

spring aop_第7张图片
切面的几个点

@Aspectj注解表明这是应该切面类。

@Component把类初始化。

@PointCut指定我们的切面。

@Before就是加在我们的切面指定的前面。

@Around就是前后都加

那来,继承InvocationHandler接口,setTarget代理对象,通过proxy生成代理类,就可以在代理对象的方法调用前,调用beforeMethod方法,还可以来里面对代理对象的方法进行过滤和分别记录日志。

就看语言表述了。


代理模式

什么是静态代理?就是代理类(Car)和被代理接口(Moveable)是确定的,一对一的代理关系,都是确定的。所谓静态也就是在程序运行前(这才是重点)就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成(这才是核心),所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。

1:假设有一个类,我要生成这个类的代理类。

1.1:把这个类的代理类,写成字符串,能够动态的编译成一个类,加载到内存,生成对象。

1.2:实现任意的类的代理,任意的接口方法的代理。

1.3:方法的具体实现,需要InvocationHandler分离出去。

说不清楚了。

第一:如果用静态代理,Y都要写,这会造成代码的膨胀。要实现timeProxy,logProxy,代理太多,那就膨胀了。

就看语言组织了。

你可能感兴趣的:(spring aop)