Spring的基于ApsectJ的注解的AOP开发

​1 创建项目,引入jar包

<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>

</dependency>

<!-- https://mvnrepository.com/artifact/aspectj/aspectjrt -->
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
 
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.2.RELEASE</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>

2. 引入配置文件

<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
</beans>

3.创建目标类

public class OrderDao {
public void save(){
System.out.println("保存订单========");
}
public void update(){
System.out.println("修改订单========");
}
public void delete(){
System.out.println("删除订单========");
}
public void find(){
System.out.println("查询订单========");
}
}

4.配置目标类

<!--配置目标类-->
<bean id="oraderDao" class="springdemo1.OrderDao"></bean>

5.编写切面类并且配置

public class MyAspectAnno {
public void before(){
System.out.println("前置增强=============");
}
}
<!--配置切面类-->
<bean id="myAspect" class="springdemo1.MyAspectAnno"></bean>

6.使用注解的AOP对象目标类进行增强

在配置文件中注解的AOP开发

<!--在配置文件种开启注解的AOP的开发-->
<aop:aspectj-autoproxy/>

在切面类上增加注释

@Aspect
public class MyAspectAnno {
@Before(value = "execution(* springdemo1.OrderDao.save(..))")//表达式
public void before(){
System.out.println("前置增强=============");
}
}

7.编写测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")//加载配置文件
public class SpringDemo1Test {
@Resource(name = "oraderDao")//配置文件对应的bean属性的ID
private OrderDao orderDao;
@Test
public void demo1(){
orderDao.save();
orderDao.update();
orderDao.delete();
orderDao.find();
}
}

8.运行结果

 Spring的注解的AOP的通知类型

@Aspect:定义切面类的注解

通知类型:

*@Before:前置通知*@AfterReturing:后置通知*@Around:环绕通知*@After:最终通知*@AfterThrowing:异常抛出通知.@Pointcut:定义切入点的注解

@Before   :前置通知

@Before(value = "execution(* springdemo1.OrderDao.save(..))")//表达式
public void before(){
System.out.println("前置增强=============");
}

@AfterReturning     :后置通知

@AfterReturning(value = "execution(* springdemo1.OrderDao.delete(..))",returning ="result" )
public void afterreturning(Object result){
System.out.println("后置增强============="+result);
}

@Around       :环绕通知

@Around(value = "execution(* springdemo1.OrderDao.update(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕前增强=============");
Object obj = joinPoint.proceed();
System.out.println("环绕后增强=============");
return obj;
}

@AfterThrowing      :异常抛出通知

注意:find()函数里面必须要存在异常才会执行

public void  find(){
System.out.println("查询订单========");
int i = 1/0;
}
@AfterThrowing(value = "execution(* springdemo1.OrderDao.find(..))",throwing = "e")
public void afterthrowing(Throwable e){
System.out.println("异常抛出增强========="+e.getMessage());
}

@After:最终通知

@After(value = "execution(* springdemo1.OrderDao.find(..))")
public void after(){
System.out.println("最终增强==============");
}

执行结果

 

Spring的AOP的注解切入点的配置

@Pointcut(value="execution(* springdemo1.OrderDao.find(..))")
private void pointcut1(){}
@Pointcut(value="execution(* springdemo1.OrderDao.save(..))")
private void pointcut2(){}
@Pointcut(value="execution(* springdemo1.OrderDao.update(..))")
private void pointcut3(){}
@Pointcut(value="execution(* springdemo1.OrderDao.delete(..))")
private void pointcut4(){}

配置完成切入点需要更改上面通知类型,配置与切入点相对应(只要更改切入点)

@Before(value = "MyAspectAnno.pointcut2()")
@AfterReturning(value = "MyAspectAnno.pointcut4()",returning ="result" )
@Around(value = "MyAspectAnno.pointcut3()")
@AfterThrowing(value = "MyAspectAnno.pointcut1()",throwing = "e")
@After(value = "MyAspectAnno.pointcut1()")

猜你喜欢

转载自www.cnblogs.com/liyaolog/p/12595108.html