- 什么是Spring bean?JavaBean和SpringBean和对象的区别?
- 一个 Spring Bean 定义 包含什么?
- 配置Bean有哪几种方式
- 16.解释Spring支持的几种bean的作用域
- 单例Bean的优势是什么?
- 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的注册顺序是由什么决定的?)
至少记住这句话:构成应用程序主干并由IoC容器管理的对象称为bean。bean是一个由Spring IoC容器实例化、组装和管理的对象。
- 例子:
至少记住这句话:一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。
配置Bean有哪几种方式至少记住这句话:xml、注解、import
1.xml:
2.注解:@Component(@Controller 、@Service、@Repostory) 前提:需要配置扫描包 反射调用构造方法
3.javaConfig: @Bean 可以自己控制实例化过程
4.@import 3种方式
@Bean一般都是标注在方法上,方法返回的是对象。
-例子:
import:
至少记住这句话:singleton单例,prototype多例,request请求,session会话,application全局web应用
Spring框架支持以下五种bean的作用域:
- singleton : bean在每个Spring ioc 容器中只有一个实例。
- prototype:一个bean的定义可以有多个实例。
- request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
- session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情
形下有效。 - application:全局 Web 应用程序范围的范围标识符。
注意: 缺省的Spring bean 的作用域是Singleton。使用 prototype 作用域需要慎重的思考,因为频繁创建和销毁 bean
会带来很大的性能开销。
五种
默认的作用域是单例
至少记住这句话:减耗,减垃圾,获取bean更快。
由于不会每次都新创建新对象所以有一下几个性能上的优势:
1.减少了新生成实例的消耗新生成实例消耗包括两方面,第一,spring会通过反射或者cglib来生成bean实例这都是耗性能的操作,其次给对象分配内存也会涉及复杂算法。 提供服务器内存的利用率 ,减少服务器内存消耗
2.减少jvm垃圾回收由于不会给每个请求都新生成bean实例,所以自然回收的对象少了。
3.可以快速获取到bean因为单例的获取bean操作除了第一次生成之外其余的都是从缓存里获取的所以很快。
只创建一次节省内存,而且获取也快
就是bean和bean之间互相依赖起来
注解的先执行了,接口的后执行
ioc加载bean创建时,会实例化,实例化完属性注入,解析注解,发现依赖,然后再去ioc容器找,然后没找到又创建bean又实例化属性注入解析注解,发现又依赖回来,如果又没拿到就去创建。。。。闭环死循环。。。
为啥
才创建动态代理呢?如果实例化之后直接调用创建动态代理,不存函数接口
人家循环依赖B线程在那里创建动态代理是被迫的,如果那时赋的是实例那就有问题了。正常的bean还是在初始化严格遵循bean的生命周期在初始化创建动态代理。
为啥要三级缓存呢?二级缓存行不行呢?
可以啊,直接在这里动态代理,也就是不再存函数接口了这里,
多例bean不会用缓存进行存储
初始化有生命周期回调,aop,初始化之前获取到的对象是没有创建动态代理的对象。
实例化之后没有属性注入、没有初始化的Bean都是不完整的
两个线程进来线程一实例化完放进三级缓存,线程二从三级缓存就直接拿走
如何避免呢?
不锁一级是为了已经创建好的直接给线程2拿走啊,别影响了性能,不然创建好的你也锁全都等你没创建的创建啊?
先扫描再解析吧???
所以就可以
进行扩展
循环所有BeanDefinition创建完Bean之后会调用Smart扩展接口,然后发布refreshevent的事件,ioc加载就是在refresh方法里体现的,说明ioc加载完了,加载完的事件就是这个。



