上次总结了Spring的重点之一IOC,这次总结一下Spring的aop,aop嗯面向切面编程,先谈谈aop在Sping框架中的应用吧,最经典的莫过于Sping aop实现声明式事务管理了,在xml文件中配置
<beans xmlns=”http://www.springframework.org/schema/beans”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:tx=”http://www.springframework.org/schema/tx”
xmlns:aop=”http://www.springframework.org/schema/aop”
xsi:schemaLocation=”
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd”>
<tx:advice id=”txAdvice” transaction-manager=”txManager”>
<tx:attributes>
<tx:method name=”save*” propagation=”REQUIRED” />
<tx:method name=”add*” propagation=”REQUIRED” />
<tx:method name=”create*” propagation=”REQUIRED” />
<tx:method name=”insert*” propagation=”REQUIRED” />
<tx:method name=”update*” propagation=”REQUIRED” />
<tx:method name=”merge*” propagation=”REQUIRED” />
<tx:method name=”del*” propagation=”REQUIRED” />
<tx:method name=”remove*” propagation=”REQUIRED” />
<tx:method name=”buy*” propagation=”REQUIRED” />
<tx:method name=”put*” propagation=”REQUIRED” />
<tx:method name=”get*” propagation=”SUPPORTS” read-only=”true” />
<tx:method name=”count*” propagation=”SUPPORTS” read-only=”true” />
<tx:method name=”find*” propagation=”SUPPORTS” read-only=”true” />
<tx:method name=”list*” propagation=”SUPPORTS” read-only=”true” />
<tx:method name=”*” propagation=”SUPPORTS” read-only=”true” />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id=”txPointcut” expression=”execution(* cn.javass.point.service.*.*(..))” />
<aop:advisor advice-ref=”txAdvice” pointcut-ref=”txPointcut” />
</aop:config>
</beans>
来实现,或者使用注解来实现,个人认为使用Spring框架时IOC部分使用注解相对简单,而aop部分使用xml配置较简单,至于上边的配置的解释就不多说了。
下边才是重点Spring AOP的实现原理:
Spring AOP通过JDK的InvocationHandler接口和Proxy类(JDK的动态代理)来产生一个代理对象或者CGLIB来产生一个代理对象,产生出来的代理对象不但执行了被代理对象的方法还将切面(需要加入的功用的逻辑类,例如:要加入的事务逻辑处理类)的方法也给执行,这样就实现了动态的加入想要实现的逻辑而不去改动原来的商业逻辑。
1.JDK动态代理,默认情况下Spring aop采用的是这种代理模式,要使用这种代理模式,必须实现接口,而要实现的接口任意,why?往下看,了解过JDK动态代理的都知道产生一个代理对象只需要使用InvocationHandler和Proxy即可,用Proxy.newProxyInstance产生一个代理对象,用InvocationHandler接口的实现类的invoke方法来执行要加入的逻辑和原来的逻辑,Proxy.newProxyInstance方法有三个参数
其中第二个参数是传入对象实现的接口,并且这个参数不能为空(所以使用这种代理必须要实现接口)
2.CGLIB代理,当被代理的对象没有实现任何接口时Spring aop会使用这种代理模式来达到目的,用这种代理时必须加入两个包aspectjrt.jar和aspectjweaver.jar
这就是我理解的Spring aop的实现原理。
Spring aop不仅仅体现在声明式事务管理上,还可用于权限判断、效率的检查,审计,安全性检查,日志记录,等等