Spring框架
重要的Spring模块
- Spring Core:Spring其他所有功能都需要依赖该类库
- AOP:面向切面编程
- Aspect:Aspect可以在所有域对象中使用
- JDBC:java数据库相连
- ORM:支持Hibernate等ORM工具
- Web:为创建Web应用程序提供支持
- Test:对Junit测试
IOC和AOP的理解
IOC是一种设计思想,控制反转。由Spring框架创建对象。IOC容器实际上是个Map,map中存放对象。
对象之间的依赖关系有IOC管理,由IOC容器完成对象的注入。
如何使用?
当需要一个对象的时候,只需配置好配置文件或者注解即可。Spring中一般使用XMl文件配置Bean,Springboot一般使用注解。
AOP:面向切面,将于业务无关的如权限控制、事务处理、日志管理等封装起来,降低模块间的耦合度。基于动态代理。
使用AOP将一些通用功能抽象出来,在需要用的地方直接使用即可。
SpringAOP和AspectJ AOP的区别?
前者属于运行时增强,后者属于编译时增强。前者基于代理,后者基于字节码操作。
若切面过多,选择AspectJ。否则均可。
Spring中的bean的作用域?
- singleton:默认,这种范围,接收到多少个请求,容器中只有一个bean。
- Protype:为每一个bean请求提供一个实例。
- request:为每一个Http请求建立一个实例,仅在当前Http Request有效,请求完成后,bean被回收
- session:为每一个Http请求建立一个实例,仅在当前Http session有效
Spring中的bean是线程安全的吗?
单个bean存在线程安全问题,主要是因为当多个线程操作同一个的非静态成员变量的写操作时会存在线程安全问题。一般不会。但是将bean的singleton改为prototype,使得每个线程有一个实例。
SpringBean的生命周期
- Bean容器找到配置文件中SpringBean 的定义
- bean容器利用Java Reflect API创建一个 Bean实例
- 涉及到属性值的话,利用set()方法设置属性值
- 调用BeanNameAware的setBeanName()——将bean的ID传递给此方法
- 调用BeanFactoryAware()的setBeanFactory()——将BeanFactory容器实例传入
- 调用ApplicationContextAware的setApplicationContext()方法——引入bean所在应用的上下文
- 调用BeanPostProcessor的预初始化方法——调用初始化前方法
- 调用InitializeingBean的afterPropertiesSet()方法
- 调用自定义初始化方法
- 调用beanPostProcessor的初始化后方法——调用初始化后方法
- bean可以使用了——停留在上下文中,直至应用的上下文被销毁
- 调用DisposableBean的destroy()方法
Spring MVC的理解
是一个MVC框架,模型,视图,控制器。
工作原理
核心架构的具体流程步骤如下:
1、 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet——>HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、 DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、 HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
5、 ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、 View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束
流程说明(重要):
- 客户端(浏览器)发送请求,直接请求到 DispatcherServlet。
- DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。
- 解析到对应的 Handler(也就是我们平常说的 Controller 控制器)后,开始由 HandlerAdapter 适配器处理。
- HandlerAdapter 会根据 Handler来调用真正的处理器开处理请求,并处理相应的业务逻辑。
- 处理器处理完业务后,会返回一个 ModelAndView 对象,Model 是返回的数据对象,View 是个逻辑上的 View。
- ViewResolver 会根据逻辑 View 查找实际的 View。
- DispaterServlet 把返回的 Model 传给 View(视图渲染)。
- 把 View 返回给请求者(浏览器)
Spring中用到了哪些设计模式?
- 工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
- 代理设计模式 : Spring AOP 功能的实现。
- 单例设计模式 : Spring 中的 Bean 默认都是单例的。
- 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
- 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
- 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
- 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
@Component和@Bean的区别是什么
前者作用于类,后者作用于方法
前者通过类路径扫描自动装配到Spring容器中,可以使用@ComponentScan定义扫描的路径标识,后者是在标有该注解的方法获取这个bean,如引用第三方库中的类需要装配到bean中时
讲一个类声明成bean中的注解有哪些?
@Autowired ——自动装配bean
@Component——通用的注解,可以标注任意类为Spring组件。若一个bean不知道属于那一层,即可使用
@Repository——对应持久层即DAO层,用于数据库操作
@Serveice——业务层,用到DAO层
@Controller——对应MVC的控制层,接受用户请求,用到Servicec层
Spring管理事务的方式有几种?
1、编程式——代码中硬编码
2、声明式——配置文件中配置
- 基于XML
- 基于注解的
Spring的事务特性?
- 原子性:事务的不可分割
- 一致性:事务的执行前后数据保持一致
- 隔离性:事务执行过程中,不受到其他事务的干扰
- 持久性:事务结束后,数据持久到数据库
Spring事务的隔离级别?
Spring事务:一组操作,组成操作的逻辑单元,要么一起成功或者一起失败
五种:
- 默认:使用数据库默认的事务隔离级别,mysql默认RR,可重复读
- 读未提交
- 读已提交
- 可重复度
- 串行化
Spring事务的传播行为?
7种
支持当前事务:
若当前事务存在,则加入;
若不存在,1,创建新事务 2、以非事务方式运行3、抛出异常
不支持当前事务
创建一个事务,1,若当前存在事务,当前事务挂起 2、以非事务运行,若存在,挂起 3、以事务运行,若存在当前事务,抛出异常
其他
若当前存在事务,则创建一个事务作为当前的嵌套事务;若没有,则创建一个新事务
SpringBoot
优点
起步依赖和自动配置。
倒入一个web的起步依赖即可。,简化了配置。
自动配置。
SpringBoot实现分页
使用Spring Data-JPA可以实现将可分页的。Pageable。指定pageaNumber和pagesize。