详解在Spring中如何使用AspectJ来实现AOP

网友投稿 334 2023-01-27


详解在Spring中如何使用AspectJ来实现AOP

AspectJ 是通过注解来描述切点与增强的。

1 开发环境要求

因为要使用注解,所以请确保使用的 java5.0 及以上版本。

引入 AspectJ 相关类库:

org.aspectj

aspectjrt

${aspectj.version}

org.aspectj

aspectjweaver

${aspectj.version}

org.aspectj

aspectjtools

${aspectj.version}

aopalliance

aopalliance

${aopalliance.version}

2 编程方式

http://

@Aspect//标识切面

public class PreRentAspect {

/**

* 增强逻辑

*/

@Before("execution(* rent(..))")//定义切点与增强类型

public void beforeRent() {

System.out.println("开始执行租赁动作");

}

}

这个切面只是一个普通的 POJO,只不过加了 @Aspect 注解。

@Before("execution(* rent(..))") 中的 @Before 表示增强类型是前置增强,它的内容是 @AspectJ 切点表达式,这里表示的是在目标类的 rent() 方法上织入增强, rent() 可以包含任意入参和任意的返回值。

带  @Aspect 的类,通过注解与代码,将切点、增强类型和增强的横切逻辑整合到了一起,是不是很方便呀O(∩_∩)O哈哈~

单元测试:

AspectJProxyFactory factory = new AspectJProxyFactory();

//设置目标类

factory.setTarget(new User());

//添加切面类

factory.addAspect(PreRentAspect.class);

User proxy = factory.getProxy();

String userId = "001";

proxy.rent(userId);

proxy.back(userId);

输出结果:

--开始执行租赁动作--

User:租赁【充电宝】

User:归还【充电宝】

3 配置方式

class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>

单元测试:

ApplicationContext context = new ClassPathXmlApplicationContext(spring.xml");

User user = (User) context.getBean("user");

String userId = "001";

user.rent(userId);

user.back(userId);

输出结果与编程方式完全相同。

也可以基于 Schema 的 aop 命名空间进行配置:

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:aop="http://springframework.org/schema/aop"

xsi:schemaLocation="http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans-4.0.xsd http://springframework.org/schema/aop http://springframework.org/schema/aop/spring-aop.xsd">

这样的配置更加简洁。其实在 内部已经采用了自动代理模式啦 O(∩_∩)O哈哈~

的 proxy-target-class 属性,默认为 false ,表示使用 JDK 动态代理技术织入增强;此值为 true 则表示使用 CGLib 动态代理技术织入增强 。 如果目标类没有声明接口,那么即使  proxy-target-class 设置为 false,也会自动使用 CGLib 动态代理织入增强的哟O(∩_∩)O哈哈~

基于 Java5.0+ 的项目,建议使用 AspectJ 来配置切点与增强,因为这样更简洁、也更直接。

class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>

单元测试:

ApplicationContext context = new ClassPathXmlApplicationContext(spring.xml");

User user = (User) context.getBean("user");

String userId = "001";

user.rent(userId);

user.back(userId);

输出结果与编程方式完全相同。

也可以基于 Schema 的 aop 命名空间进行配置:

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:aop="http://springframework.org/schema/aop"

xsi:schemaLocation="http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans-4.0.xsd http://springframework.org/schema/aop http://springframework.org/schema/aop/spring-aop.xsd">

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:aop="http://springframework.org/schema/aop"

xsi:schemaLocation="http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans-4.0.xsd http://springframework.org/schema/aop http://springframework.org/schema/aop/spring-aop.xsd">

这样的配置更加简洁。其实在 内部已经采用了自动代理模式啦 O(∩_∩)O哈哈~

的 proxy-target-class 属性,默认为 false ,表示使用 JDK 动态代理技术织入增强;此值为 true 则表示使用 CGLib 动态代理技术织入增强 。 如果目标类没有声明接口,那么即使  proxy-target-class 设置为 false,也会自动使用 CGLib 动态代理织入增强的哟O(∩_∩)O哈哈~

基于 Java5.0+ 的项目,建议使用 AspectJ 来配置切点与增强,因为这样更简洁、也更直接。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:通过热点连接共享文件夹(电脑热点共享文件)
下一篇:angular6.0使用教程之父组件通过url传递id给子组件的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~