- 1.什么是Spring
- 3.Spring的优缺点是什么
- 4.什么是Spring IOC容器?有什么作用?优点是什么?
- 5.Spring IoC的实现机制是什么
- 6.IoC和DI的区别是什么
- 7.紧耦合和松耦合有什么区别?如何编写松耦合代码?
- 8.BeanFactory的作用
- 9.BeanDefinition的作用
- 10.BeanFactory和ApplicationContext有啥区别?
- 11.BeanFactory和FactoryBean有什么区别?
- 12.说下Spring IOC容器的加载过程
- 13.Spring IoC有哪些扩展点,在什么时候调用?
- 14.什么是Spring bean?JavaBean和SpringBean和对象的区别?
- 15.配置Bean有哪几种方式
- 16.解释Spring支持的几种bean的作用域
- 17.单例Bean的优势是什么?
- 18.Spring的Bean是线程安全的吗?
- 19.Spring如何处理线程并发问题?
- 20.Spring实例化Bean有哪几种方式?
- 21.什么是Bean装配?什么是Bean的自动装配?
- 22.自动注入有什么限制吗?
- 23.自动装配的方式有几种?
- 24.Bean的生命周期回调方法和执行顺序
- 25.Spring在加载过程中Bean有哪几种形态
- 26.解释Spring框架中bean的生命周期
- 27.Spring是如何解决循环依赖的(难)
- 28.Spring是如何帮我们在并发下避免获取不完整的Bean?
- 29.描述BeanDefinition的加载过程
- 30.如何在所有BeanDefinition注册完后做扩展?
- 31.如何在Spring所有Bean创建完后做扩展?
- 32.Spring容器启动时,为什么先加载BeanFactoryPostProcess
- 33.Bean的生产顺序是由什么决定的?(BeanDefination的注册顺序是由什么决定的?)
- 34.Spring有哪几种配置方式
- 35.JavaConfig是如何替代spring.xml的?
- 36.@Component啊啥的注解啥区别
- 37.@import可以有几种用法?
- 38.如何让自动注入没有找到依赖Bean时不报错
- 39.如何让自动注入找到多个依赖Bean时不报错
- 40.@Autowired注解有什么用
- 41.@Autowired和@Resource之间的区别
- 42.@Autowired注解自动装配过程是怎样的?
- 43.@Configuration的作用及解析原理
- 44.@Bean的方法调用是怎么保证单例的?
- 45.要将一个第三方的类配置成Bean有哪些方式?
- 46.为什么@ComponentScan不设置basePackage也会扫描?
- 47.什么是AOP?能做什么?
- 48.解释一下Spring AOP中常见的概念名词
- 49.Spring通知有哪些类型?
- 50.Spring Aop和AspectJ Aop有什么区别?
- 51.JDK动态代理和CGLIB动态代理的区别
简单工厂+反射(BeanFactory、创建对象)
工厂模式加反射机制
拿到原本实例
概念态到注册态,通过此Bean工场的后置处理器方法对外扩展,对内解耦。
注册完,生产
单例不是懒加载不是抽象才会在ioc加载为你生产
找到就返回,没有就创建
创建呢,首先实例化(反射)
实例化完就到纯净态
然后属性赋值
DI的体现
然后初始化
创建Aop,调其他扩展接口
Bean创建完后就放到Map当中
IOC加载过程从创建一个容器开始,记住四个点:
概念态:配置的Bean,还没有真正的加载
定义态
会解析配置类
根据配置是扫描包,拿到所有.class,看看上面有没有注解。如果有就会
这就是概念态到定义态
ioc给的拓展
还有监听器啊啥的
下一个就是纯净态(已经实例化完成),还没有进行依赖注入
从定义态到纯净态就是BeanFactory负责生产了,开始生成前判断是否符合标准,判断是不是单例是不是抽象是不是懒加载,如果不是懒加载,不是抽象,是单例,才会在ioc加载时立马生产。
生产过程会去容器看有没有已经创建好,有就返回,没有才创建。
生产过程:1、实例化(反射),得到纯净态的Bean,然后解析DI,注入属性,调回调、Aware接口等对外扩展接口,这俩都是在初始化的时候做的
别忘了初始化时也会创建Aop,当然是需要实现Aop才会去创建Aop动态代理
最后创建完成,放到Map中
refresh方法体现了整个IoC的加载过程
这个方法中注册DeFination
两个扩展接口的方法
没配置就想实现注册用这个
玩一下
BeanDefination就是Bean之前的一个形态
工厂后置处理器
咋玩呢?
其实上一个和这个是子父关系
重写这个方法的原因就是这个
负责Bean生产过程中一切
可以做很多事情
可以拿到定义类去修改
注册单例
销毁Bean
注册的先调用啊
生产过程中的扩展接口
初始化也有一堆扩展接口哈
玩一下
不同的Aware提供的东西也不同
提供名字
提供BeanFactory
刚才的那个扩展接口是在注册并定义的时候调用的
Aware是初始化的时候,调用时机不一样
生命周期回调又怎么玩呢?
每一个都有三种:
初始化
通过注解初始化阶段自动调用
销毁也是三种
总结
第一种
@Bean一般都是标注在方法上,方法返回的是对象。
import:
五种
默认的作用域是单例
只创建一次节省内存,而且获取也快
就是bean和bean之间互相依赖起来
注解的先执行了,接口的后执行
ioc加载bean创建时,会实例化,实例化完属性注入,解析注解,发现依赖,然后再去ioc容器找,然后没找到又创建bean又实例化属性注入解析注解,发现又依赖回来,如果又没拿到就去创建。。。。闭环死循环。。。
为啥
才创建动态代理呢?如果实例化之后直接调用创建动态代理,不存函数接口
人家循环依赖B线程在那里创建动态代理是被迫的,如果那时赋的是实例那就有问题了。正常的bean还是在初始化严格遵循bean的生命周期在初始化创建动态代理。
为啥要三级缓存呢?二级缓存行不行呢?
可以啊,直接在这里动态代理,也就是不再存函数接口了这里,
多例bean不会用缓存进行存储
初始化有生命周期回调,aop,初始化之前获取到的对象是没有创建动态代理的对象。
实例化之后没有属性注入、没有初始化的Bean都是不完整的
两个线程进来线程一实例化完放进三级缓存,线程二从三级缓存就直接拿走
如何避免呢?
不锁一级是为了已经创建好的直接给线程2拿走啊,别影响了性能,不然创建好的你也锁全都等你没创建的创建啊?
先扫描再解析吧???
所以就可以
进行扩展
循环所有BeanDefinition创建完Bean之后会调用Smart扩展接口,然后发布refreshevent的事件,ioc加载就是在refresh方法里体现的,说明ioc加载完了,加载完的事件就是这个。
@Component是后面仨的元注解
控制层,业务逻辑层,数据访问层
主要是提高代码阅读性
这个是更靠后的BeanDifination的注册顺序啊
只要不是Bean定义的注册器的后置处理器,它的顺序都是最后,倒二的哈
作用:
原理:
import干预不了实例化的过程的,因为直接拿类放射了
都是操控BeanDefinition,只不过他的顺序是最后的
调的目的是和环绕通知一致
前置、环绕、后置通知
编译时帮修改好了.class文件
因为你要单独编译,增加了开发成本,所以spring就用jdk实现aop,spring aop虽用到了AspectJ,但
底层没用动态织入修改字节码文件,因为它要单独编译器。



