Spring Aop(十六)——编程式的自定义Advisor
转发:https://www.iteye.com/blog/elim-2399437
https://www.iteye.com/blogs/subjects/springaop
编程式的自定义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(十六)——编程式的自定义Advisor的更多相关文章
- Spring Boot(十六):使用Jenkins部署Spring Boot
Spring Boot(十六):使用Jenkins部署Spring Boot jenkins是devops神器,介绍如何安装和使用jenkins部署Spring Boot项目 jenkins搭建 部署 ...
- Spring Aop(十)——编程式的Pointcut
转发地址:https://www.iteye.com/blog/elim-2396526 编程式的Pointcut 除了可以通过注解和Xml配置定义Pointcut之外,其实我们还可以通过程序来定义P ...
- Spring学习(十六)----- Spring AOP实例(Pointcut(切点),Advisor)
在上一个Spring AOP通知的例子,一个类的整个方法被自动拦截.但在大多数情况下,可能只需要一种方式来拦截一个或两个方法,这就是为什么引入'切入点'的原因.它允许你通过它的方法名来拦截方法.另外, ...
- Spring框架——事务处理(编程式和声明式)
一. 事务概述 ●在JavaEE企业级开发的应用领域,为了保证数据的完整性和一致性,必须引入数据库事务的概念,所以事务管理是企业级应用程序开发中必不可少的技术. ●事务就是一组由于逻辑上紧密关联而合 ...
- Spring事务管理之编程式事务管理
© 版权声明:本文为博主原创文章,转载请注明出处 案例:利用Spring的编程式事务管理模拟转账过程 数据库准备 -- 创建表 CREATE TABLE `account`( `id` INT NOT ...
- Spring Aop(六)——@DeclareParents介绍
转发:https://www.iteye.com/blog/elim-2395410 6 @DeclareParents介绍 @DeclareParents注解也是Aspectj提供的,在使用基于As ...
- Spring MVC(十六)--Spring MVC国际化实例
上一篇文章总结了一下Spring MVC中实现国际化所需的配置,本文继上一文举一个完整的例子,我选择用XML的方式.我的场景是这样的: 访问一个页面时,这个页面有个表格,对表头中的列名实现国际化. 第 ...
- (转)Spring Boot(十六):使用 Jenkins 部署 Spring Boot
http://www.ityouknow.com/springboot/2017/11/11/spring-boot-jenkins.html enkins 是 Devops 神器,本篇文章介绍如何安 ...
- Spring Boot(十六):使用 Jenkins 部署 Spring Boot
Jenkins 是 Devops 神器,本篇文章介绍如何安装和使用 Jenkins 部署 Spring Boot 项目 Jenkins 搭建.部署分为四个步骤: 第一步,Jenkins 安装 第二步, ...
随机推荐
- Spring 整合 Quartz框架(定时任务)
Maven 无法下载 Quartz 依赖,去官网下载 http://www.quartz-scheduler.org/downloads/ Quartz 官方手册:https://www.w3csch ...
- Second Max of Array
Find the second max number in a given array. Example Given [1, 3, 2, 4], return 3. Given [1, 2], ret ...
- Python 装饰器实现单列模式
# 使用装饰器实现单列模式 def singleton(cls): # 用来存在实例的字典 singleton_instance = {} def wrapper(*args, **kwargs): ...
- 对linux下日志文件error监控
对日志文件中的error进行监控,当日志文件中出现error关键字时,就截取日志(grep -i error 不区分大小写进行搜索"error"关键字,但是会将包含error大小写 ...
- LeetCode 273. Integer to English Words
原题链接在这里:https://leetcode.com/problems/integer-to-english-words/description/ 题目: Convert a non-negati ...
- 在Vue中加入国际化(i18n)中英文功能
1.npm安装方法 npm install vue-i18n --save 2.在src资源文件下创建文件夹i18n,i18n下面创建index.js文件,引入VueI18n和导入语言包(按开发需求可 ...
- git merge 及 git rebase的区别
Git上合并代码有git merge 及 git rebase 两种方式. 前置知识点 Master分支:首先,代码库应该有一个.且仅有一个主分支.所有提供给用户使用的正式版本,都在这个主分支上发布. ...
- js关闭当前页面不弹出提示
window.top.opener=null; window.top.open('','_top');//top当前最顶层窗口.self表示当前打开的窗口 window.top.close(); 作用 ...
- Oracle RAC 服务启动流程
启动流程步骤层次梳理:第一层:OHASD 启动: cssdagent - 负责启动 CSSD 的 Agent.orarootagent - 负责启动所有 root 用户下的 ohasd 资源 的Age ...
- 2018 Benelux Algorithm Programming Contest (BAPC 18)
目录 Contest Info Solutions A A Prize No One Can Win B Birthday Boy C Cardboard Container D Driver Dis ...