如何理解AOP?
面向切面编程是相对于面向对象编程来说的,面向对象是一个自上而下的编程过程。而在我们编程的过程中就会衍生一些横切面上的问题,比如说日志的记录,事务的启动,比如说属性的校验。而所谓的AOP呢,就是来解决这些问题,把这些内容统一来处理,这就是AOP要达到的编程目标。
如何理解spring aop
spring aop是为了实现AOP目标的一种手段,在bean容器初始化过程中会实现很多的bean。如果有些Bean是需要被AOP拦截的,那么spring在实例化的过程中,bean的生命周期初始化流程的最后,通过扩展BeanPostProcessor对象after方法的方式,来对这个bean进行代理。
@ComponentScan("com.spring.lifeCycle")
public class LifeCycleConfig {
}
@Component
public class D implements F{
@Autowired
E e;
public E getE() {
return e;
}
@Override
public void m0(){
System.out.println("m0-D");
}
}
public interface F {
void m0();
}
@Component
public class E {
public void m0(){
System.out.println("m0-E");
}
}
@Component
public class JDKProxyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if("d".equals(beanName)){
ClassLoader classLoader = this.getClass().getClassLoader();
Class<?>[] interfaces = bean.getClass().getInterfaces();
Object proxy = Proxy.newProxyInstance(classLoader, interfaces, new MyInvocationHandler(bean));
return proxy;
}
return bean;
}
class MyInvocationHandler implements InvocationHandler{
Object o;
public MyInvocationHandler(Object o){
this.o = o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("aop--before---- ");
Object invoke = method.invoke(o, args);
System.out.println("aop--after----");
return invoke;
}
}
}
@Test
public void defaultCycle(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
context.getBean(F.class).m0();
context.getBean(E.class).m0();
}
aop--before----
m0-D
aop--after----
m0-E
|