引言
我们上一篇文章中,已经完成了BeanPostProcessor实现,这篇文章着重讲述AOP如何实现。
让我们开始吧!😊
本文所有的代码都在这个项目工程里,大家需要的时候可以随时取用。传送门
aop也就是切面编程,实际在我们的spring中其实就是生产一个代理类,这个代理类包含了原有类的操作,然后又增强了一些其他的操作。
我们可以想到,既然是代理类,那么肯定是原始类已经生产完之后,才回根据它生成,不然后就会导致代理类和被代理对象的不一致。
显而易见,我们可以在BeanPostProcessor中的afterinit方法中去实现这个逻辑,我们截取关键代码:
public Object postProcessAfterInitialization(Object bean, String beanName) {
if(beanName.equals("userService")){
System.out.println("after init bean processor");
}
//这里只是区分下让逻辑分开,其实可以和上面合并在一起
if(beanName.equals("userService")){
//创建代理类,这里使用jdk的动态代理,理由很简单无需引用其他三方的包
//但是需要在UserService中实现一个接口,具体可以看我们的代码
return Proxy.newProxyInstance(SelfTestBeanPostProcessor.class.getClassLoader(),
bean.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//这里写的就是切面的逻辑
System.out.println("aop logic-----");
//这里调用原来的方法
return method.invoke(bean, args);
}
});
}
return bean;
}
完成之后,执行相关测试代码:
before init bean processor
initializing bean —-afterPropertiesSet
after init bean processor
aop logic
com.zhu.service.OrderService@6f94fa3e|userService
有我们想要的效果,这就是一个简单的aop实现。
自此,我们完成了我们的目标,写了一个简单的spring,比较清晰的了解了spring的生命周期,为我们后续理解spring源码做了一个简单的指引。