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的作用域?

  1. singleton : bean在每个Spring ioc容器中只有一个实例。
  2. prototype: 一个bean的定义可以有多个实例
  3. request: 每次http请求都会创建一个bean, 该作用域仅在基于web的Spring ApplicationContext情形下有效。
  4. session:在一个HTTP Session中,一个bean定义对应一 个实例。 该作用域仅在基于web的Spring ApplicationContext情形下有效。
  5. global-session: 在-一个全局的HTTP Session中, - -个bean定义对应-个实例。 该作用域仅在基于web的Spring ApplicationContext情形下有效。

单例bean的优势?

由于不会每次都新创建新对象所以有一下几个性能上的优势:

  1. 减少了新生成实例的消耗新生成实例消耗包括两方面,第一,spring会通过反射或者cglib来生成bean实例这都是耗性能的操作,其次给对象分配内存也会涉及复杂算法。
  2. 减少jvm垃圾回收由于不会给每个请求都新生成bean实例,所以自然回收的对象少了。
  3. 可以快速获取到bean因为单例的获取bean操作除了第一次生成之外其余的都是从缓存里获取的所以很快。

单例bean是线程安全的吗?

单例bean情况如果在类中声明成员变量,并且有读写操作(有状态)线程不安全但是只要把成员变量声明到方法中(无状态)单例bean就是安全的

如何处理线程并发问题?

  1. 设置为多例的
  2. 将成员变量放在threadlocal中
  3. 同步锁syn(变成串行了会影响吞吐量)

Spring是如何实现单例bean的?

Spring是通过单例注册表实现单例的,Ioc容器维护了一个bean表格,当需要一个单例bean时,从表格中获取,没有获取到的,向表格注册一个新的bean。

不同方式的自动装配 ?

  1. no:默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。
  2. byName :通过参数名自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。
  3. byType:通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。
  4. constructor:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
  5. autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。

bean的四种形态?

在这里插入图片描述

概念态–刚在标签里定义还没有加载在new Applicationtext之后进入IOC的创建 进入定义态
定义态–把id,lazy,scop等定义信息传到BeanDefinition当中再通过BeanFactory把定义态创建成纯净态
纯净态–完成创建但是没有注入属性信息(他是存在二级缓存中用来解决循环依赖)
成熟态–属性注入完成

Spring Bean 的生命周期?

  1. 通过构造器创建bean实例(无参数构造)
  2. 为bean的属性设置值和对其他bean引用(调用set方法)
  3. 把bean实例传递给bean后置处理器的方法postProcessBeforeInitialization
  4. 调用bean的初始化方法(需要进行配置初始化的方法)
  5. 把bean实例传递给bean后置处理器的方法postProcessAfterInitialization
  6. bean可以使用了(对象获取到了)
  7. 当容器关闭时,调用bean的销毁的方法(需要进行配置销毁的方法)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值