spring源码之利用BeanPostProcessor模拟AOP

本文介绍了AOP(面向切面编程)的概念,它旨在解决编程中的横切关注点,如日志记录和事务管理。Spring AOP通过BeanPostProcessor在bean初始化时实现对目标bean的代理,以实现AOP的功能。文中给出了一个例子,展示了如何使用JDK动态代理在Spring中实现AOP,当调用特定bean的方法时,会在执行前后插入自定义的逻辑。
摘要由CSDN通过智能技术生成

如何理解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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木小同

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值