Java面试题总结5

本文介绍了Spring框架的核心概念,包括其作为容器的作用、控制反转(IoC)和面向切面编程(AOP)的应用,以及BeanFactory和ApplicationContext的区别,涵盖了bean的生命周期、不同作用域和线程安全性的讨论。
摘要由CSDN通过智能技术生成

spring是什么

是一个容器框架,用来装JavaBean(Java对象),中间层框架,起连接作用,

是一个轻量级控制反转(IOC)和切面(AOP)的容器框架

对AOP的理解

 AOP:将程序中的各种交叉业务逻辑(比如安全,日志,事务等)封装成一个切面,然后注入到目标对象(具体业务逻辑)中去,AOP可以对某一个对象或者某些对象的功能进行增强,比如对象中的方法进行增强,可以在执行某个方法之前额外的做一些事情,在某个方法执行之后额外的做一些事情

谈谈你对IOC的理解

容器概念:IOC容器实际上就是个map(key,value),里面存储的是各种对象(在xml里面配置的bean节点,@repository,@service,@controller,@component),在项目启动的时候会读取配置文件里面的bean节点,根据全限定类名使用反射创建放到对象map,扫描到打上上述注解的类还是通过反射创建对象放到map里

控制反转:对象A获得依赖对象B的过程,由主动行为变成了被动行为,控制权颠倒过来,就是控制反转这个名词由来,   把全部对象的控制权上缴给第三方IOC容器,所以IOC就成为 整个系统的关键核心,起到一种类似粘合剂的作用,把系统中的所有对象粘和在一起

依赖注入:获得依赖对象的过程被反转了,控制被反转之后,获得依赖对象的过程由自身管理变成了由IOC容器主动注入,依赖注入是实现IOC的方法,由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中   

BeanFactory和ApplicationContext有什么区别

ApplicationContext是BeanFactory的子接口

BeanFactroy采用的是延迟加载形式注入Bean,即只有在使用某个Bean时(调用getBean()),才对该Bean进行加载实例化,就不能发现一些存在的spring的配置问题

ApplicationContext,是在容器启动时,一次性创建所有的Bean,在容器启动时,就可以发现spring中存在的配置错误

相对于基本的Bean Factory,applicationContext唯一的不足是占用内存空间,配置Bean较多时,启动较慢

BeanFactory通常以编程方式被创建,ApplicationContext还能以声明的方式创建,如使用Context Loader        

BeanFactory和ApplicationContext都支持BeanPostProcrssor,BeanFactoryPostProcessor的使用,但二者之间的区别是BeanFactory需要手动注册,而ApplicationContext则是自动注册

描述一些Spring Bean的生命周期

1,解析类得到BeanDefinition

2,如果有多个构造方法,则推断构造方法

3,确定构造方法后,进行实例化得到对象

4,对对象中添加@Autowired注解的属性进行属性填充

5,回调Aware方法,(比如BeanNameAware,BeanFactoryAware)

6,调用BeanPostProcessor的初始化前的方法

7,调用初始化方法

8,调用BeanPostProcessor的初始化后的方法,进行AOP

9,如果当前创建的bean是单例就把bean放入单例池

10,使用bean

11,spring容器关闭时调用DisposableBean中的Destroy()方法

解释Spring支持的几种bean的作用域

singleton:默认,每个容器中只有一个bean的实力,单例的模式由beanFactory本身来维护,该对象的生命周期是和spring IOC容器一致的(第一次被注入时创建)

prototype:为每一个bean请求提供一个实例,在每次注入时都会创建一个新的对象

request:bean被定义在每个HTTP请求中创建一个单例对象,在单个请求中都会复用这一个单例对象。

session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效

application:bean被定理为ServletContext的生命周期中复用一个单例对象。

websocket:bean被定义在websocket的生命周期中复用一个单例对象。

global-session(不常用):全局作用域,和Portrlet应用相关,应用部署在Portlet容器中工作时,你想声明让所有的portlet共用全局存储变量的话,那全局变量需要存储在global-session中。

Spring框架中的单例Bean是线程安全的吗

不安全的,框架并没有对bean进行多线程的封装处理

如果Bean是有状态的,那就需要开发者自己对线程进行安全保障,最简单的就是改变bean的作用域,把singleton改成protopyte,这样每次请求Bean就相当于是new Bean()

有状态就是有数据存储功能

无状态就是不会保存数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值