SpringFramework(4)

来源:百度文库 编辑:神马文学网 时间:2024/04/30 10:56:18
3、AOP
(1)Aspect-oriented Programming
l         补充OOP
l         分解问题的各个方面(或关系)
l         模块化关系
l         用法:
持久化
事务管理
安全
日志管理
调试
(2)AOP概念
l         Aspect:模块化关系(concern)
l         Joinpoint:程序执行时的一个点
l         Advice:在具体joinpoint做的动作
l         Pointcut:一个Advice应该激活的指定joinpoint集合
l         Introduction:添加方法或域到Advice类中
(3)Pointcut
l         一个Advice应该激活的指定joinpoint集合
public interface Pointcut {ClassFilter getClassFilter();MethodMatcher getMethodMatcher();}public interface ClassFilter {boolean matches(Class clazz);}public interface MethodMatcher {boolean matches(Method m, Class targetClass);boolean matches(Method m, Class targetClass, Object[] args);boolean isRuntime();}
限制pointcut为一组target类;静态pointcuts不需要使用带参数的方法
(4)Pointcut实现
l         正则表达式
.*\.get.*.*\.set.*
方法名全路经匹配Perl5正则表达式
(5)Advice
l         在具体joinpoint做的动作
public interface MethodInterceptor extends Interceptor {Object invoke(MethodInvocation invocation) throws Throwable;}
Spring使用包围joinpoint的拦截器(Interceptor)链来实现Advice
l         例子:
public class DebugInterceptor implements MethodInterceptor {public Object invoke(MethodInvocation invocation)throws Throwable {System.out.println(">> " + invocation); // beforeObject rval = invocation.proceed();System.out.println("<< Invocation returned"); // afterreturn rval;}}
(6)Advice类型
l         Around Advice(如前面的例子)
l         Before Advice
l         Throws Advice
l         After returning Advice
l         Introduction Advice
(7)Spring Advisors
l         PointcutAdvisor = Pointcut + Advice
l         每个内建的Advice都有一个Advisor
l         例子:
.*\.get.*.*\.set.*
(8)ProxyFactory
l         使用ProxyFactory获得Advised对象
定义应用的pointcuts和advices
以代理对象返回interceptor
使用Java动态代理或CGLIB2(可以代理接口和类)
l         编程方式创建AOP代理
ProxyFactory factory = new ProxyFactory(myBusinessInterfaceImpl);factory.addInterceptor(myMethodInterceptor);factory.addAdvisor(myAdvisor);MyBusinessInterface b = (MyBusinessInterface)factory.getProxy();
(9)ProxyFactoryBean
l         用来获得Bean的代理
l         要代理的Bean:
Tony51
PersonImpl实现Person接口
l         Interceptors和Advisors:
Something
l         代理:
eg.PersonmyAdvisordebugInterceptor
l         使用Bean:
客户程序应该获得person Bean,而不是personTarget
可以通过应用程序context或编程方式来访问
 Person person = (Person) factory.getBean("person");
l         如果是代理类而不是接口
将proxyTargetClass设置为true,来替代proxyInterfaces
代理要扩展target类(由CGLIB来构造)
truemyAdvisordebugInterceptor
(10)AutoProxy
l         自动代理的创建:
只要定义targets
选择的Bean会被自动代理
l         不需要为每个target Bean使用ProxyFactoryBean
(11)BeanNameAutoProxyCreator
l         使用Bean名选择targets
......employee*myInterceptor
(12)AdvisorAutoProxyCreator
l         自动应用Advisors到context中的Bean
每个Advisor对应一个pointcut和advice
如果pointcut应用到Bean,就会被advice拦截
l         有助于保持同一个advice应用到多个事务对象的一致性
l         不可能获得没有advised的对象
l         例子:
.*\.get.*
这个Advisor应用debugInterceptor到任何类的所有get方法
true
(13)AOP高级特性
l         元数据驱动的自动代理
l         目标源(TargetSources)
热交换目标源:当允许调用者保持他的引用时,允许切换代理的Bean
目标源池:维护相同实例的池,在方法激活时释放对象到池中