编程式的创建Aop代理之AspectjProxyFactory
之前已经介绍了一款编程式的创建Aop代理的工厂——ProxyFactory
,其实ProxyFactory
拥有的功能AspectjProxyFactory
都有。它们虽然没有直接的继承关系,但是它们都继承自ProxyCreatorSupport
,而创建代理对象的核心逻辑都是在ProxyCreatorSupport
中实现的。所以说ProxyFactory
拥有的功能AspectjProxyFactory
都有。那么AspectjProxyFactory
与ProxyFactory
相比有什么不同呢?AspectjProxyFactory
的特殊之处就在于其可以直接指定需要创建的代理对象需要绑定的切面。在使用ProxyFactory
时,我们能够绑定的是Advisor
或Advice
,但是如果我们的程序中已经有了现成的切面类定义且能够为我们新创建的代理类使用时,我们还要为了ProxyFactory
建立代理对象的需要创建对应的Advisor
类、Advice
类和Pointcut
类定义,这无疑是非常麻烦的。AspectjProxyFactory
通常用于创建基于Aspectj风格的Aop代理对象。现假设我们有如下这样一个切面类定义。
@Aspect
public class MyAspect {
@Pointcut("execution(* add(..))")
private void beforeAdd() {}
@Before("beforeAdd()")
public void before1() {
System.out.println("-----------before-----------");
}
}
在上述切面类定义中我们定义了一个Advisor
,其对应了一个BeforeAdvice
,实际上是一个AspectJMethodBeforeAdvice
,该Advice
对应的是上面的before1()
方法,还对应了一个Pointcut
,实际上是一个AspectJExpressionPointcut
。该Advisor
的语义就是调用所有的方法名为“add”的方法时都将在调用前调用MyAspect.before1()
方法。如果我们现在需要创建一个代理对象,其需要绑定的Advisor
逻辑跟上面定义的切面类中定义的Advisor
类似。则我们可以进行如下编程。
@Test
public void testAspectJProxyFactory() {
MyService myService = new MyService();
AspectJProxyFactory proxyFactory = new AspectJProxyFactory(myService);
proxyFactory.addAspect(MyAspect.class);
proxyFactory.setProxyTargetClass(true);//是否需要使用CGLIB代理
MyService proxy = proxyFactory.getProxy();
proxy.add();
}
在上述代码中我们AspectjProxyFactory
在创建代理对象时需要使用的切面类(其实addAspect还有一个重载的方法可以指定一个切面类的对象),其实在AspectjProxyFactory
内部还是解析了该切面类中包含的所有的Advisor
,然后把能够匹配当前代理对象类的Advisor
与创建的代理对象绑定了。有兴趣的读者可以查看一下AspectjProxyFactory
的源码,以下是部分核心代码。
public void addAspect(Class<?> aspectClass) {
String aspectName = aspectClass.getName();
AspectMetadata am = createAspectMetadata(aspectClass, aspectName);
MetadataAwareAspectInstanceFactory instanceFactory =
createAspectInstanceFactory(am, aspectClass, aspectName);
addAdvisorsFromAspectInstanceFactory(instanceFactory);
}
private void addAdvisorsFromAspectInstanceFactory(
MetadataAwareAspectInstanceFactory instanceFactory) {
List<Advisor> advisors = this.aspectFactory.getAdvisors(instanceFactory);
advisors = AopUtils.findAdvisorsThatCanApply(advisors, getTargetClass());
AspectJProxyUtils.makeAdvisorChainAspectJCapableIfNecessary(advisors);
OrderComparator.sort(advisors);
addAdvisors(advisors);
}
需要注意的是在使用
AspectjProxyFactory
基于切面类创建代理对象时,我们指定的切面类上必须包含@Aspect注解。
另外需要注意的是虽然我们自己通过编程的方式可以通过AspectjProxyFactory
创建基于@Aspect
标注的切面类的代理,但是通过配置<aop:aspectj-autoproxy/>
使用基于注解的Aspectj风格的Aop时,Spring内部不是通过AspectjProxyFactory
创建的代理对象,而是通过ProxyFactory
。有兴趣的朋友可以查看一下AnnotationAwareAspectjAutoProxyCreator
的源代码。
(注:本文是基于Spring4.1.0所写,Elim写于2017年5月9日)
相关推荐
Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理
死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序
Spring AOP面向方面编程原理:AOP概念,主要介绍面向对象的概念及原理,及作者的一些理解。
spring AOP切面编程 运行环境:eclipse 构建工具:maven 不提供maven构建,maven用来解决jar包的依赖
学习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(动态代理),包括jdk动态代理和CGLib动态代理
主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是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 spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
spring aop jar 包
描述一下Spring AOP? 在Spring AOP中关注点(concern)和横切关注点(cross-cutting ...Spring AOP 代理是什么? 引介(Introduction)是什么? 连接点(Joint Point)和切入点(Point Cut)是什么? 织入(Weaving)是什么?
一、适合人群 1、具备一定Java编程基础,初级开发者 2、对springboot,mybatis,mysql有基本认识 3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 ...4、spring boot,mybatis,druid,spring aop的使用
Spring 动态代理和aop切面编程例子,自己写的例子!!!!!!!
NULL 博文链接:https://ylxy3058.iteye.com/blog/2224244
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。
java Spring aop面向方面编程.rar
何谓Spring AOP? Spring AOP 是基于 AOP 编程模式的一个框架,它的...课程从Spring AOP概念开始引入,通过Spring AOP代理和判断模式进行,宝库各种模式,不断的深入学习,相信会给同学们带来不一样的Spring AOP技术
小马哥讲 Spring AOP 编程思想 - API 线索图.pdf