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(){}
学习是一种态度,坚持是质变的利器!