spring源码之利用BeanPostProcessor模拟AOP

如何理解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

你可能感兴趣的:(spring源码,spring,java,代理模式,spring源码,aop)