初学者对spring aop 最基本的理解。以及应用
第一次写博客。本人是个菜鸟。有什么不对的地方请指正。发这个博客只是为了整理自己的学习历程。以及一些想法。
下面开始正文:(这些东西摘自很多人的博客,最后自己总结的,有什么不对的地方请指教。)
oop是一个由上至下的竖向编程,aop是横向的切入。
OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系,导致了大量代码的重复。
aop剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,也就是‘方面’。他可以降低模块间的耦合度,并有利于未来的功能的修改和维护。
总而言之:就是提取公共代码(日志,权限),放到一块,方便快捷。
实现AOP的技术,主要分为两大类:一是采用动态代理技术jdk 或是 cglib,二是采用静态织入的方式,使编译器可以在编译期间织入有关“方面”的代码。我一般在项目在里面用的就是动态代理。
配置文件 形式的aop 可用于日志,事务的控制
<!-- 系统服务组件的切面Bean -->
<bean id="serviceAspect" class="cn.ysh.studio.spring.aop.aspect.ServiceAspect"/>
<!-- AOP配置 -->
<aop:config>
<!-- 声明一个切面,并注入切面Bean,相当于@Aspect -->
<aop:aspect id="simpleAspect" ref="serviceAspect">
<!-- 配置一个切入点,相当于@Pointcut -->
<aop:pointcut expression="execution(* cn.ysh.studio.spring.aop.service..*(..))" id="simplePointcut"/>
<!-- 配置通知,相当于@Before、@After、@AfterReturn、@Around、@AfterThrowing -->
<aop:before pointcut-ref="simplePointcut" method="before"/>
<aop:after pointcut-ref="simplePointcut" method="after"/>
<aop:after-returning pointcut-ref="simplePointcut" method="afterReturn"/>
<aop:after-throwing pointcut-ref="simplePointcut" method="afterThrow" throwing="ex"/>
</aop:aspect>
</aop:config>
基于注解 的aop
在配置文件中 声明激活自动扫描组件功能,同时激活自动代理功能
<!-- 激活组件扫描功能,在包cn.ysh.studio.spring.aop及其子包下面自动扫描通过注解配置的组件 -->
<context:component-scan base-package="cn.ysh.studio.spring.aop"/>
<!-- 激活自动代理功能 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
//声明这是一个组件
@Component
//声明这是一个切面Bean
@Aspect
//配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
@Pointcut("execution(* cn.ysh.studio.spring.aop.service..*(..))")
public void aspect(){ }
/*
* 配置前置通知,使用在方法aspect()上注册的切入点
* 同时接受JoinPoint切入点对象,可以没有该参数
*/
@Before("aspect()")
//配置后置通知,使用在方法aspect()上注册的切入点
@After("aspect()")
//配置环绕通知,使用在方法aspect()上注册的切入点
@Around("aspect()")
//配置后置返回通知,使用在方法aspect()上注册的切入点
@AfterReturning("aspect()")
//配置抛出异常后通知,使用在方法aspect()上注册的切入点
@AfterThrowing(pointcut="aspect()", throwing="ex")