IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> spring源码之利用BeanPostProcessor模拟AOP -> 正文阅读

[Java知识库]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
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-03 09:21:59  更:2022-05-03 09:22:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:57:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码