JAVA框架 Spring AOP注解

一、准备工作:

1)导入jar包:

4个jar包。

2)约束:(spring需要所有的约束)有IOC约束和AOP 还有事务(tx)以及注解注入的约束(context)。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:aop="http://www.springframework.org/schema/aop"
 6     xmlns:tx="http://www.springframework.org/schema/tx"
 7     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 8     http://www.springframework.org/schema/beans/spring-beans.xsd
 9     http://www.springframework.org/schema/context
10     http://www.springframework.org/schema/context/spring-context.xsd
11     http://www.springframework.org/schema/aop
12     http://www.springframework.org/schema/aop/spring-aop.xsd
13     http://www.springframework.org/schema/tx 
14     http://www.springframework.org/schema/tx/spring-tx.xsd">
15     
16 </beans>

 3)代码:

1、接口

1 package jd.com.asp;
2 
3 public interface asp {
4     void save();
5     void update();
6 }

 2、实现类:

 1 package jd.com.asp;
 2 
 3 
 4 import org.springframework.stereotype.Component;
 5 
 6 @Component(value = "aspImpl")//注入该类。
 7 public class aspImpl implements  asp {
 8     @Override
 9     public void save() {
10         System.out.println("this save method");
11     }
12 
13     @Override
14     public void update() {
15         System.out.println("this update method !");
16     }
17 }

 3、切面类:

 1 package jd.com.asp;
 2 
 3 
 4 import org.aspectj.lang.annotation.Aspect;
 5 import org.aspectj.lang.annotation.Before;
 6 import org.aspectj.lang.annotation.Pointcut;
 7 import org.springframework.stereotype.Component;
 8 
 9 
10 @Component(value = "aspj")//注入切面类。
11 @Aspect//声明该类为切面类。
12 public class aspj {
13 
14 
15     @Before(value = "execution(public  void  jd.com.asp.aspImpl.save(..))" )//通知类型和切入点。
16     public  void  log(){
17         System.out.println("log print!");
18     }
19 }

 

  需要注明该类为切面类。

  需要注明方法的通知类型和切入点表达式。

4、配置文件配置:

1     <!--开启自动扫描组件-->
2     <context:component-scan base-package="jd.com" />
3     <!--打开自动代理开关-->
4     <aop:aspectj-autoproxy />

入门例子完成。

 通知类型:

 1 package jd.com.asp;
 2 
 3 
 4 import org.aspectj.lang.ProceedingJoinPoint;
 5 import org.aspectj.lang.annotation.*;
 6 import org.springframework.stereotype.Component;
 7 
 8 
 9 @Component(value = "aspj")//注入切面类。
10 @Aspect//声明该类为切面类。
11 public class aspj {
12 
13 
14     @Before(value = "execution(public  void  jd.com.asp.aspImpl.save(..))" )//通知类型和切入点。
15     public  void  log(){
16         System.out.println("log print!");
17     }
18 
19 
20     //切入点调用方法:类的名字.方法名字()
21     @After(value = "aspj.fn()")
22     public  void  after(){
23         System.out.println("最终的方法!");
24     }
25 
26     @AfterReturning(value = "aspj.fn()")
27     public  void  afterreturning(){
28         System.out.println("后置方法");
29 
30     }
31 
32 
33     @Around(value = "aspj.fn()")
34     public void  round(ProceedingJoinPoint proceedingJoinPoint){
35         System.out.println("环绕方法执行1");
36         try {
37             proceedingJoinPoint.proceed();
38         } catch (Throwable throwable) {
39             throwable.printStackTrace();
40         }
41         System.out.println("环绕方法执行2");
42     }
43 
44 
45 
46     //切入点定义  方法的body需要是空的。
47     @Pointcut(value = "execution(public  void  jd.com.asp.aspImpl.save(..))")
48     public void  fn(){}
49 }

 

其中可以定义切入点:

1)需要定义一个body是空的方法。

2)需要pointcut注解  后面跟切入点表达式。

3)调用的时候需要value=当前切面类的类名字.切入点定义的方法名字()

1     //切入点定义  方法的body需要是空的。
2     @Pointcut(value = "execution(public  void  jd.com.asp.aspImpl.save(..))")
3     public void  fn(){}

 

posted @ 2018-04-19 14:34  evil_liu  阅读(177)  评论(0编辑  收藏  举报