1、什么是控制反转(IOC)?什么是依赖注入?
控制反转不是什么技术,而是一种设计思想,在java开发中,ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制;由容器来帮忙创建及注入依赖对象,对象只是被动的接受依赖对象。依赖注入是ioc的具体表现,应用程序依赖于ioc容器,应用程序需要ioc容器来提供对象需要的外部资源。
2、spring容器
1、什么是spring容器 (1)spring容器是spring的核心,一切的spring bean都存储在spring容器内,并通过ioc进行管理
(2)spring容器就是一个bean工厂(BeanFactory),应用中bean的实例化、获取、销毁都是由这个bean工厂管理的。 org.springframework.context.ApplicationContext接口用于完成容器的配置,初始化,管理bean。一个Spring容器就是某个实现了ApplicationContext接口的类的实例。也就是说,从代码层面,Spring容器其实就是一个ApplicationContext。
2、Spring容器的作用 我觉得是实现了控制反转这种思想
3、Spring依赖注入有哪几种实现方式 (1)构造器注入
(2)Setter方法注入
(3)注解注入
(4)接口注入
3、BeanFactory和ApplicationContext有什么区别
(1)BeanFactory可以理解为含有bean集合的工厂类,BeanFactory包含了对bean的定义,以便在接收客户端请求时将对应的bean实例化
(2)BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法和销毁方法
(3)从表面上看,applicationcontext如同beanfactory一样具有bean定义、bean关系的设置,根据请求分发bean的功能,但是applicationcontext在此基础上还提供了其他的功能: 1、提供了支持国际化的文本信息
2、统一的资源文件读取方式
3、已在监听器中注册的bean的事件 以下是三种常见的ApplicationContext实现方式:
1、ClassPathXmlApplicationContext
2、FileSystemXmlApplicationContext
3、XmlWebApplicationContext
4、Spring有几种配置方式
将Spring配置到应用开发中有以下三种方式 1、基于Xml的配置:最原始配置bean的方式
2、基于注解配置:
3、基于java的配置:基于注解Configuration和bean来申明它是一个配置类
5、请解释Spring Bean的生命周期
Spring Bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态,同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。
spring BeanFactory负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调方法(call back)组成:
1、初始化之后调用的回调方法
2、销毁之前调用的回调方法 Spring 框架提供了以下四种方式来管理 bean 的生命周期事件:
InitializingBean 和 DisposableBean 回调接口
针对特殊行为的其他 Aware 接口
Bean 配置文件中的 Custom init()方法和 destroy()方法
@PostConstruct 和@PreDestroy 注解方式
6、## bean生命周期基本流程
- 实例化(通过反射创建对象)
- 属性填充(属性值非自动装配)
- 初始化(如数据源赋值、校验属性)
- 销毁(ioc容器销毁关闭,关闭数据源)
7、什么是spring的依赖注入
控制反转IOC是一个很抽象的概念,可以用不同的方式来实现,其主要实现方式两种:依赖注入和依赖查找依赖注入:相对于IOC而言,依赖注入DI更加准确地描述了IOC的设计理念。 所谓依赖注入,即是组件之间的依赖关系由容器在应用系统运行期决定,也就是由容器动态地将某种依赖关系的目标对象注入到应用系统中的各个关联的组件之中,组件不做定位查询,只提供普通的java方法,让容器去决定依赖关系。
8、Spring支持的几种bean的作用域Scope
Spring框架支持以下五种bean的作用域:
singleton:bean在每个Spring ioc容器中只有一个实例
prototype:一个bean的定义可以有多个实例
request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring Application情况下有效
session:在一个HTTP Session中,一个bean定义对应一个实例,该作用域仅在基于web的Spring ApplicationContext情形有效
9、Spring框架中的单例bean是线程安全的吗?
不是,Spring框架中的单例bean不是线程安全的,spring中的bean默认是单例模式,spring框架并没有对单例bean进行多线程的封装处理。 实际上大部分时候spring bean无状态的(如dao类),所有某种程度上来说bean也是安全的,但是如果bean有状态的话(比如view model对象),那就要开发者自己去保证线程安全了,最简单的就是改变bean的作用域,把“singleton”变更为“prototype”,这样请求bean相当于new Bean()了,所以就可以保证线程安全了。
10、Spring如何处理线程并发问题
在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。
ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题,同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获取锁的线程需要排队,而ThreadLocal采用了“空间换时间”的方式
ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突,因为每一个线程都拥有自己的变量副本,从而也就没有必要对改变量进行同步了。 ThreadLocal提供了线程安全的共享对象,在编写多线程代码是,可以把不安全的变量封装进ThreadLocal
11、Spring自动装配Bean有哪些方式
在Spring中,对象无需自己查找或创建与其关联的其他对象,由容器负责把需要相互协作的对象引用赋予各个对象,使用autowire来配置自动装配模式。
在Spring框架xml配置共有5种自动装配:
no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean
byName:通过bean的名称进行自动装配,如果一个bean的property与另一bean的name相同,就进行自动装配
byType:通过参数类型进行自动装配
constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配
autodetect:自动探测,如果有构造方法,通过construct的方式自动装配,否则使用byType的方式自动装配
12、使用@Autowired注解自动装配的过程是怎么样的?
使用@Autowired注解来自动装配指定的bean,在使用@Autowired注解之前需要在spring配置文件进行配置。 在启动spring IOC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowired、@Resource或@inject时,就会在IOC容器自动查找需要的bean,并装配给该对象的属性。在使用@Autowired时,首先在容器中查询对应类型的bean:
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;
如果查询的结果不止一个,那么@Autowired会根据名称来查询
如果上述查询的结果为空,那么会抛出异常,解决方法,使用required=false
13、Spring常用注解有哪些
创建对象:@Component,@Controller,@Repository(@Mapper)、@Service
注入数据注解: @Autowired
@Resource
@Qualifier
控制生命周期注解:@PostConstruct @preDestroy 控制作用域注解:@Scope
13、什么是springAOP?
springAop是由动态代理实现的,如果我们为spring的某个bean配置了切面,那么Spring在创建这个bean的时候,实际是创建这个bean的一个代理对象,如果我们后续调用这个bean的方法,实际上是调用的是代理对象类重写的代理方法,SpringAop使用了两种动态代理,一个是JDK的动态代理,一个是CGLib的动态代理。
14、Spring用到了哪些设计模式?
spring主要有7种设计模式:
1、简单工厂模式:BeanFactory就是简单工厂模式的体现,根据传入一个唯一标识来获得Bean对象
2、工厂方法模式:FactoryBean就是典型的工厂方法模式,spring在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,每一个Bean都会对应一个FactoryBean,如SqlSessionFactory对应SqlSessionFactoryBean
3、单例模式:一个类仅有一个实例,提供一个访问它的全局访问点,spring创建Bean实例默认是单例的
4、适配器模式:SpringMvc中的适配器HandlerAdatper,由于应用会有多个Controller实现,如果需要直接调用Controller方法,那么先判断是由哪一个Controller处理请求,然后调用相应的方法;当增加新的Controller,需要修改原来的逻辑,违反了开闭原则(对修改关闭,对扩展开放),为此,Spring提供了一个适配器接口,每一种Controller对应一种HandlerAdapter实现类,当请求过来,SpringMvc会调用getHandler()获取相应的Controller,然后获取该Controller对应的HandlerAdapter,最后调用HandlerAdapter的handler()方法处理请求,实际上调用的是Controller的handlerRequest()方法,每次添加新的Controller只需要增加一个适配器类就可以,无需修改原有的逻辑
5、代理模式:Spring的Aop使用了动态代理,有两种方式:JDK的动态代理、CGLib
6、观察者模式:Spring中observer模式常用的地方是listener的实现,如ApplicationListener
7、模版模式:Spring中jdbcTemplate hibernate Template等,就使用到了模版模式
14、spring的启动流程
(1)初始化Spring容器,注册内置的BeanPostProcessor的BeanDefinition到容器中:
(2)将配置类的BeanDefinition注册到容器中 : (3)调用refresh()方法刷新容器: