前言

拿出上一篇的内容:

AnnotationAwareAspectJAutoProxyCreator
extends AspectJAwareAdvisorAutoProxyCreator
AspectJAwareAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator
AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator
AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware

正文

在这里和ioc相关的有两个东西一个是:

SmartInstantiationAwareBeanPostProcessor,BeanFactoryAware

SmartInstantiationAwareBeanPostProcessor 表示bean 在注入容器前后做些什么。

那么联系AOP和 IOC 的联系,那么就来分析继承IOC的东西吧。

在BeanFactoryAware 中:

public interface BeanFactoryAware extends Aware {
void setBeanFactory(BeanFactory var1) throws BeansException;
}

那么AbstractAutoProxyCreator 继承它,肯定会实现setBeanFactory。

找到这个方法:

public void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}

继续往上看:

AbstractAdvisorAutoProxyCreator 看看是否有覆盖setBeanFactory的东西。

public void setBeanFactory(BeanFactory beanFactory) {
super.setBeanFactory(beanFactory);
if (!(beanFactory instanceof ConfigurableListableBeanFactory)) {
throw new IllegalArgumentException("AdvisorAutoProxyCreator requires a ConfigurableListableBeanFactory: " + beanFactory);
} else {
this.initBeanFactory((ConfigurableListableBeanFactory)beanFactory);
}
}

果然上面有覆盖的东西。

异常的先不看,因为异常是细节,然后如果不出问题的话,那么会执行:

this.initBeanFactory((ConfigurableListableBeanFactory)beanFactory);

看下这个:initBeanFactory

protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {
this.advisorRetrievalHelper = new AbstractAdvisorAutoProxyCreator.BeanFactoryAdvisorRetrievalHelperAdapter(beanFactory);
}

那么继续往上AspectJAwareAdvisorAutoProxyCreator ,这下看的就是是否覆盖了setBeanFactory 或者initBeanFactory:

查到到其并没有覆盖。

继续到最上层:AnnotationAwareAspectJAutoProxyCreator,发现覆盖了initBeanFactory:

protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {
super.initBeanFactory(beanFactory);
if (this.aspectJAdvisorFactory == null) {
this.aspectJAdvisorFactory = new ReflectiveAspectJAdvisorFactory(beanFactory);
} this.aspectJAdvisorsBuilder = new AnnotationAwareAspectJAutoProxyCreator.BeanFactoryAspectJAdvisorsBuilderAdapter(beanFactory, this.aspectJAdvisorFactory);
}

那么好的,看断点。

在AbstractAdvisorAutoProxyCreator:

在这里不用猜,一般都是set进入的。

那么看下在setFactory 之前做了什么。

首先加载config。

AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(MainConfigofAOP.class);

然后注册组件:

public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
this();
this.register(componentClasses);
this.refresh();
}

this.refresh();

刷新容器。

看下刷新容器做了什么。

记得在我上一个里面,我写道,AOP之所以与IOC 紧密挂钩是因为,IOC 注册容器的时候,AOP会监听到。

那么来看下refresh做了什么。

    public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
this.prepareRefresh();
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
this.prepareBeanFactory(beanFactory); try {
this.postProcessBeanFactory(beanFactory);
this.invokeBeanFactoryPostProcessors(beanFactory);
this.registerBeanPostProcessors(beanFactory);

this.registerBeanPostProcessors(beanFactory); 这个就是注册了容器创建的后置处理器,也就是说在容器创建之前监听,说白了就是拦截器。

看下里面是怎么注册的。

进入registerBeanPostProcessors进行处理:

for(int var10 = 0; var10 < var9; ++var10) {
ppName = var8[var10];
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
} else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
} else {
nonOrderedPostProcessorNames.add(ppName);
}
}

把以前注册过的容器做一个处理:

如果实现接口 PriorityOrdered.class优先注册。

然后是Ordered.class 注册容器。

然后是注册既没有实现PriorityOrdered.class 和 Ordered.class的注册容器。

前面把他们分完类之后,那么就开始去注册容器了,看下如何注册容器的。

while(var14.hasNext()) {
String ppName = (String)var14.next();
BeanPostProcessor pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}

注册容器就是去getBean。

然后去执行:

 if (mbd.isSingleton()) {
sharedInstance = this.getSingleton(beanName, () -> {
try {
return this.createBean(beanName, mbd, args);
} catch (BeansException var5) {
this.destroySingleton(beanName);
throw var5;
}
});
bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}

通过createBean 去创建然后注册到容器中。

createBean 里面有一个:

 beanInstance = this.doCreateBean(beanName, mbdToUse, args);

也就是有一个doCreateBean。

创建完bean 后然后执行:

this.populateBean(beanName, mbd, instanceWrapper);

也就是给属性赋值。

然后初始化initializeBean:

exposedObject = this.initializeBean(beanName, exposedObject, mbd);

看下如何初始化Bean。

1.this.invokeAwareMethods(beanName, bean);

看下invokeAwareMethods 有什么。

private void invokeAwareMethods(String beanName, Object bean) {
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware)bean).setBeanName(beanName);
} if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = this.getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware)bean).setBeanClassLoader(bcl);
}
} if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware)bean).setBeanFactory(this);
}
} }

看一下这个注册的bean 是否有Aware注解,setBeanFactory。然后就来到了,我们断点的地方。

当invokeAwareMethods执行完毕后:

wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

给方法增加监听器,然后就ok了。

面向切面编程AOP[四](java AnnotationAwareAspectJAutoProxyCreator与ioc的联系)的更多相关文章

  1. AOP面向切面编程的四种实现

     一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...

  2. 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制

    spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...

  3. Spring学习手札(二)面向切面编程AOP

    AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...

  4. Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)

    一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...

  5. Spring框架学习笔记(2)——面向切面编程AOP

    介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...

  6. Spring之控制反转——IoC、面向切面编程——AOP

      控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...

  7. 【串线篇】面向切面编程AOP

    面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据 ...

  8. Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...

  9. 设计模式之面向切面编程AOP

    动态的将代码切入到指定的方法.指定位置上的编程思想就是面向切面的编程. 代码只有两种,一种是逻辑代码.另一种是非逻辑代码.逻辑代码就是实现功能的核心代码,非逻辑代码就是处理琐碎事务的代码,比如说获取连 ...

  10. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

随机推荐

  1. jenkins 钉钉机器人插件

    官方文档: https://jenkinsci.github.io/dingtalk-plugin/guide/getting-started.html#%E6%B3%A8%E6%84%8F 注意:系 ...

  2. 我和我的DBA之路

    这几天,突然想写写这些年的工作总结,毕业至今快20年的回顾. 想到20年前,在做毕业设计的时候,当时是学的机械工程类专业,因为带毕业设计的老师兼职企业有个门户网站的需求,而我又会做点网站设计,带的老师 ...

  3. TCP/IP协议 ------图解TCP/IP协议 全书知识点真理

    一. 之前在网上大致浏览了<图解TCP/IP>这本书前面的几章,是日本人写的,没有细看,感觉写的很容易理解,但是最近又翻看网后面看到的时候感觉很多累赘的地方,不知道是翻译的问题,还是书本身 ...

  4. Java面向对象(中)--super/多态/向下转型/equals/toString/包装类/单元测试工具

    java对象 方法重写 子类继承父类以后,可以对父类同名同参数的方法,进行覆盖操作 重写后,当创建子类对象以后,通过子类对象调用子父类中同名同参数的方法时,执行的是子类重写父类的方法. 如何区分方法重 ...

  5. vue2init vue2z

    <template> <div> </div> </template> <script> export default { name: 'b ...

  6. thinkphp phpstorm xdebug 环境配置

    php5.6 环境配置 phpStudy 开启 Apache 网站 的php版本选择7的 (7的可能自己需要装一下) 获取xdebug前的 检查准备 打开 http://localhost:8033/ ...

  7. Windows App SDK? C++/WinRT? 狗都不学!

    空荡荡的官网开发文档,打开直接心凉一截! 只写个Hello World教程就敢宣布自己为"跨时代"新产品? 什么"C++桌面开发者的狂欢"?什么Project ...

  8. CMAKE的学习

    下面我们来介绍Cmake Cmake 我们着重介绍一下CMAKE,是因为CMAKE现在用的人比MAKEFILE多一些,也更好理解,编写一些. 1 安装 cmake 1.1 卸载已经安装的旧版的CMAK ...

  9. slf4j 和 log4j2 架构设计

    1.日志框架背景 2.为什么会有 slf4j 和 log4j2 搭配一说? 3.log4j2 3.1.背景及应用场景 3.2.功能模块 4.slf4j 4.1.背景及应用场景 4.2.功能模块 5.s ...

  10. 亮点抢先看!4月16-17日,百度Create大会开设“AI公开课”,大咖带你打造赚钱工具

    3月16日,2024百度Create AI开发者大会正式开放售票,嘉宾套票定价399元.据悉,本次大会以"创造未来(Create the Future)"为主题,设有20+深度论坛 ...