Spring AOP基于xml的方式实现

  • 创建目标类
    首先,创建一个简单的服务类,该类包含一些业务方法。
package com.powernode.spring6.service2;

public class MyService {
    public void doSomething() {
        System.out.println("Doing something in MyService...");
    }

    public String doSomethingElse(String input) {
        System.out.println("Doing something else in MyService with input: " + input);
        return "World " + input;
    }
}
  • 创建切面类
package com.powernode.spring6.service2;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class JournalAspect {
    // 前置通知
    public void beforeAdvice(JoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
    }

    // 后置通知
    public void afterAdvice(JoinPoint joinPoint) {
        System.out.println("After method: " + joinPoint.getSignature().getName());
    }

    // 环绕通知
    public Object aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("Entering method: " + proceedingJoinPoint.getSignature().getName());
        Object result = proceedingJoinPoint.proceed(); // 继续执行目标方法
        System.out.println("Exiting method: " + proceedingJoinPoint.getSignature().getName());
        return result;
    }
}
  • 配置Spring XML
<?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:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">


    <!-- 定义服务bean -->
    <bean id="myService" class="com.powernode.spring6.service2.MyService"/>

    <!-- 定义切面bean -->
    <bean id="journalAspect" class="com.powernode.spring6.service2.JournalAspect"/>

    <!--启用AOP配置-->
    <aop:config>
    <!-- 定义一个切点,匹配com.example.myapp.service包下所有类的所有方法 -->
        <aop:pointcut id="serviceMethods" expression="execution(* com.powernode.spring6.service2.*.*(..))"/>

        <!--定义前置/后置/环绕通知-->
        <aop:aspect ref="journalAspect">
            <aop:around method="aroundAdvice" pointcut-ref="serviceMethods"/>
        </aop:aspect>
    </aop:config>
  • 测试:
    @Test
    public void aspectTest(){
        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring-aspect.xml");
        MyService myService = classPathXmlApplicationContext.getBean("myService", MyService.class);
//        myService.doSomething();
        String 你好 = myService.doSomethingElse("你好");
        System.out.println(你好);
    }
posted @ 2024-06-11 00:25  文采杰出  阅读(18)  评论(0)    收藏  举报