spring AOP

Posted 罗晓峥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring AOP相关的知识,希望对你有一定的参考价值。

1. 什么是AOP

2. 导入依赖

导入AOP织入包

1  <dependency>
2             <groupId>org.aspectj</groupId>
3             <artifactId>aspectjweaver</artifactId>
4             <version>1.9.4</version>
5         </dependency>

3.spring AOP的简单实现(方法一:使用spring API接口)

1.接口

1 public interface UserService {
2     public void add();
3     public void delete();
4     public void update();
5     public void select();
6 }

2.实现类

 1 public class UserServiceImpl implements UserService {
 2     public void add() {
 3         System.out.println("执行了添加方法");
 4     }
 5 
 6     public void delete() {
 7         System.out.println("执行了删除方法");
 8     }
 9 
10     public void update() {
11         System.out.println("执行了更新方法");
12     }
13 
14     public void select() {
15         System.out.println("执行了查询方法");
16     }
17 }

3.添加日志

Log日志:MethodBeforeAdvice为前置通知,连接点为方法前

重写before方法

1 //method:要执行的目标对象的方法
2 //objects:参数 args
3 //o:目标对象  target
4 public class Log implements MethodBeforeAdvice {
5     public void before(Method method, Object[] objects, Object o) throws Throwable {
6         System.out.println(o.getClass().getName()+"方法");
7     }
8 }

AfterLog日志:AfterReturningAdvice为后置通知,连接点为方法后

1 //o:返回值
2 public class AfterLog implements AfterReturningAdvice {
3     public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
4         System.out.println("执行的方法为"+method.getName()+"返回值为"+o);
5     }
6

4.配置

创建applicationContext.xml配置文件

具体步骤:1.注册bean,注册接口的实现类和需要添加的Log日志方法,格式为:<bean id="任意取" class="全类名和包名"></bean>

        2.配置aop,配置aop时需要导入aop约束

     3.配置aop切入点,切入点为接口的实现类

     4.配置环绕通知,环绕通知的ref为需要添加的Log日志

 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:aop="http://www.springframework.org/schema/aop"
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans
 6            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 7            http://www.springframework.org/schema/aop
 8            http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
 9            ">
10     <!-- 注册bean-->
11     <bean id="UserServiceImpl" class="com.dz.serviceImpl.UserServiceImpl"></bean>
12     <bean id="Log" class="com.dz.log.Log"></bean>
13     <bean id="AfterLog" class="com.dz.log.AfterLog"></bean>
14     <!-- 使用原生的spring API接口-->
15     <!-- 配置aop:需要导入aop的约束-->
16     <aop:config>
17         <!-- 切入点:expression表达式,execution表示要执行的位置-->
18         <aop:pointcut id="pointcut" expression="execution(* com.dz.serviceImpl.UserServiceImpl.*(..))"/>
19 
20         <!-- 添加环绕通知-->
21         <aop:advisor advice-ref="AfterLog" pointcut-ref="pointcut"></aop:advisor>
22         <aop:advisor advice-ref="Log" pointcut-ref="pointcut"></aop:advisor>
23     </aop:config>
24 
25 </beans>

5.测试

    1.首先添加配置好的applicationContext.xml配置文件

    2.动态代理的是接口,配置文件获取的bean为接口的实现类的

1 public class MyTest {
2     public static void main(String[] args) {
3         ClassPathXmlApplicationContext Context = new ClassPathXmlApplicationContext("applicationContext.xml");
4         //动态代理的是接口
5         UserService userService =(UserService) Context.getBean("UserServiceImpl");
6         userService.add();
7     }
8 }

4. spring AOP的简单实现(方法二:使用自定义类)

1. 创建自定义类,定义方法

1 public class DiyPiontCut {
2     public void before(){
3         System.out.println("执行了Before方法");
4     }
5     public void after(){
6         System.out.println("执行了after方法");
7     }
8 }

 

2. applicationContext.xml配置文件

  注册bean为自定义类,自定义切面,ref引用的是注册的bean

  创建切入点,切入点为接口的实现类

  创建通知,通知使用的方法为自定义类定义的方法,切入点为aop创建的切入点

 1  <!-- 自定义类-->
 2     <bean id="diy" class="com.dz.diy.DiyPiontCut"></bean>
 3     <aop:config>
 4         <!-- 自定义切面,ref表示要引用的类-->
 5         <aop:aspect ref="diy">
 6         <!-- 切入点-->
 7         <aop:pointcut id="point" expression="execution(* com.dz.serviceImpl.UserServiceImpl.*(..))"/>
 8         <!-- 通知-->
 9             <aop:before method="before" pointcut-ref="point"></aop:before>
10             <aop:after method="after" pointcut-ref="point"></aop:after>
11         </aop:aspect>
12     </aop:config>

 

以上是关于spring AOP的主要内容,如果未能解决你的问题,请参考以下文章

JAVA之AOP

Spring AOP

Spring源码高级笔记之——Spring AOP应用

2018.12.24 Spring中的aop演示

Spring框架 AOP

Spring的AOP面向切面编程