目录
14. Spring框架中的Bean的作用域
通过XML方式设置bean的作用域
通过注解方式设置bean的作用域
15. Spring框架中的Bean的线程安全
16.Spring 框架中的Bean生命周期
17.Spring 框架如何解决循环依赖?
18.Spring 框架中有哪些注解?
19.Spring 框架中用到的设计模式
21.Spring AOP 和 AspectJ AOP 有什么区别?
22.Spring AOP有哪些通知类型?
23.Spring 管理事务的方式有几种?
24.Spring 事务中有哪几种事务传播行为?
25.Spring事务中有哪几种事务隔离级别?
26.Spring 事务在什么情况下会失效?
27.谈谈对SpringMVC的理解?
28.SpringMVC的工作原理(执行流程)?
29.SpringMVC的核心组件有哪些?
14. Spring框架中的Bean的作用域
singleton : Spring 只会为该 bean对象只会创建唯一实例,Spring 中的bean默认都是单例;
prototype:每次获取bean,Spring会创建一个新的bean 实例;
request:每一次HTTP 请求,Spring会创建一个新的bean 实例;
session:不同的HTTP会话,Spring会创建不同的bean 实例;
通过XML方式设置bean的作用域
<bean id="demoDaoBean" class="com.apesource.dao.DemoDAOImpl" scope="singleton" />
通过注解方式设置bean的作用域
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class DemoDAOImpl implements IDemoDAO{ }
15. Spring框架中的Bean的线程安全
·对于prototype作用域的Bean,每次都创建一个新对象,也就是线程之间不存在Bean共享,因此不会有线程安全问题
·对于singleton作用域的 Bean,所有的线程都共享一个单例状态的 Bean,存在资源竞争,因此是存在线程安全问题的
·解决办法:
对于singleton作用域的单例bean,它的线程安全问题,常见有两种解决办法:
在bean中尽量避免定义可变的成员变量(用于保存数据的成员变量);
在类中定义一个ThreadLocal成员变量,将需要可变的成员变量保存在ThreadLocal中;
16.Spring 框架中的Bean生命周期
Spring Bean 的生命周期总体分四个阶段:实例化=>属性注入 =>初始化 => 销毁
实例化 Bean:根据配置文件中 Bean 的定义,利用 Java Reflection 反射技术创建 Bean的实例
注入对象依赖的属性值(或对象)
处理各种Aware接口:Spring 会检测该 Bean 是否实现了 xxxAware 接口,通过 Aware类型的接口,可以让Spring框架为当前 Bean 注入相应的内容:
如果 Bean 实现 BeanNameAware 接口,会调用它实现的 setBeanName(String beanId)方法,注入 Bean 的名字;
如果 Bean 实现 BeanclassLoaderAware 接口,调用 setBeanclassLoader()方法,注入ClassLoader对象的实例:
如果 Bean 实现 BeanFactoryAware 接口,会调用它实现的 setBeanFactory()方法,注入的是 Spring 工厂。
如果 Bean 实现 ApplicationContextAware 接口,会调用 setApplicationcontext()方法,注入 Spring 上下文;
执行BeanPostProcessor前置处理:如果想对 Bean 进行一些自定义的前置处理,那么可以让 Bean 实现了 BeanPostProcessor 接口,将会在该阶段调用 postProcessBeforeInitialization(Object obj,String s)方法
执行InitializingBean初始化方法:如果 Bean 实现了InitializingBean 接口,执行
afterPropertiesSet()方法。
执行init-method自定义初始化方法:如果 Bean 在 Spring 配置文件中配置了
init-method 属性,则会自动调用其配置的初始化方法。
执行BeanPostProcessor后置处理:如果这个 Bean 实现了BeanPostProcessor接口,将会调用 postProcessAfterInitialization(0bject obj,string s)方法,由于这个方法是在 Bean 初始化结束后调用
以上几个步骤完成后,Bean已经被正确创建,可以正常使用这个Bean了
执行DisposableBean销毁Bean:当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个接口,会调用其实现的 destroy()方法执行销毁;
执行destroy-method自定义销毁方法:如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的自定义销毁方法。
17.Spring 框架如何解决循环依赖?
循环依赖问题是指:类与类之间的依赖关系形成了闭环,就会导致循环依赖问题的产生。例如 A类依赖了B类,B类依赖了C类,而最后C类又依赖了A类,这样就形成了循环依赖问题;
18.Spring 框架中有哪些注解?
用于声明 Bean 的注解:
@component :定义通用Bean的注解,可标注任意类为 Bean 。如果一个 Bean 不知道属于哪个层,可以使用 @component 注解标注
@Repository:定义数据访问层Bean的注解,
@service :定义业务层Bean的注解
@Controller:定义控制器Bean的注解:
用于注入的注解:
@Autowired:按类型自动注入
@Qualifier :按名称自动注入
·声明配置、扫描、启用特性的注解:
@configuration:声明配置类
@Componentscan:组件扫描
@Enablescheduling:启用任务调度
@EnableAspectJAutoProxy:启用自动代理工厂
19.Spring 框架中用到的设计模式
工厂模式:Spring 使用工厂模式,通过 BeanFactory 或 Applicationcontext 来创建对象;
单例模式:Bean 默认作用域为单例,按照单例设计模式进行设计实现;
策略模式:Resource 的实现类,针对不同的资源文件,实现了不同方式的资源获取策略
代理模式:Spring 的 AOP 的实现依靠动态代理(JDK的反射和CGLIB)
模板方法:Spring 提供了 JdbcTemplate,RedisTemplate等模板对象,将相同的操作步骤进行了封装,
适配器模式:Spring AoP 的增强或通知(Advice)使用到了适配器模式,Spring Mvc 中也用
到了适配器模式适配 Controller;
21.Spring AOP 和 AspectJ AOP 有什么区别?
关键字:增强方式的差异(运行时、 编译时),实现方式的差异(动态代理、字节码操作)
SpringA0P已经集成了AspectJ,AspectJ是一个Java技术生态系统中实现 AOP 编程思想的独立框架; AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单更容易;
Spring AOP 属于运行时增强,而AspectJ是编译时增强,
Spring AOP 基于动态代理(Proxying),而 AspectJ 基于字节码操作( Bytecode Manipulat
ion );
22.Spring AOP有哪些通知类型?
关键字:分别介绍每种通知的实现接口,执行方式
前置通知:实现 MethodBeforeAdvice 接口,在目标方法调用前,执行通知;
环绕通知:实现 MethodInterceptor 接口,是一个包围目标方法的通知。环绕通知可以在方法调用前后完成自定义的行为。
后置通知:实现 AfterReturningAdvice 接口,在在目标方法调用后,执行通知(如果方法抛出异常,则不执行通知);
异常通知:实现 ThrowsAdvice 接口,在方法抛出异常时,执行通知;
23.Spring 管理事务的方式有几种?
编程式事务 : 在代码中硬编码(不推荐使用):通过 TransactionTemplate 或者
TransactionManager 手动管理事务,实际应用中很少使用,用于理解Spring事务管理。
声明式事务:在 XML 配置文件或者基于注解 @Transactional(推荐使用) 通过 AOP 实现。
24.Spring 事务中有哪几种事务传播行为?
25.Spring事务中有哪几种事务隔离级别?
26.Spring 事务在什么情况下会失效?
1.数据库不支持事务
Spring 事务生效的前提是所连接的数据库要支持事务,如果底层的数据库都不支持事务,则Spring的事务肯定会失效。例如:如果使用的数据库为 MySQL,并且选用了MyISAM 存储引擎,则 Spring 的事务就会失效。
2.事务方法未被Spring管理
如果事务方法所在的类没有加载到 Spring 1oc 容器中,也就是说,事务方法所在的类没有被 spring 管理,则 Spring 事务会失效。例如: Productservice 类上没有标注 @service 注解,Product的实例没有加载到 Spring IOC 容器中,就会造成 updateProductstockcountById()方法的事务在 Spring 中失效。
3.方法没有被public修饰
4.同一类中方法调用
5.未配置事务管理器
6.方法的事务传播类型不支持事务
7.不正确的捕获异常
8.错误的标注异常类型
27.谈谈对SpringMVC的理解?
首先, MVC 模式 是模型( Model)、视图( view)、控制器( controller )的简写,其核心思想是通过将请求处理控制、业务逻辑、数据封装、数据显示等流程节点分离的思想来组织代码。
所以, MVC 是一种设计模式,而 Spring MVC 是一款基于 MVC 设计模式思想实现的的 MVC 框架,属于Spring技术栈的一部分。SpringMVC可以帮助我们进行更简洁的 web 层的开发,并且它天生与 spring 框架集成,更利于架构的设计与搭建。
28.SpringMVC的工作原理(执行流程)?
1、客户端(浏览器)发送请求, 统一由 Dispatcherservlet 拦截处理请求。
2、DispatcherServlet 根据请求信息调用 HandlerMapping。HandlerMapping 根据 url 去匹配查找能处理的 Handler(也就是我们定义的 controller 控制器),并会将请求涉及到的接截器和 Handler 一起封装。
3、DispatcherServlet 调用 HandlerAdapter 适配执行 Handler
4、Handler 完成对用户请求的处理后,会返回一个 ModelAndView 模型视图对象给 DispatcherServlet 。 ModelAndView 中包含了数据模型以及相应的视图信息。 Model 是返回的数据对象,View 是 view 视图的逻辑名称。
5、ViewResolver 会根据逻辑 View 名称査找并解析实际的 View 视图文件,并根据 DispaterSevlet 返回的 Model 数据模型传给 View 视图文件,进行渲染执行,产生响应结果。
6、 DispaterServlet 负责将响应结果,输出至客户端浏览器。
29.SpringMVC的核心组件有哪些?
Dispatcherservlet :核心处理器,负责统一接收请求、将请求分发至不同的控制器,并负责客户端响应。
Handlermapping :处理器映射器,根据 url去匹配査找能处理的 Handler ,并会将请求涉入到的拦截器和 Handler 一起封装。
HandlerAdapter :处理器适配器,根据 HandlerMapping 找到的 Handler,适配执行对应的 Handler;
Handler :请求处理器,处理实际请求的处理器。
ViewResolver :视图解析器,根据 Handler 返回的逻辑视图名称,解析并渲染真正的视图文件,并传递给 DispatcherServlet 响应至客户端