1. 创建目标类: 创建一个简单的目标类,比如一个服务类。
package com.example.service;
public class MyService {
public void doSomething() {
System.out.println("Doing something...");
}
public void doAnotherThing() {
System.out.println("Doing another thing...");
}
}
2. 创建切面类: 创建一个切面类,使用@Aspect注解和相关注解来定义切点和通知。
package com.example.aspect;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class MyAspect {
// 定义切点
@Pointcut("execution(* com.example.service.*.*(..))")
public void myPointcut() {}
// 定义通知
@Before("myPointcut()")
public void beforeAdvice() {
System.out.println("Before advice executed");
}
}
3. 配置Spring: 在Spring配置文件或通过Java配置中启用AspectJ自动代理。
package com.example.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration
@ComponentScan(basePackages = "com.example")
@EnableAspectJAutoProxy
public class AppConfig {
}
4. 使用代理: 在应用程序中使用Spring IoC容器,获取代理对象,并调用目标方法。
package com.example;
import com.example.config.AppConfig;
import com.example.service.MyService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainApp {
public static void main(String[] args) {
// 使用Java配置类加载Spring上下文
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 获取代理对象
MyService myService = context.getBean(MyService.class);
// 调用目标方法,将触发通知
myService.doSomething();
// 关闭Spring上下文
context.close();
}
}
在这个例子中,@Aspect注解用于标记MyAspect类为切面类,@Pointcut注解定义了切点,它匹配com.example.service包中的所有方法。@Before注解定义了一个前置通知,它在切点匹配的方法执行前执行。
通过@EnableAspectJAutoProxy注解,Spring会自动创建代理对象,并将切面应用于目标对象。
这种基于AspectJ注解的AOP方式更加灵活,而且能够更直观地将横切关注点与业务逻辑分离。
转载请注明出处:http://www.pingtaimeng.com/article/detail/6960/Spring