1.什么是Spring?
Spring是一个轻量级的java开发框架,目的是解决企业级的业务逻辑和其他层的耦合问题.Spring负责基础架构,开发者可以专注应用程序的开发
Spring最基本的是解决企业应用开发的复杂性,简化java开发.
2个核心特性:依赖注入DI. 面向切面编程AOP
2.Spring框架的设计目标?设计理念?和核心是什么?
Spring开发设计目标: Spring为开发者提供一站式的轻量级应用开发平台
Spring设计理念:在javaEEz中提供POJO和Javabean开发方式,面向接口开发.,充分支持OO面向对象的设计,
Spring通过IOC容器实现对象的耦合关系管理.并实现依赖反转,将对象之间的依赖管理交给IOC 容器实现解耦
Spring框架的核心: IOC容器和AOP模块.
通过IOC容器管理POJO对象以及他们之间的耦合关系.
通过AOP动态非倾入的方式增加服务
IOC让相互协作的组件保持松耦合,AOP允许把遍布于应用各层的功能分离出来形成可重用的功能组件
3.Spring的优缺点是什么?
方便解耦.,简化开发
将对象的创建和依赖管理交给容器.
AOP 可以方便的实现对权限拦截,运行监控
声明式事务 只需要配置就可以完成对事物的管理
Spring支持Junit4…通过注解对Spring进行测试
Spring支持各种优秀的框架,其内部提供对各种优秀的框架支持
缺点:依赖反射,影响性能.使用门槛升高.入门Spring需要很长时间
4.Spring有哪些模块组成?
5.Spirng框架中都用到了哪些模式?
工厂模式 BeanFactory就是简单工厂模式实现,用来创建对象实例
单例模式 Bean默认单例
代理模式 Spring AOP 用到了CGLIB字节码代理和JDK动态代理
模板方法 用来解决代码的重复问题,RestTemplate
6.Spring context应用上下文核心容器?
7.Spring应用程序有哪些不同的组件?
接口 定义功能
Bean类 set,get函数等
Bean配置文件 包含类的信息以及如何配置他们
Spring面向切面编程 提高AOP功能
用户程序 他使用接口
8.什么是Spring IOC 容器?
控制反转: 对组件对象控制权的转移.从程序代码本身转移到了外部容器
Spring IOC 负责创建对象.管理对象.,通过依赖DI注入,装配对象,配置对象,并且管理这些对象的生命周期
- IOC代码量降低.单元测试.,松耦合,支持加载服务的饿汉式.和初始化的懒汉式
容器管理者Bean的生命周期,控制着Bean的依赖注入
10.BeanFactory和ApplicationContext有什么区别?
BeanFactory 低级容器.,可以理解为就是一个hashmap.
ApplicationContext 高级容器,应用上下文,子接口,继承了很多接口,
11.有哪些不同类型的依赖注入实现方式?
接口注入.setter注入,构造器注入
12.什么是Spring Beans?
是形成Spring的主干java对象.被IOC容器初始化,配置,管理.
这些beans通过容器中配置的元数据创建.比如XML文件中的形式定义
13.一个Spring Bean定义包含什么?
一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。
14.如何给Spring 容器提供配置元数据?Spring有几种配置方式
XML配置文件。
基于注解的配置。
基于java的配置
15.怎么样定义类的作用域?
当Spring在需要的时候,每次都会产生一个新的bean实例@Scope 设置为prototype
一个bean在每次使用的时候,都会返回同一个bean,这个bean的scope属性必须设置为singletion
16.解释Spring支持几种bean的作用域?
singletion
prototype
request 每次http请求都会创建一个bean,该作用域仅在web的Spring ApplicationContext下有效
session 在一个Http Session,一个bean定义对应一个实例,该作用域仅在基于web的Spring ApplicationContext有效
global-session 在一个全局Http Session,一个Bean定义对应一个实例
17.Spring框架中的单例bean是线程安全的吗?
默认单例,没有对单例bean进行多线程封装.
大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,
但如果 bean 有状态的话(比如 view model 对象),最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。
有状态就是有数据存储功能。
无状态就是不会保存数据
18.Spring如何处理线程并发问题?
在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,
因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。
ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。
同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。
而ThreadLocal采用了“空间换时间”的方式。
ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。
19.解释SPring框架中bean的生命周期?
图为bean装载到Spring应用上下文的一个典型生命周期
Spring对bean进行实例化;
Spring将值和bean的引用注入到bean对应的属性中;
如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法;
如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来;
如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;
如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似地,如果bean使用initmethod声明了初始化方法,该方法也会被调用;
如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法;
此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上
下文中,直到该应用上下文被销毁;
如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
20.哪些是重要的bean生命周期方法? 你能重载它们吗?
有2个重要的bean生命周期方法,一个是setup,它是在容器加载bean的时候被调用
另一个是teardown,它是在容器卸载类的时候被调用
bean标签有2个重要的属性.init-method和destory-method方法,定义初始化和销毁方法.
它们也有相应的注解(@PostConstruct和@PreDestroy)。post后缀,pre前缀
21.在Spring中如何注入一个集合?
Spring提供以下几种集合的配置元素:
类型用于注入一列值,允许有相同的值。
类型用于注入一组值,不允许有相同的值。
类型用于注入一组键值对,键和值都只能为String类型。
22.什么是bean的自动装配?
Spring容器能够自动装配相互合作的bean 容器 不需要配置,能够通过BeanFactory自动处理bean之间的协作,.
23.使用@Autowired注解自动装配的过程是怎样的?
在启动Spring IOC时,容器自动装载了AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowired,@Resource,@Inject时,就会在IOC自动查找所需要的bean,并装配给该对象的属性.
在使用@Autowired时,首先在容器中查询对应类型的bean:
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;
如果查询的结果不止一个,那么@Autowired会根据名称来查找;
如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。
24.你可以在Spring中注入一个null 和一个空字符串吗?
可以。
25.什么是基于Java的Spring注解配置? 给一些注解的例子?
以@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被
Spring IOC容器使用。
另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注
册进Spring应用上下文。
26.怎样开启注解装配?
注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置元素。
27.
@Autowired注解,可用于构造函数,成员变量,setter方法 是按照类型匹配,默认情况下要求依赖对象必须存在,可以required=false
@Resource 是按照名称匹配.找不到与名称匹配的bean才会按照类型装配注入
28.Sprng解释对象/关系映射
对象关系映射ORM
29. Spring支持的事务管理类型?Spring事务实现方式有哪些?
Spring支持2种类型的事务管理方式
编程式事务 通过编程的方式管理事务
声明式事务 业务代码和事务管理相分离.使用注解和XML配置
30.说一下Spring的事务传播行为?
propagation_required
supports
mandatory
requires_new
not_supported
nerver
nested
31.说一下Spring的事务隔离级别?
Spring有5大隔离级别.默认有 ISOLATION_DEFAULT,其他的隔离级别和数据库一致
default
读未提交: 最低隔离级别,事务未提交时,就被其他事务读取 —>出现 脏读,幻读,不可重复读
读已提交 一个事务提交后背其他事务读取 -->幻读,不可重复读 sql_server默认级别
可重复度 保证多次读取到同一个数据时,和事务开始值一样,禁止读取到未提交的事务 -->出现幻读 mysql默认级别
序列化 代价最高,最可靠的隔离级别,防止3读
脏读 一个事务读取到另一个事务未提交的数据
不可重复度 在一个事务内,多次读取相同数据,
幻读 同一个事务内多次查询返回的结果集不一样 —>另一个事务新增或删除
32.什么是Spring AOP?