Spring AOP—注解配置方法的使用

Spring除了支持Schema方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明。
1 启用对@AspectJ的支持
Spring默认不支持@AspectJ风格的切面声明,为了支持需要使用如下配置:

这样Spring就能发现@AspectJ风格的切面并且将切面应用到目标对象。

2 声明切面
@AspectJ风格的声明切面非常简单,使用@Aspect注解进行声明:

然后将该切面在配置文件中声明为Bean后,Spring就能自动识别并进行AOP方面的配置:
该切面就是一个POJO,可以在该切面中进行切入点及通知定义
声明切面也可以直接使用注解的方式如下图:

用@component 把普通pojo实例化到spring容器中。在去上图xml文件中去配置。

1

2

3 声明切入点
@AspectJ风格的命名切入点使用org.aspectj.lang.annotation包下的@Pointcut+方法(方法必须是返回void类型)实现。

 value:指定切入点表达式;
argNames:指定命名切入点方法参数列表参数名字,可以有多个用“,”分隔,这些参数将传递给通知方法同名的参数,同时比如切入点表达式“args(param)”将匹配参数类型为命名切入点方法同名参数指定的参数类型。
pointcutName:切入点名字,可以使用该名字进行引用该切入点表达式。


定义了一个切入点,名字为“beforePointcut”,该切入点将匹配目标方法的第一个参数类型为通知方法实现中参数名为“param”的参数类型。

4 声明通知
@AspectJ风格的声明通知也支持5种通知类型:

一、前置通知:使用org.aspectj.lang.annotation 包下的@Before注解声明;

 value:指定切入点表达式或命名切入点;
argNames:与Schema方式配置中的同义。
示例:
1、定义接口和实现

2、定义切面:(打印日志的切面)

3、定义切入点:

4、定义通知:

完整的切面:

5、在spring_aop_annotation.xml配置文件中进行如下配置:

6、测试代码TestSpringAopAnnotation.java

7、结果:

切面、切入点、通知全部使用注解完成:
(1)使用@Aspect将POJO声明为切面;
(2)使用@Pointcut进行命名切入点声明,同时指定目标方法第一个参数类型必须是java.lang.String,对于其他匹配的方法但参数类型不一致的将也是不匹配的,通过argNames = "param"指定了将把该匹配的目标方法参数传递给通知同名的参数上;
(3)使用@Before进行前置通知声明,其中value用于定义切入点表达式或引用命名切入点;
(4)配置文件需要使用来开启注解风格的@AspectJ支持;
(5)需要将切面注册为Bean,如“aspect”Bean;
(6)测试代码完全一样。
上面我不仅演示了前置,还有后置一起演示了

二、后置返回通知:使用org.aspectj.lang.annotation 包下的@AfterReturning注解声明;(也可以使用@After)

value:指定切入点表达式或命名切入点;
pointcut:同样是指定切入点表达式或命名切入点,如果指定了将覆盖value属性指定的,pointcut具有高优先级;
argNames:与Schema方式配置中的同义;
returning:与Schema方式配置中的同义。

三、后置异常通知:使用org.aspectj.lang.annotation 包下的@AfterThrowing注解声明;

 value:指定切入点表达式或命名切入点;
pointcut:同样是指定切入点表达式或命名切入点,如果指定了将覆盖value属性指定的,pointcut具有高优先级;
argNames:与Schema方式配置中的同义;
throwing:与Schema方式配置中的同义。
例子:

四、后置最终通知:使用org.aspectj.lang.annotation 包下的@After注解声明;

value:指定切入点表达式或命名切入点;
argNames:与Schema方式配置中的同义;
示例:

五、环绕通知:使用org.aspectj.lang.annotation 包下的@Around注解声明;

value:指定切入点表达式或命名切入点;
argNames:与Schema方式配置中的同义;
例子:

5 引入
@AspectJ风格的引入声明在切面中使用org.aspectj.lang.annotation包下的@DeclareParents声明:

