SpringBean面试题
Spring是什么?AOP、IOC的解释?
IOC:控制反转或反转控制(Inverse of Control),也可以称之为依赖倒置。主要作用于对象的创建和管理;IOC主要是解决对象之间的耦合问题
AOP: Aspect oriented Programming ⾯向切⾯编程/⾯向⽅⾯编程,AOP是OOP的延续。
就Spring的角度看,AOP最大的作用就是在于提供事务管理的能力。在不改变原有的业务逻辑情况下,增强横切逻辑代码,解耦并避免横切逻辑代码的重复。
Spring容器的创建过程
1)、Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息;
1)、xml注册bean;
2)、注解注册Bean;@Service、@Component、@Bean、xxx
2)、Spring容器会合适的时机创建这些Bean
1)、用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中;
2)、统一创建剩下所有的bean的时候;finishBeanFactoryInitialization();
3)、后置处理器;BeanPostProcessor
1)、每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能;
AutowiredAnnotationBeanPostProcessor:处理自动注入
AnnotationAwareAspectJAutoProxyCreator:来做AOP功能;
xxx…
增强的功能注解:
AsyncAnnotationBeanPostProcessor
…
4)、事件驱动模型;
ApplicationListener;事件监听;
ApplicationEventMulticaster;事件派发:
配置bean有哪几种方式?
1.xml: <bean class=“com.tuling.UserService” id=>
2.注解: @Component(@Controller 、@Service、 @Repostory)反射调用构造方法//需要配置扫描包 context:annotation-config/
3.javaConfig: @Bean @Configuration可以自己控制实例化过程
4.@lmport
实例化bean有哪几种方式?
1.构造器方式(反射)–xml,@Component
2.静态工厂
3.实例工厂(@bean)
4.bean工厂
Spring支持的几种bean的作用域?
- singleton : bean在每个Spring ioc容器中只有一个实例。
- prototype: 一个bean的定义可以有多个实例
- request: 每次http请求都会创建一个bean, 该作用域仅在基于web的Spring ApplicationContext情形下有效。
- session:在一个HTTP Session中,一个bean定义对应一 个实例。 该作用域仅在基于web的Spring ApplicationContext情形下有效。
- global-session: 在-一个全局的HTTP Session中, - -个bean定义对应-个实例。 该作用域仅在基于web的Spring ApplicationContext情形下有效。
单例bean的优势?
由于不会每次都新创建新对象所以有一下几个性能上的优势:
- 减少了新生成实例的消耗新生成实例消耗包括两方面,第一,spring会通过反射或者cglib来生成bean实例这都是耗性能的操作,其次给对象分配内存也会涉及复杂算法。
- 减少jvm垃圾回收由于不会给每个请求都新生成bean实例,所以自然回收的对象少了。
- 可以快速获取到bean因为单例的获取bean操作除了第一次生成之外其余的都是从缓存里获取的所以很快。
单例bean是线程安全的吗?
单例bean情况如果在类中声明成员变量,并且有读写操作(有状态)线程不安全但是只要把成员变量声明到方法中(无状态)单例bean就是安全的
如何处理线程并发问题?
- 设置为多例的
- 将成员变量放在threadlocal中
- 同步锁syn(变成串行了会影响吞吐量)
Spring是如何实现单例bean的?
Spring是通过单例注册表实现单例的,Ioc容器维护了一个bean表格,当需要一个单例bean时,从表格中获取,没有获取到的,向表格注册一个新的bean。
不同方式的自动装配 ?
- no:默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。
- byName :通过参数名自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。
- byType:通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。
- constructor:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
- autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。
bean的四种形态?
概念态–刚在标签里定义还没有加载在new Applicationtext之后进入IOC的创建 进入定义态
定义态–把id,lazy,scop等定义信息传到BeanDefinition当中再通过BeanFactory把定义态创建成纯净态
纯净态–完成创建但是没有注入属性信息(他是存在二级缓存中用来解决循环依赖)
成熟态–属性注入完成
Spring Bean 的生命周期?
- 通过构造器创建bean实例(无参数构造)
- 为bean的属性设置值和对其他bean引用(调用set方法)
- 把bean实例传递给bean后置处理器的方法postProcessBeforeInitialization
- 调用bean的初始化方法(需要进行配置初始化的方法)
- 把bean实例传递给bean后置处理器的方法postProcessAfterInitialization
- bean可以使用了(对象获取到了)
- 当容器关闭时,调用bean的销毁的方法(需要进行配置销毁的方法)