编程式的创建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 的自动代理创建过程中,`AbstractAutoProxyCreator` 类起着关键作用。它实现了 `BeanPostProcessor` 接口,会在 Bean 初始化后对其进行处理,生成代理对象。`AbstractAutoProxyCreator` 会查找 Spring...
### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)逐渐暴露出难以应对某些横切关注点(cross-cutting concerns)的问题。为了解决这一挑战,面向方面编程...
在Spring框架中,AOP主要通过代理模式实现,提供了声明式的通知(advises)和切面(aspects)。 Spring AOP分为两种代理方式:JDK动态代理和CGLIB代理。JDK动态代理基于接口实现,如果目标类实现了接口,Spring会...
在Spring中,AOP通过代理机制实现了切面编程,允许我们在不修改原有业务代码的情况下,插入额外的功能。 一、理解AOP概念 1. 切面(Aspect):AOP的核心概念,代表一个关注点的模块化,这个关注点可能会横切多个...
- **自动模式**:指的是Spring AOP的自动代理创建功能,即不需要手动指定代理对象,而是通过配置自动创建。 - **AbstractAutoProxyCreator**:一个抽象类,它实现了自动创建代理对象的逻辑。 - **...
在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(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来实现横切关注点,如日志、事务管理、性能监控等。本入门案例将帮助你理解并掌握Spring AOP的基本概念和使用方法。 在...
动态代理是实现AOP的一种常用技术,它允许在运行时创建代理对象,拦截对真实对象的调用,并在调用前后添加额外的行为。 在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的...
最后,值得注意的是,对于源码探索,可以查看Spring AOP的相关源代码,如`org.springframework.aop.config.AopNamespaceUtils`,了解其内部是如何解析XML配置并创建对应的AOP代理对象的。对于工具的使用,Spring提供...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...
Spring AOP,全称为Aspect Oriented Programming,是面向切面编程的一种编程范式,它是对传统的面向对象编程(OOP)的一种补充。在OOP中,核心是对象,而在AOP中,核心则是切面。切面是关注点的模块化,即程序中的...
**Spring AOP切面编程简介** 在Java世界中,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,它允许我们分离关注点,将横切关注点(如日志、事务管理、性能监控等)与业务逻辑代码解耦。...
Spring AOP,全称Spring Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在Spring AOP中,...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式的企业级服务,如事务管理、性能监控等。在Spring AOP中,我们可以通过定义切面(Aspect...
本篇文章将重点讨论如何在Spring框架中集成Hibernate,并探讨编程式事务管理和Spring AOP的声明式事务。 首先,让我们理解Spring与Hibernate的集成。为了整合这两个库,你需要在Spring配置文件中定义Hibernate的...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过插入切面来增强或改变程序的行为。在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...
### Spring AOP面向方面编程原理详解 #### 一、引言与定义 Spring AOP(Aspect Oriented Programming)是Spring框架中的一个核心组件,用于实现面向切面编程。AOP是一种编程范式,旨在将横切关注点(Cross-cutting...