spring AOP 随机笔记

AOP概念比较重要,使用也非常多,网上随机各处看到,整理一下,也好复习一下,温故而知新...

AOP(Aspect-OrientedProgramming,面向方面编程)可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

实现AOP的技术,主要分为两大类:静态代理和动态代理;
静态代理 是在编译时就已经生产代理类了;
动态代理 是程序在运行时,运用反射机制动态创建代理类;

其中实现动态代理的机制有两种:
1,JDK实现动态代理,这种只能代理实现了至少一个某接口的类,也即目标类必须至少有一个接口并实现了该接口才能使用;

2,cglib实现动态代理,主要是针对类来实现代理,原来是针对目标类生产一个子类,并覆盖其中的方法实现增强,因是继承方式,所以目标类不能使用 final 修饰符,因用该修饰符的类不能继承;

Spring对AOP的支持,使用动态代理方式,Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理,故AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。Spring创建代理的规则为:
1,当目标类如果至少实现了一个接口则用JDK动态代理方式生成目标类的代理类;
2,如果没有实现任何接口则必须使用CGLIB动态代理方式生成目标工作类,即继承目标类的子类,并覆盖其中的方法实现增强;
3,如果实现了某一个接口的目标类,当然也可以增加proxy-target-class="true"属性来强制使用CGLIB代理方式;

片段配置例子

<bean id="logHandler" class="..."></bean>

<aop:config proxy-target-class="true">
	<aop:aspect id="log" ref="logHandler">  
        <aop:pointcut id="printLog" expression="execution(* com.xxx.yyy.service..*(..))" />  
        <aop:before method="LogBefore" pointcut-ref="printLog" />  
        <aop:after method="LogAfter" pointcut-ref="printLog" />  
    </aop:aspect> 
</aop:config>
设置proxy-target-class属性为 true 则是基于类的代理方式将起作用(即CGLIB方式,需要cglib库),为 false 或者省略这个属性则是标准的JDK代理方式,即基于接口的代理将起作用。

spring会自动根据运行类选择JDK或CGLIB代理方式,我们无需设置proxy-target-class属性,当然设置proxy-target-class="true"不管怎样都能建立代理类,比较安全;


猜你喜欢

转载自blog.csdn.net/shenzhennba/article/details/80414092
今日推荐