java面试题(Spring)

Spring

1.谈谈对Spring的理解

Spring是一个开源框架;是一个基石可以和其他的框架无缝整合;是为了简化企业开发而生的,使得开发变得更加的优雅和简洁;是一个IOC和AOP的容器框架。

优势:

        1.生态圈强大

        2.低侵入式设计,代码的污染低

        3.独立于各种服务器

        4.ioc降低了业务对象的复杂性,提高了组件之间的解耦

        5.高度开放,可以自由选择Spring的全部或部分

2.Spring是如何简化开发的?

        1.基于POJO的轻量级和最小侵入性编程

        2.通过依赖注入和面向接口实现松耦合

        3.基于切面和惯例进行声明式编程

        4.通过切面和模板减少样板式代码

3.AOP的理解

        AOP称为面向切面编程,比如业务A和业务B现在需要一个相同的操作,传统方法我们可能需要在A、B中都加入相关操作代码,而应用AOP就可以只写一遍代码,A、B共用这段代码。并且,当A、B需要增加新的操作时,可以在不改动原代码的情况下,灵活添加新的业务逻辑实现。

4.IOC的理解

        IOC称为控制反转;传统的开发方式,通过new关键字来初始化一个对象进来;ioc思想是通过容器来实例化对象。我们需要哪个对象,直接从ioc容器里面取出;把对象创建的的权利交给了ioc容器。

        降低了两者之间的耦合度;易于资源管理。

5.Spring支持的bean作用域

  1. 单例:默认,ioc容器仅创建一个Bean实例,每次返回的是同一个实例;
  2. 原型:ioc容器创建多个Bean实例,每次返回都是新的实例;
  3. request:仅对http请求产生作用,每次请求都会创建一个新的实例;
  4. session:仅用于http session,同一个session共享一个bean,不同session使用不同实例;
  5. global-session:仅用于http session,所有session共享一个实例;

6.Spring的事务传播机制

多个事务方法相互调用,事务如何在这些方法间传播?提供了7种不同的传播特性,来保证事务的的正常执行:

  1. 如果存在事务就加入,如果没有事务,就创建一个(默认);
  2. 如果存在事务就加入,如果没有事务,就以非事务方法执行
  3. 如果存在事务就加入,如果没有事务,就抛出异常
  4. 创建一个新事务,如果存在事务就挂起该事务
  5. 以非事务方法执行,如果存在事务就挂起事务
  6. 不使用事务,如果存在事务就抛出异常
  7. 如果存在事务就嵌套在事务中执行

7.Spring的事务什么时候会失效

  1. 发生自调用,类里面用this调用本类方法
  2. 方法的访问修饰符不是public
  3. 数据库不支持事务
  4. 对象没有被spring容器管理
  5. 抛出异常,事务没有回滚

8.Spring bean的生命周期

9.Bean是线程安全的吗?

        如果bean无状态,则是安全的

        如果bean有状态,则是不安全的

10.BeanFactory和ApplicationContext有什么区别?

都是bean容器;

  1. ApplicationContext是BeanFactory的子接口
  2. BeanFactory提供了简单的功能,ApplicationContext提供了更完整的功能
  3. BeanFactory采用延迟加载的形式来注入bean,只有使用时才会进行实例化;ApplicationContext在启动的时候就把所有的Bean全部实例化了
  4. BeanFactory以编程的方式创建,ApplicationContext以编程的方式、申明的方式创建

11.spring事务的实现方式原理以及隔离级别

事务的实现方式:

        1.编程式:通过代码控制逻辑

        2.声明式:通过注解实现

事务的实现方式原理:

        其实事务的操作本来应该是由数据库来进行控制,但是为了方便用户进行业务逻辑的操作,spring对事务功能进行了扩展实现,一般我们很少会用编程式事务,更多的是通过添加@Transactional注解来进行实现,当添加此注解之后事务的自动功能就会关闭,有spring框架来帮助进行控制。
        其实事务操作是AOP的一个核心体现,当一个方法添加@Transactional注解之后,spring会基于这个类生成一个代理对象,会将这个代理对象作为bean,当使用这个代理对象的方法的时候,如果有事务处理,那么会先把事务的自动提交给关系,然后去执行具体的业务逻辑,如果执行逻辑没有出现异常,那么代理逻辑就会直接提交如果出现任何异常情况,那么直接进行回滚操作,当然用户可以控制对哪些异常进行回滚操作。

隔离级别:

  1. 未提交读:可能看到其他事务中未提交的数据(脏读)
  2. 提交读:能读取到已经提交事务的数据(不可重复读)
  3. 可重复读:能确保同一事务多次查询的结果一致(幻读)
  4. 串行化:强制事务排序,使之不会发生冲突;执行效率低,使用的场景不多

12.Spring容器启动流程是怎样的?

        1.初始化Spring容器

        2.将BeanPostProcessor配置类的BeanDefinition注册到容器中

        3.调用refresh()方法刷新容器

13.Spring用到了哪些设计模式

        工厂、适配器、访问者、装饰器、委派、代理、观察者、策略、模板、责任链

14.spring注入的方式

  1. 构造方法注入
  2. set方法注入
  3. 注解注入

15.bean对象和普通对象之间的区别

        大部分是一样的,只是不同过程中的称呼不同;普通对象经过依赖注入等过程后,属性得到赋值,成为Bean对象。

16.什么是bean的自动装配?有哪些方式

bean的自动装配指的是bean的属性值在进行注入的时候通过某种特定的规则和方式去容器中查找,并设置到具体的对象属性中;

方式:

        1.no:缺省

        2.byName:根据属性名称自动装配

        3.byType:根据类型自动装配

        4.constructor:在构造函数参数的byType方式

        5.autodetect:如果找到默认的构造函数,使用自动装配构造;否则使用按类型自动装配

17.依赖注入是如何实现的?

        对无参构造的对象进行判断,看哪些属性上面存在@Autowired注解,如果存在注解,就利用反射给当前Service类的对象中的属性赋值

SpringMVC

1.springmvc概述。springmvc优点

        SpringMvc 是 spring 的一个模块,基于 MVC 的一个框架,无需中间整合层来整合

优点:

  1.  它是基于组件技术

  2. 不依赖与servlet

  3. 可以使用任何视图

  4. 易于拓展

2.springmvc的运行原理

3.springmvc的工作流程

4.springmvc的核心组件

        1.前端控制器:负责接收请求、分发,并给予客户端响应

        2.处理器映射器:根据 uri 去匹配查找能处理的 Handler ,并会将请求涉及到的拦截器和 Handler 一起封装

        3.处理器适配器:根据 HandlerMapping 找到的 Handler ,适配执行对应的 Handler

        4.视图解析器:根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图

        5.请求处理器:处理实际请求的处理器

5.springmvc常用注解

        @Component:泛指各种组件

        @Controller:控制层

        @Service:业务层

        @Repository:数据访问层

        @Bean:导入第三方包里面的注解

        @Import:导入到容器中的组件

6.@Autowired和@Resource之间的区别

两个都是用来注入的注解。

        1.@Autowired是Spring定义的注解;@Resource是java定义的注解

        2.@Autowired进行类型查找,如果存在多个再根据名称查找;@Resource根据名称查找,如果不存在,再根据类型查找

        3.@Autowired 只支持设置 1 个参数,而 @Resource 支持设置 7 个参数

        4.@Autowired 支持属性注入、构造方法注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入

7.SpringMvc 的控制器是不是单例模式,如果是,有什么问题,怎么解决?

        单例模式

问题:多线程访问的时候有线程安全问题

解决:不要在controller中定义成员变量。如果一定要定义成员变量,就通过注解将其设置为多例模式。

猜你喜欢

转载自blog.csdn.net/qq_35056891/article/details/130166251