1.spring中bean的作用域有哪些(spring支持多少种scope)
(1)singleton
代表单例,ioc容器中只创建一个bean对象,每次获取的都是同一个
(2)prototype
不是单例,每次都会从容器中拿到一个新的bean对象
2.spring中的单例bean的线程安全问题了解吗(状态)
在多线程并发环境下,多个线程对同一个bean对象中的非静态变量进行写操作的时候,
就会发生线程安全的问题。
解决方式:尽量在bean中不创建非静态变量;另一种方式是使用threadlocal(具体见csdn收藏),threadlocal是jdk.java.lang下的类,为变量在每个线程中都创建一个副本,每个线程可以访问自己内部的变量副本,不会和其他线程的局部变量冲突,实现线程间的数据隔离。
3.将一个类声明为spring的bean的注解有哪些
@component
@service
@repository
@controller
4.@component和@bean的区别
@component标注在类上,通用的注解,当不知道该对象属于哪层时就用该注解;
@bean标注在方法上,主要创建第三方库中的类的bean对象,将其注入到ioc容器中交给spring管理;
5.spring中的bean的生命周期
(1)创建过程:
调用构造函数实例化bean,设置bean的属性;
根据实现的aware接口设置依赖信息;
- aware接口是为了感知到自身的属性,在bean中设置对容器的感知,beannameaware 接口知道自己在容器中的名字
调用后置处理器的前置初始化方法完成初始化前的自定义逻辑;
调用afterpropertiesset方法做属性被设定后的自定义事情;
调用bean自身的初始化方法;
调用后置处理器的后置初始化方法完成初始化后的自定义逻辑;
(2)bean初始化完成,使用
(3)销毁过程:
如果实现了disposablebean的destroy方法,则调用 ;
如果实现了bean自身的销毁方法,则调用。
6.spring怎么解决循环依赖问题
spring对循环依赖的处理有三种情况;
(1)构造器的循环依赖:处理不了,抛异常
(2)非单例的循环依赖:处理不了
(3)单例下的set循环依赖:三级缓存处理
前提:单例对象初始化分三步:通过构造器实例化对象 - 填充属性 - 调用自身定义的初始化方法。循环依赖主要发生在第一,第二步,构造器循环依赖和属性循环依赖。
问题:a的属性依赖b对象,b的属性依赖a对象。
解决:三级缓存
三级-singletonfactories-存放bean工厂对象;
二级-earlysingletonobject-存放原始bean对象;
一级-singletonobjects-存放完全初始化好的bean,从缓存中取出bean可以直接使用。
具体解决:
a首先进行初始化第一步,实例化,将自己放入1,a发现自己需要b,b实例化,在123中找a,在3找到,将自己放入1
7.spring的内部bean了解吗
将一个bean用作另一个bean的属性时,将这个bean声明为内部bean;
8.spring的装配是什么
bean在spring容器中组合在一起的时候,叫做bean装配。可以进行自动装配,byname\bytype
9.自动装配有什么局限
普通类型无法自动装配;
有覆盖的可能,<property>或<constructor-arg>设置指定依赖会覆盖自动装配
10.spring中出现同名bean怎么办
(1)同一个配置文件中出现同名bean以最上面定义的为准;
(2)不同配置文件中出现同名bean,后解析的配置文件会覆盖先解析的配置文件;
(3)同文件中componentscan和bean出现同名,bean的生效;componentscan优先级低