Spring的AOP入门案例

tech2026-01-17  4

这里开始搭建一个简单的AOP案例

首先建立一个maven工程,在pom文件导入坐标

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.7</version> </dependency>

注:aspectjweaver是解析切入点表达式的包

 

创建一个user的service的接口与实现类

public interface UserService { public void save(); public void update(); public int delete(int i); } public class UserServiceImpl implements UserService { //模拟保存 public void save() { System.out.println("保存方法运行了"); } //模拟更新 public void update() { System.out.println("更新方法运行了"); } //模拟删除 public int delete(int i) { System.out.println("删除方法运行了"); return 0; } }

 

建立一个日志打印类

public class Logger { public void printLog(){ System.out.println("开始记录日志"); } }

 

创建bean.xml配置文件

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="UserServicr" class="com.itylm.service.impl.UserServiceImpl"></bean> <bean id="Logger" class="com.itylm.util.Logger"></bean> <aop:config> <aop:aspect id="logAdvice" ref="Logger"> <aop:before method="printLog" pointcut="execution(public void com.itylm.service.impl.UserServiceImpl.save())"></aop:before> </aop:aspect> </aop:config> </beans>

 

这里首先是配置了两个bean

<bean id="UserServicr" class="com.itylm.service.impl.UserServiceImpl"></bean>

<bean id="Logger" class="com.itylm.util.Logger"></bean>

然后是开启配置AOP

<aop:config> <aop:aspect id="logAdvice" ref="Logger"> <aop:before method="printLog" pointcut="execution(public void com.itylm.service.impl.UserServiceImpl.save())"></aop:before> </aop:aspect> </aop:config>

 

注:

        spring中基于XML的AOP配置步骤         1、把通知Bean也交给spring来管理         2、使用aop:config标签表明开始AOP的配置         3、使用aop:aspect标签表明配置切面                 id属性:是给切面提供一个唯一标识                 ref属性:是指定通知类bean的Id。         4、在aop:aspect标签的内部使用对应标签来配置通知的类型                我们现在示例是让printLog方法在切入点方法执行之前之前:所以是前置通知                aop:before:表示配置前置通知                     method属性:用于指定Logger类中哪个方法是前置通知                     pointcut属性:用于指定切入点表达式,该表达式的含义指的是对业务层中哪些方法增强

            切入点表达式的写法:                 关键字:execution(表达式)                 表达式:                     访问修饰符  返回值  包名.包名.包名...类名.方法名(参数列表)                 标准的表达式写法:                     public void com.itylm.service.impl.UserServiceImpl.save()                 访问修饰符可以省略                      void com.itylm.service.impl.UserServiceImpl.save()                 返回值可以使用通配符,表示任意返回值                     * com.itylm.service.impl.UserServiceImpl.save()                 包名可以使用通配符,表示任意包。但是有几级包,就需要写几个*.                     * *.*.*.*.UserServiceImpl.save()                 包名可以使用..表示当前包及其子包                     * *..UserServiceImpl.save()                 类名和方法名都可以使用*来实现通配                     * *..*.*()                 参数列表:                     可以直接写数据类型:                         基本类型直接写名称           int                         引用类型写包名.类名的方式   java.lang.String                     可以使用通配符表示任意类型,但是必须有参数                     可以使用..表示有无参数均可,有参数可以是任意类型                 全通配写法:                     * *..*.*(..)

                实际开发中切入点表达式的通常写法:                     切到业务层实现类下的所有方法                         * com.itylm.service.impl.*.*(..)  

测试类:

public class test { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml"); UserService userService = (UserService) ac.getBean("UserServicr"); userService.save(); userService.update(); userService.delete(1); } }

 

运行结果

 

 

最新回复(0)