返回

Spring源码-10:bean的实例化(7)AOP-早期的aop

后端

前言

回顾Spring早期的AOP实现,可以发现它使用了接口+ProxyFactoryBean的方式设置代理,这对于理解Spring AOP的演进具有重要意义。

正文

一、接口+ProxyFactoryBean的方式设置代理

  1. 创建接口
public interface UserService {
    public void save(User user);
    public void update(User user);
    public void delete(User user);
    public List<User> findAll();
}
  1. 创建实现类
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<>();
    }
}
  1. 创建配置类
@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();
    }
}
  1. 创建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;
    }
}
  1. 启动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实现。