1、Spring是什么?
以POJO为基础,利用控制反转,依赖注入,切片等技术,为实现简化企业级应用开发,实现的轻量级框架。Spring家族很庞大,现在流行的有SpringMVC, Springboot,SpringCloud,Springflow等。
2、spring优点
轻量级
利用了控制反转,最大程度的降低了代码之间的耦合度
利用了面向切片编程,把业务逻辑和系统服务分开来
利用了容器技术,包含和管理应用中bean的生命周期
事务管理也很优秀,提供可扩展的事务管理接口
3、Spring的主要组成模块
core 模块: beanfactory,常用的有xmlbeanfactory,注解类型bean工厂
aop 模块:提供面向切片编程
JDBC和DAO模块:提供数据库访问接口,有效管理数据库资源,还利用aop实现事务管理
WEB模块:支持包括web的任务
4、解释一下IOC
控制反转技术,将bean通过控制反转交由spring容器来管理,实现bean的创建、装配、配置、注入并管理bean的生命周期。
5、ApplicationContext
AnnotationConfigApplicationContext
FileSystemApplicationContext
ClassPathXmlApplicationContext
XmlWebApplicationContext
6、beanfactory和ApplicationContext区别
beanfactory是Spring框架最核心的接口,应用上下文是基于beanfactory的。
beanfactory提供主要方法就是getBean(String beanName),beanfactory的功能通过其他接口扩展。
ApplicationContext是beanfactory派生出来的,提供了更多面向对象的实际功能。比如MessageSource:为应用提供i18n国际化访问
参考:https://blog.csdn.net/heqingsong1/article/details/8540558
7、依赖注入有几种方式
构造方法:constructor-arg,强依赖
setter方法:property
8、什么是SpringBeans
组成spring组件的主干java对象,由IOC容器进行管理,配置,装配。可以通过spring配置的元数据创建,创建时候可以通过scope属性来定义其是否为“singloton”、“prototype”、“request”、“session”、“globalSession”
9、单例的springbean是否是线程安全的?
不是,Spring框架对单例的bean没有进行多线程的封装,在大多数情况下,Spring bean没有可变状态,所以某种程度来说,单例bean是线程安全的。但是也有多种状态的bean,比如View Model对象,此时需要自行保证线程安全。
10、Spring框架中bean的生命周期
1)、Spring容器从xml文件中读取bean定义,并实例化bean。
2)、Spring根据bean定义,填充属性
3)、若实现beanNameAware接口,Spring传递bean的ID到setBeanName()
4)、若实现beanFactoryAware,Spring传递factory到setBeanFactory()
5)、若有任何与bean关联的beanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用
6)、若实现了InitializingBean,则调用afterPropertiesSet()方法
7)、init-method
8)、若有任何与bean关联的beanPostProcessors,Spring会在postProcesserAfterInitialization()方法内调用
---可使用阶段 ---
9)、若实现了DisposableBean接口,调用destory()方法
10)、destory-method
11、bean的重要生命周期方法
setup() 加载bean的时候。 对应init-method
teardown() 卸载bean的时候。 对应destroy-method
12、自动装配
1)、无自动装配
2)、byType,典型的有@Autowired注解
3)、byName,典型的有@Resource
4)、constructor,类似byType,但是要提供构造器参数
5)、autodetect,首先尝试用constructor,再用byType
13、什么是循环依赖,怎么解决循环依赖
循环依赖就是循环引用,在两个或两个以上的bean互相持有对方,最终形成闭环,比如:A依赖B,B依赖C,C依赖A。
结论:不能解决构造器循环依赖,可以解决setter方法和field循环依赖
原因:
首先,springbean对象初始化大致分为三步,第一步,实例化bean;第二步,执行populateBean()设置参数;第三步:执行initialize()方法初始化。
其次,我们看一下Spring怎么解决setter和field循环依赖,Spring有三级缓存;
在拿到bean的时候,我们先从SingletonObjects缓存中getBean,若没有bean,就到earlySingletonObjects中获取,若还没有bean,就到singletonFactory中获取。这里有个earlySingletonObjects,这里面的bean存放的是只实例化的bean,也就是说此时的这个bean创建出来了(用构造方法),虽然还没有进行第二步第三步,其他的bean可以在earlySingletonObjects中获得这个bean,使其自身可以完成创建。
最后,为何不能解决构造器循环依赖,因为earlySingletonObjects中的对象,也是由构造方法实例化出来的,加入singletonFactories三级缓存的前提是执行了构造器。
13、开启注解
<context:annotation-config/>
14、@Autowired和@Resource注解区别
相同:都可以用于装配和注入bean
不同:
1)、@Autowired默认通过类型来找到相应的bean进行装配,允许bean为null,可以指定required=false,可以和@ Qualifier注解一起使用,指定特定name的bean
2)、@Resource默认通过name来找到对应的bean,找不到再以类型查找,再找不到报空指针异常。但是name属性指定之后必须以name来查找bean
15、spring的事务隔离级别
read_uncommitted
read_committed
repeatable_read
serizerable
16、spring的事务传播机制
require
not_support
mandatory
require_new
never