Fork me on GitHub

Spring 中基于 AOP 的 @AspectJ注解实例

@AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明 aspects 的一种风格。通过在你的基于架构的 XML 配置文件中包含以下元素,@AspectJ 支持是可用的。

1.第一步:倒入jar包,跟上个例子包是一样的

  • aspectjrt.jar

  • aspectjweaver.jar

  • aspectj.jar

  • aopalliance.jar

2.第二步:创建三个类  

  2.1这里是 Logging.java 文件的内容。这实际上是 aspect 模块的一个示例,它定义了在各个点调用的方法。

 1 package com.spring.aop2;
 2 
 3 import org.aspectj.lang.annotation.AfterReturning;
 4 import org.aspectj.lang.annotation.AfterThrowing;
 5 import org.aspectj.lang.annotation.Aspect;
 6 import org.aspectj.lang.annotation.Before;
 7 import org.aspectj.lang.annotation.Pointcut;
 8 
 9 @Aspect // 定义切面
10 public class Logging {
11     @Pointcut("execution(* com.spring.aop2.Student.*(..))") // 定义切点
12     private void selectAll() {
13 
14     }
15     /**
16      * 定义通知方法
17      */
18 
19     @Before("selectAll()")
20     public void beforeAdvice() {
21         System.out.println("----------beforeAdvice-----------");
22 
23     }
24 
25     @AfterReturning(pointcut = "selectAll()", returning = "retVal")
26     public void afterReturningAdvice(Object retVal) {
27         System.out.println("Returning:" + retVal.toString());
28     }
29 
30     @AfterThrowing(pointcut = "selectAll()", throwing = "ex")
31     public void AfterThrowingAdvice(IllegalArgumentException ex) {
32         System.out.println("There has been an exception: " + ex.toString());
33     }
34 
35 }

  2.2下面是 Student.java 文件的内容:

 1 package com.spring.aop2;
 2 
 3 public class Student {
 4     /**
 5      * 定义学生类
 6      */
 7     private String name;
 8     private Integer age;
 9 
10     public String getName() {
11         return name;
12     }
13 
14     public void setName(String name) {
15         this.name = name;
16     }
17 
18     public Integer getAge() {
19         return age;
20     }
21 
22     public void setAge(Integer age) {
23         this.age = age;
24     }
25 
26     public void printAdvice() {
27         System.out.println("name:" + name + ",age:" + age);
28 
29     }
30 
31 }

  2.3下面是 MainApp.java 文件的内容:

 1 package com.spring.aop2;
 2 
 3 
 4 
 5 import org.springframework.context.ApplicationContext;
 6 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 7 import org.springframework.context.support.AbstractApplicationContext;
 8 import org.springframework.context.support.ClassPathXmlApplicationContext;
 9 
10 public class Main {
11     /**
12      * Spring aop基于注解    配置文件springAop.xml
13      * author:
14      * mail:2536201485@qq.com
15      * 时间:
16      */
17     public static void main(String[] args) {
18         ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring_xml/springAop.xml");
19         Student student=(Student)applicationContext.getBean("Student");
20         student.printAdvice();
21     }
22 
23 }

3.第三步:创建bean文件(上面的头文件在上个例子当中有,这里就省略了)

下面是配置文件 Beans.xml

 1     
 2     <!-- 开启注解      通过aop命名空间的<aop:aspectj-autoproxy 
 3 />声明自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面-->
 4     <aop:aspectj-autoproxy/>
 5     <!-- 定义切面bean -->
 6     <bean id="Logging" class="com.spring.aop2.Logging"></bean>
 7     
 8     <!-- 配置bean -->
 9     <bean id="Student" class="com.spring.aop2.Student">
10         <property name="name" value="张三"></property>
11         <property name="age" value="23"></property>
12     </bean>

 

让我们运行一下应用程序。如果你的应用程序一切都正常的话,这将会输出以下消息(其中包含了异常通知):

 

posted @ 2020-05-10 20:15  云源  阅读(573)  评论(0编辑  收藏  举报
湖南云源网络科技有限公司 www. ysource.cn 版权所有   ICP证:湘ICP备18004366号
  邮箱:2536201485@qq.com   CSDN博客地址:https://blog.csdn.net/qq_32885621 有事您Q我