您的位置:首页 > 编程语言 > Java开发

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容器中的
Advisor
bean会自动应用到匹配的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日)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: