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表示默认数据库的隔离级别

posted @ 2020-10-12 11:45  折枝花满衣  阅读(148)  评论(0)    收藏  举报