spring如何用的aop

fiy 其他 12

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    使用Spring AOP(面向切面编程)的步骤如下:

    1. 引入Spring AOP依赖:在项目的pom.xml文件中,添加Spring AOP的依赖项。

    2. 创建目标类:创建一个普通的Java类作为目标类,即需要应用AOP的业务逻辑类。

    3. 编写切面类:切面类包括切点和通知。切点定义了在目标类的哪些方法上应用通知,通知则指定了在切点处执行的具体操作。

    4. 配置AOP:通过XML配置或者使用注解的方式,在Spring配置文件中声明切面和切点,将切面类和目标类连接起来。

    5. 启动应用程序:启动Spring容器,以便AOP可以对目标类进行代理。

    下面是具体的步骤:

    1. 引入Spring AOP依赖:
      在项目的pom.xml文件中添加以下依赖项:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
    1. 创建目标类:
      创建一个普通的Java类作为目标类,例如:
    @Component
    public class UserService {
        public void addUser(User user) {
            // 添加用户逻辑
        }
        
        public void updateUser(User user) {
            // 更新用户逻辑
        }
        
        public void deleteUser(int userId) {
            // 删除用户逻辑
        }
    }
    
    1. 编写切面类:
      创建一个切面类,用于定义切点和通知,例如:
    @Aspect
    @Component
    public class LoggingAspect {
        
        @Before("execution(* com.example.UserService.*(..))")
        public void logBefore(JoinPoint joinPoint) {
            // 在目标方法执行之前执行的操作
            System.out.println("Before executing method: " + joinPoint.getSignature().getName());
        }
        
        @After("execution(* com.example.UserService.*(..))")
        public void logAfter(JoinPoint joinPoint) {
            // 在目标方法执行之后执行的操作
            System.out.println("After executing method: " + joinPoint.getSignature().getName());
        }
    }
    
    1. 配置AOP:
      可以通过XML配置或者使用注解的方式来声明切面和切点。以下是使用XML配置的示例:

    在Spring的配置文件中添加以下内容:

    <aop:aspectj-autoproxy />
    <bean id="loggingAspect" class="com.example.LoggingAspect" />
    
    1. 启动应用程序:
      在Spring容器中启动应用程序,以便AOP可以对目标类进行代理。可以使用Spring Boot的启动类来启动应用程序。

    以上就是使用Spring AOP的基本步骤。通过定义切面和切点,可以在目标类的方法执行前、执行后或者异常抛出时,执行指定的操作。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring框架提供了强大而灵活的AOP(面向切面编程)功能,使开发人员能够通过将横切关注点分离出来,实现代码的解耦和复用。下面是Spring如何使用AOP的五个主要步骤:

    1. 引入AOP相关的依赖:
      首先,需要在项目中引入Spring的AOP模块。可以通过Maven或Gradle等构建工具来添加如下依赖:
    <!-- Spring AOP -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
    1. 创建切面类:
      切面类是AOP的核心,用来定义横切关注点的行为。在Spring中,可以通过注解或XML配置来创建切面类。注解方式是最常用和推荐的方式,使用@Aspect注解标识一个类为切面类。切面类中的方法称为切点(pointcut),可以使用@Before@After@Around等注解来定义方法执行的时机。

    2. 配置切面:
      在Spring配置文件中,需要将切面类和目标对象(需要被切入的类)进行关联。可以使用XML配置文件或Java配置类来完成这一步骤。如果使用XML配置文件,可以使用<aop:aspectj-autoproxy>元素来自动为目标对象创建代理;如果使用Java配置类,可以通过@EnableAspectJAutoProxy注解来开启自动代理。

    3. 定义切点和通知:
      在切面类中,通过切点表达式(Pointcut Expression)来定义切点,切点表达式决定了哪些被切入的方法会被触发。Spring支持AspectJ的切点表达式语法,可以根据方法名、类、访问修饰符等进行切点匹配。通过定义切点,可以确定在哪个位置执行通知(Advice)。通知是切点方法执行时切面类中被触发的方法,常用的通知类型有@Before(在目标方法执行之前执行)、@After(在目标方法执行之后执行)和@Around(在目标方法执行前后执行)。

    4. 运行应用程序:
      配置完成后,可以通过启动应用程序来验证AOP的效果。当目标方法被执行时,切面类中相应的通知方法也会被调用,实现横切关注点的功能。

    需要注意的是,AOP并不适用于所有场景,它主要用于解决横切关注点问题,并不是所有的代码都适合使用AOP。使用AOP时,需要注意切面类和切点的定义,确保它们和目标对象的逻辑是相互独立的,以避免引入不必要的复杂性和额外的性能开销。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    使用Spring AOP可以实现面向切面的编程,通过将横切关注点(如日志记录、性能统计、权限控制等)从业务逻辑中剥离出来,然后通过切面织入到目标对象的方法上。下面我们将从以下几个方面介绍如何在Spring中使用AOP。

    一、环境准备
    在使用Spring AOP之前,需要准备以下环境:

    1. JDK 1.8及以上版本
    2. Spring Framework 4.0及以上版本
    3. 配置文件(如applicationContext.xml)

    二、配置文件中的AOP设置
    在配置文件中,需要添加AOP相关的配置项,如下所示:

    1. 引入AOP命名空间
    xmlns:aop="http://www.springframework.org/schema/aop"
    
    1. 配置AOP的切面和通知
    <!--定义切面-->
    <aop:config>
        <aop:aspect id="aspectName" ref="aspectBean">
            <!--切点表达式,匹配需要织入的目标对象-->
            <aop:pointcut id="pointcutId" expression="execution(* com.example.service.*.*(..))"/>
            
            <!--前置通知-->
            <aop:before method="beforeAdvice" pointcut-ref="pointcutId"/>
            
            <!--后置通知-->
            <aop:after-returning method="afterReturningAdvice" pointcut-ref="pointcutId"/>
            
            <!--异常通知-->
            <aop:after-throwing method="afterThrowingAdvice" pointcut-ref="pointcutId"/>
            
            <!--最终通知-->
            <aop:after method="afterAdvice" pointcut-ref="pointcutId"/>
            
            <!--环绕通知-->
            <aop:around method="aroundAdvice" pointcut-ref="pointcutId"/>
        </aop:aspect>
    </aop:config>
    

    其中,aspectName为切面的名称,ref为切面的实现类的引用,pointcutId为切点的名称,expression为切点的表达式。

    三、创建切面类
    创建一个Java类,实现AOP的具体逻辑,例如:

    public class AspectBean {
        //前置通知
        public void beforeAdvice() {
            //在目标方法执行之前执行的逻辑
        }
        
        //后置通知
        public void afterReturningAdvice() {
            //在目标方法执行之后执行的逻辑
        }
        
        //异常通知
        public void afterThrowingAdvice() {
            //在目标方法抛出异常时执行的逻辑
        }
        
        //最终通知
        public void afterAdvice() {
            //无论目标方法是否抛出异常,都会执行的逻辑
        }
        
        //环绕通知
        public void aroundAdvice(ProceedingJoinPoint joinPoint) {
            try {
                //在目标方法执行前执行的逻辑
                joinPoint.proceed(); //调用目标方法
                //在目标方法执行后执行的逻辑
            } catch (Throwable e) {
                //在目标方法抛出异常时执行的逻辑
            }
        }
    }
    

    四、目标对象
    在需要应用AOP的目标对象上添加切面注解,例如:

    @Service
    public class UserService {
        @Log //自定义的注解,切面逻辑会织入到标有此注解的方法上
        public void addUser(User user) {
            //业务逻辑代码
        }
    }
    

    五、测试AOP
    可以使用JUnit等测试框架进行AOP测试,如下所示:

    @RunWith(SpringRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class UserServiceTest {
        @Autowired
        private UserService userService;
        
        @Test
        public void testAddUser() {
            User user = new User();
            //设置user的属性
            userService.addUser(user);
            //进行相应的断言
        }
    }
    

    以上就是使用Spring AOP的基本步骤。通过配置AOP设置、创建切面类和目标对象,就可以实现对目标对象的切面织入。

    需要注意的是,Spring AOP目前只支持方法级别的切面,不支持对类级别的切面。此外,Spring AOP仅支持代理形式的AOP,而不支持编译期的AOP。如果需要使用更高级的AOP功能,可以考虑使用AspectJ框架。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部