value:匹配需要引入接口的目标对象的AspectJ语法类型表达式;与Schema方式中的types-matching属性同义;
private Interface interface:指定需要引入的接口;
defaultImpl:指定引入接口的默认实现类,没有与Schema方式中的delegate-ref属性同义的定义方式;
例子

原文地址:https://www.cnblogs.com/miniSimple/p/12369446.html

时间: 2024-11-03 22:34:25

Spring AOP—注解配置方法的使用的相关文章

Spring AOP 注解配置实例

Spring AOP注解例子 一:导入相关jar包. 首先导入Spring的相关包(这里就不多说了,我这里是3.2.4版本的) 然后导入AOP注解的相关包(不是spring的包)aspectjrt-1.6.7.jar和aspectjweaver-1.6.8.jar和aopalliance.jar (注意这里最好是1.6.7以上的版本,不然容易出错,折腾了我好久,最后才发现是包的版本问题. 所以这里一定要注意,spring 2.0以后的最好是用1.6.7的版本) 二: 建一个class类作为切入面

spring Aop注解配置

①<!-- 启用AOP --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> ②<!-- 配置扫描标注注解的包 --> <context:component-scan base-package="com.tz.spring.dao,com.tz.spring.service,com.tz.spring.advice"></context:component-scan>

spring AOP 注解配置

applicationContext-resource.xml: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http:/

AOP注解配置

1.--------AOP注解配置---------- (1)在spring配置文件中启用AOP注解 <aop:aspectj-autoproxy/> (2)编写切面组件,使用以下注解定义切入点,通知等 @Aspect : 将当前类指定为切面组件 @Pointcut : 定义切入点 @Around("切入点引用") @Before("切入点引用") @After("切入点引用") @AfterReturning(pointcut=&q

Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解

原创整理不易,转载请注明出处:Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解 代码下载地址:http://www.zuidaima.com/share/1772661373422592.htm 本文介绍了使用Spring注解注入属性的方法.使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifi

Spring MVC注解配置结合Hibernate的入门教程及其代码实例

原文:Spring MVC注解配置结合Hibernate的入门教程及其代码实例 源代码下载地址:http://www.zuidaima.com/share/1787210045197312.htm 1.概述 本文旨在搭建Spring MVC+Hibernate开发框架,通过一个简单的demo讲解Spring MVC的相关配置文件,以及通过注解方式实现简单功能. 开发框架:Spring+Spring MVC+Hibernate(Spring所用的版本为3.0.5). 数据库:MySQL(数据库名称

Spring AOP根据JdbcTemplate方法名动态设置数据源

说明:现在的场景是,采用数据库(Mysql)复制(binlog)的方式在两台不同服务器部署并配置主从(Master-Slave)关系: 并需要程序上的数据操作方法来访问不同的数据库,比如,update方法访问主数据库服务器,query方法访问从数据库服务器. 即把"增删改"和"查"分开访问两台服务器,当然两台服务器的数据库同步事先已经配置好. 然而程序是早已完成的使用Spring JdbcTemplate的架构,如何在不修改任何源代码的情况下达到<本文标题&g

Spring AOP 不同配置方式产生的冲突问题

Spring AOP的原理是 JDK 动态代理和CGLIB字节码增强技术,前者需要被代理类实现相应接口,也只有接口中的方法可以被JDK动态代理技术所处理:后者实际上是生成一个子类,来覆盖被代理类,那么父类的final方法就不能代理,因为父类的final方法不能被子类所覆盖.一般而言Spring默认优先使用JDK动态代理技术,只有在被代理类没有实现接口时,才会选择使用CGLIB技术来实现AOP. 但是也提供了配置参数来强制选择使用 CGLIB 技术,如下: <aop:config proxy-ta

Spring AOP 注解形式

AspectOriented Programing,面向切面编程.   AOP主要用于日志记录,性能统计,安全控制(权限控制),事务处理,异常处理等.将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码.  Spring AOP织入增强(Advice)的方式有两种 如果连接点实现了接口采用jdk自带的动态代理的形式实现织入,如果连接点没有实现接口则采用动态