编程式的自定义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日)
相关推荐
Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理
3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...
spring AOP切面编程 运行环境:eclipse 构建工具:maven 不提供maven构建,maven用来解决jar包的依赖
Spring AOP面向方面编程原理:AOP概念,主要介绍面向对象的概念及原理,及作者的一些理解。
学习Spring开发的AOP面向切面编程时所需要的jar包,包括com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
spring aop 自定义切面示例 aspectj 需要相应的架包支持
死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序
spring aop jar 包
NULL 博文链接:https://ylxy3058.iteye.com/blog/2224244
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
java Spring aop面向方面编程.rar
描述一下Spring AOP? 在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? AOP有哪些可用的实现? Spring中有哪些不同的通知类型(advice types)? Spring AOP 代理是什么? 引介...
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
Spring AOP 拦截器 Advisor Spring AOP 拦截器 Advisor
小马哥讲 Spring AOP 编程思想 - API 线索图.pdf
Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
Spring AOP 是基于 AOP 编程模式的一个框架,它的使用有效减少了系统间的重复代码,达到了模块间的松耦合目的。AOP 的全称是“Aspect Oriented Programming”,即面向切面编程,它将业务逻辑的各个部分进行隔离,使...
最近公司要求和别的公司对接,但是不想破坏原有的架构,就只有用切面了,百度了下都不全面,就自己写了个小demo,只要导入spring4.2.3的jar就直接可以用,注解实现spingaop机制,1分意思下
Spring 动态代理和aop切面编程例子,自己写的例子!!!!!!!