AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在通过分离横切关注点来提高模块化程度。横切关注点是指那些影响多个模块的功能,如日志记录、事务管理、安全性等。AOP通过动态代理技术实现这些功能,从而在不修改原有代码的情况下增强程序的功能。
假设我们有一个简单的服务类 UserService
,我们希望在调用其方法时记录日志。
// UserService.java
public class UserService {
public void addUser(String username) {
System.out.println("Adding user: " + username);
}
}
// LogAspect.java
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class LogAspect {
@Before("execution(* com.example.UserService.addUser(..))")
public void logBeforeAddUser() {
System.out.println("Logging before adding user");
}
}
// AppConfig.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
@Bean
public LogAspect logAspect() {
return new LogAspect();
}
}
// Main.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);
userService.addUser("Alice");
}
}
Logging before adding user
Adding user: Alice
@EnableAspectJAutoProxy
注解已添加到配置类中。execution
表达式时,确保包路径、类名、方法名和参数类型正确。@Pointcut
注解定义复杂的切点表达式,提高可读性。@Before
、@After
等注解的使用。通过以上步骤和示例代码,可以有效地使用AOP动态代理来实现横切关注点的模块化和复用。
领取专属 10元无门槛券
手把手带您无忧上云