返回
Spring源码-10:bean的实例化(7)AOP-早期的aop
后端
2024-02-01 15:59:29
前言
回顾Spring早期的AOP实现,可以发现它使用了接口+ProxyFactoryBean的方式设置代理,这对于理解Spring AOP的演进具有重要意义。
正文
一、接口+ProxyFactoryBean的方式设置代理
- 创建接口
public interface UserService {
public void save(User user);
public void update(User user);
public void delete(User user);
public List<User> findAll();
}
- 创建实现类
public class UserServiceImpl implements UserService {
public void save(User user) {
System.out.println("save user");
}
public void update(User user) {
System.out.println("update user");
}
public void delete(User user) {
System.out.println("delete user");
}
public List<User> findAll() {
System.out.println("find all users");
return new ArrayList<>();
}
}
- 创建配置类
@Configuration
public class AopConfig {
@Bean
public UserService userService() {
return new UserServiceImpl();
}
@Bean
public ProxyFactoryBean proxyFactoryBean() {
ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean();
proxyFactoryBean.setTarget(userService());
proxyFactoryBean.setInterceptorNames("logInterceptor");
return proxyFactoryBean;
}
@Bean
public LogInterceptor logInterceptor() {
return new LogInterceptor();
}
}
- 创建aop拦截器
public class LogInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("log before");
Object result = invocation.proceed();
System.out.println("log after");
return result;
}
}
- 启动Spring容器
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class);
UserService userService = context.getBean(UserService.class);
userService.save(new User());
}
}
二、这种方式的优缺点
-
优点:
- 实现简单,易于理解
-
缺点:
- 需要手动创建代理工厂和拦截器
- 无法实现Spring AOP的全部功能,如pointcut、advice等
- 无法实现Spring AOP的透明代理,需要手动注入代理对象
总结
Spring早期的AOP实现通过接口+ProxyFactoryBean的方式设置代理,虽然实现简单,但无法实现Spring AOP的全部功能。随着Spring的发展,这种方式逐渐被废弃,取而代之的是基于AspectJ的AOP实现。