Spring Aop(十六)——编程式的自定义Advisor
2017-11-04 20:48
429 查看
编程式的自定义Advisor
概述
大多数情况下,我们的Aop应用都可以通过Spring的Aop配置来进行(不管是基于注解的,还是基于XML配置的)。Spring Aop的核心就是Advisor,
Advisor接口中暂时有用的就是
getAdvice()方法,而
isPerInstance()方法官方说暂时还没有应用到,生成的
Advisor是单例还是多例不由
isPerInstance()的返回结果决定,而由自己在定义bean的时候控制。
public interface Advisor { Advice getAdvice(); boolean isPerInstance(); }
我们在使用
Advisor时不会直接实现
Advisor的接口,而是实现
Advisor接口的子接口,
PointcutAdvisor或
IntroductionAdvisor。
IntroductionAdvisor个人感觉用处不大,我们之前介绍的
@DeclareParents和
<aop:declare-parents/>就属于
IntroductionAdvisor使用,它们对应的是
DeclareParentsAdvisor。剩下的大部分应用的都是
PointcutAdvisor。
PointcutAdvisor接口的定义如下。
public interface PointcutAdvisor extends Advisor { Pointcut getPointcut(); }
我们可以看到它在
Advisor接口的基础上新增了一个
getPointcut()方法,用以指定我们的Advisor需要应用到哪些
Pointcut,即哪些方法调用。编程式的
Pointcut定义之前已经介绍过了,它不属于本文介绍的范畴,这里就不再赘述了,对这块不是很了解的读者建议从头看起,笔者的博文是系列博文,当然了也可以暂时先略过,直接看笔者下文的示例。
实现自定义的Advisor
以下是笔者实现的一个自定义的Advisor,是实现的
PointcutAdvisor接口。应用的
Advice是
MethodBeforeAdvice的实现;应用的
Pointcut简单匹配所有类的方法名为
find的方法调用。
public class MyAdvisor implements PointcutAdvisor { @Override public Advice getAdvice() { return new MethodBeforeAdvice() { @Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("BeforeAdvice实现,在目标方法被调用前调用,目标方法是:" + method.getDeclaringClass().getName() + "." + method.getName()); } }; } @Override public boolean isPerInstance() { return true; } @Override public Pointcut getPointcut() { /** * 简单的Pointcut定义,匹配所有类的find方法调用。 */ return new Pointcut() { @Override public ClassFilter getClassFilter() { return ClassFilter.TRUE; } @Override public MethodMatcher getMethodMatcher() { return new MethodMatcher() { @Override public boolean matches(Method method, Class<?> targetClass) { String methodName = method.getName(); if ("find".equals(methodName)) { return true; } return false; } @Override public boolean isRuntime() { return false; } @Override public boolean matches(Method method, Class<?> targetClass, Object[] args) { return false; } }; } }; } }
配置使用自定义的Advisor
有了自定义的Advisor后我们应该如何来应用它呢?这又区分好几种情况。
- 如果是自己通过编程应用
ProxyFactory,或者说是应用
ProxyCreatorSupport来创建代理对象,那么我们通过
AdvisedSupport.addAdvisor(Advisor advisor)来应用我们自定义的
Advisor。
AdvisedSupport的子类中有
ProxyCreatorSupport。
- 如果我们的项目中已经应用了
<aop:aspectj-autoproxy/>或
<aop:config>,那么我们定义在bean容器中的
Advisorbean会自动应用到匹配的bean上。这个在
《Spring Aop原理之自动创建代理对象》一文中有详细介绍。
- 如果项目中没有应用
<aop:aspectj-autoproxy/>或
<aop:config>,我们就需要自己定义
BeanNameAutoProxyCreator、
DefaultAdvisorAutoProxyCreator等
AbstractAdvisorAutoProxyCreator类型的bean了。或者是定义
AnnotationAwareAspectjAutoProxyCreator或
AspectJAwareAdvisorAutoProxyCreator类型的bean,其实
<aop:aspectj-autoproxy/>就是自动定义了
AnnotationAwareAspectjAutoProxyCreator类型的bean,
<aop:config>就是自动定义了
AspectJAwareAdvisorAutoProxyCreator类型的bean。这样在创建bean后都会寻找匹配的
Advisor建立对应的代理对象。这些都在
《Spring Aop原理之自动创建代理对象》一文中有详细介绍,细节这里就不再赘述。
(注:本文是基于Spring4.1.0所写,写于2017年5月16日)
相关文章推荐
- java学习(十六):对象的自定义比较,Comparator和Comparable
- MYSQL用法(十六) MySQL按指定字段自定义列表排序
- Spring AOP(面向切面编程)【使用Advisor】
- Spring系列之 (十六):利用Spring AOP和自定义注解实现日志功能
- angular学习笔记(十六) -- 自定义过滤器
- Spring学习(十六)----- Spring AOP实例(Pointcut(切点),Advisor)
- javaee学习之路(十六)JSP自定义标签
- 十六、C# 常用集合类及构建自定义集合(使用迭代器)
- TransactionTemplate编程式事务管理方式的进阶使用---自定义拓展模板类
- Spring AOP 自定义注解的实现代码
- 基于Spring AOP实现可控的请求日志保存,自定义注解
- Zurmo(十六)之自定义LoginPageView
- Spring Aop(十)——编程式的Pointcut
- Silverlight学习笔记十六自定义控件之一个漂亮的Gauge(仪表盘)
- 猫猫学IOS(十六)UI之XIB自定义Cell实现团购UI
- spring AOP自定义注解方式实现日志管理
- 猫猫学IOS(十六)UI之XIB自定义Cell实现团购UI
- Spring AOP从入门到放弃之自定义注解收集系统日志
- spring aop的两种写法aspect和advisor
- IOS学习(十六)自定义tabBar