spring
1.简单说一下spring(什么是spring,spring的优点)
https://www.cnblogs.com/huajiezh/articles/5790946.html
spring是一个轻量级的、开源的、Java企业级开发框架。
spring的优点有:
①松散的耦合
spring把对象之间的依赖关系交由spring控制,从而实现了解耦合。
②AOP式的编程
spring提供的AOP功能,能够在不改变源代码的情况下实现功能的增强。
③与其他框架的良好整合
能和其他框架,比如struts、hibernate、springmvc、mybatis进行良好的整合
④降低开发难度
spring对很多JavaEE的API进行了封装,降低了开发难度。
⑤声明式事物的支持
可以通过声明事物启动事物的功能,使我们在繁冗的事物开发中解脱出来
⑥方便测试
spring集成了junit,我们通过添加测试的注解,就可以进行测试。
https://www.jianshu.com/p/cd26bec0a376
2.spring有哪些模块
①Core
提供了IOC容器,对Bean进行了管理,是spring最基础的模块
②Context
提供上下文信息,拓展了包括国际化在内的功能
③Dao
提供了JDBC的抽象层,还提供了声明事物的管理方法
④ORM
提供了对象/关系的API映射
⑤AOP
提供了符合AOP规范的面向方面的编程实现
⑥WEB
提供了基础web开发的上下文信息,可以其他web集成
⑦WEB-MVC
提供了web应用的model-view-controller全功能实现
https://blog.csdn.net/meism5/article/details/90446643
3.BeanFactory和ApplicationContext的的比较
两者都是通过XML配置,实现Bean加载,ApplicationContext是BeanFactory的子类,所以多了一些扩展。
BeanFactory在加载配置文件的时候,是延迟加载,在使用到Bean对象的时候才去加载
而ApplicationContext在加载配置文件的时候,就对所有的对象进行了创建,在项目的开发中,多用ApplicationContext。
4.什么是IOC容器
spring IOC 负责创建对象、管理对象、装配对象,和管理对象的整个生命周期
使用spring IOC容器的优点是:最小的代价和最小的侵入性使松散耦合得以实现;IOC容器支持懒汉式加载和饿汉式加载;方便测试,单元测试不再需要单例和JNDI查找机制。
5.ApplicationContext通常的实现是什么
FileSystemXmlApplicationContext:文件系统路径加载xml
ClassPathXmlApplicationContext:类路径加载xml
AnnotationConfigApplicationContext:用于基于注解的配置
webApplicationContext:专门为web应用准备的,从相对于web的根路径下装配文件完成初始化
6.什么是spring的依赖注入(DI)
依赖注入,是IOC的一个方面,依赖注入就是你不用创建对象,你只需要描述他怎么创建的,你也不用去设置他的组件,只需要去描述哪些组件需要哪些服务,那么IOC容器就会帮你去创建好了
7.依赖注入的的实现方式
构造器注入:构造器依赖注入通过容器触发一个类的构造器来实现,该类有一系列的参数,每一个参数代表一个对其他类的依赖。
setter方法注入:通过调用该类的setter方法来注入。
8.什么是spring bean
spring bean 是那些形成spring应用的主干的Java对象,他们被spring IOC容器初始化,装配和管理。
9.spring容器提供配置元数据
①XML配置
②注解配置
③基于java的配置
https://blog.csdn.net/qq_28411869/article/details/85278805
10.spring bean的作用域
①singleton:该作用域将bean的定义的限制在每一个spring IOC容器中的一个单一实例(默认)
②prototype:该作用域将单一bean的定义限制在任意数量的对象实例。
③request:该作用域将bean的定义限制为http请求,只在上下文中有效
④session:该作用域将bean的定义限制为http会话,只在上下文中有效
⑤globel-session:该作用域将bean的定义限制为http会话,只在上下文中有效
11.bean的生命周期
①通过构造器创建bean实例(无参构造)
②为bean的属性设置值和对其他bean的引用(调用set方法)
③调用bean初始化方法(需要进行配置初始化方法)
④这个时候bean就可以使用了
⑤调用bean的销毁方法(需要进行配置销毁方法)
12.spring与线程安全
spring中并没有保证这些对象的线程安全,需要由开发者自己编写解决线程安全的问题的代码。
不要在bean中声明任何有状态的实例变量或类变量,如果必须如此,那么就使用ThreadLocal把变量变为线程私有的,如果bean的实例变量或类变量需要在多个线程之间共享,那么就只能使用synchronized、lock、CAS等这些实现线程同步的方法了。
13.什么是spring的内部bean
当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring 的 基于XML的 配置元数据中,可以在 <property/>或 <constructor-arg/> 元素内使用<bean/> 元素,内部bean通常是匿名的,它们的Scope一般是prototype。
14.spring如何注入一个集合
<list>类型用于注入一列值,允许有相同的值。
<set> 类型用于注入一组值,不允许有相同的值。
<map> 类型用于注入一组键值对,键和值都可以为任意类型。
<props>类型用于注入一组键值对,键和值都只能为String类型。
15.spring自动装配的几种方式
①no:默认是no,就是你通过显式的ref标签指定bean
②byname:他会根据你属性的名称,去寻找相同名称的bean
③bytype:根据属性的类型,去寻找bean
④constructor:这个方式类似于bytype,但是他要求有带参的构造函数,因为是根据构造函数的参数去匹配的。
④autodetect:首先尝试适用constructor来匹配,如果无法工作,则使用bytype方式。
16.自动装配的局限性
①基础数据类型:不能自动装配基础数据类型,比如string
②模糊特性:因为有模糊特性,所以容易装错
17.spring常用注解总结
@Autowired:自动装配,目的是为了消除代码里面个getter和setter方法和bean属性里面的property,@Autowired是根据type匹配的。
@Qualifier:指定Bean的名称,如果容器里面有一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称
@Resource:默认是byname,如果后面有跟括号指定type或者name,则根据后面的去匹配,任何一个匹配得上都不报错。
*@Autowired和@Resource的区别:@Autowired是默认bytype@Resource是byname,而且@Autowired是spring的,而@Resource是j2EE的。
@Respository、@Service、@Contoller是Dao层、Service层和Contoller层的注解,还有个通用的Component,只不过最好别用
18.spring支持的事务管理类型
①编程式事务管理:就是你在代码里面自己写自己控制事务
②声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需注解和XML配置类管理事务
19.你更倾向于哪种事务管理类型
大多数spring框架的使用者都会倾向于选择声明式事务管理,因为他对应的代码量的影响最小,因此更符合一个无侵入式的轻量级容器的思想。
20.解释一下什么是AOP
面向切面编程,是一种技术,允许程序模块化横向切割关注点,或横切典型的责任划分,比如日志和事务管理,通俗来讲就是可以在不改变源代码的情况下实现功能增强
21.spring的通知类型
before:
after:结束后无论成功与失败
after-return:只在成功结束后返回
after-throwing:只在失败结束后返回
around:调用前、调用后
22.spring实现代理的三种方法
①静态代理
②动态代理
③CGlib动态代理
https://www.cnblogs.com/teach/p/10763845.html
23.Spring三种实现自动代理
1.基于bean配置名规则的自动代理创建器:允许为一组特定配置名的bean自动创建代理实例的代理创建器,实现类为:BeanNameAutoProxyCreator
2.基于Advisor匹配机制的自动代理创建器,实现类为:DefaultAdvisorAutoProxyCreator
3.基于bean中的AspectJ注解标签的自动代理创建器
24.spring事务
七个事务属性
propagation_required 支持当前事务,没有就新建一个事务
propagation_supports支持当前事务,没有的就以非事务的形式执行
propagation_mandatory(强制性)支持当前事务,没有事务就抛出异常
propagation_requires_new 新建事务,如果当前存在事务,把当前事务挂起
propagation_not_supported 以非事务的形式执行,如果存在事务,就把当前事务挂起
propagation_never 以非事务执行,如果有事务就抛异常
propagation_nested 如果当前存在事务,则在嵌套事务内执行,如果当前没有事务,则进行propagation_required类似的操作
五种隔离级别
比mysql多了一个default表示默认数据库的隔离级别
浙公网安备 33010602011771号