Spring
优点
- 低侵入式设计,代码的污染极低。
- 独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺。
- Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦。
- Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用。
- Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。
- Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。
组成结构
主要模块
- Spring AOP :提供了面向切面的支持
- Spring ORM :对持久层框架的支持,例如:Hibernate|mybatis|JDO
- Spring Core :spring的核心实现,即容器
- Spring Dao:提供了对JDBC支持
- Spring Context :提供了关于UI支持,邮件支持等
- Spring Web:提供了web的一些工具类的支持
- Spring MVC :spring的mvc框架,提供了对mvc模式应用的支持
核心机制
IOC容器
概念及作用
Spring IOC 容器是 Spring 框架的核心。 它是具有依赖注入功能的容器,它创建对象,负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖,并管理他们的整个生命周期从创建到销毁。
种类
-
BeanFactory容器BeanFactory 是 spring 中提供的最简单最基本的容器;只提供了 IOC/DI 的功能;最主要的方法就是
getBean()方法,只有在调用该方法的时候才会对配置好的 bean 实例化 -
ApplicationContext容器ApplicationContext 是 spring 中提供的功能更加全面的容器,它继承了 BeanFactory 接口,所以 ApplicationContext 实现了
getBean方法;在容器启动时就已经实例化了所有配置的 bean ;并提供了额外的功能:- 环境感知
- 容器的继承体系
- 国际化相关
- 事件发布/响应机制
- 统一的资源管理
- AOP的功能
Bean
-
定义
bean 对象是构成应用程序的支柱也是由 Spring IoC 容器管理的。bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象,bean 是由用容器提供的配置元数据创建的
-
Bean 与 Spring 容器的关系
-
作用域
作用域 描述 singleton 默认值;Singleton是单例类型,创建容器时自动创建bean对象 prototype Prototype是原型类型,每次调用 getBean()时,相当于执行newXxxBean(),都返回一个新的实例request 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 session 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境 global-session 一般用于Portlet应用环境,该运用域仅适用于WebApplicationContext环境 -
生命周期
- 根据配置情况调用 Bean 构造方法或工厂方法实例化 Bean。
- 利用依赖注入完成 Bean 中所有属性值的配置注入。
- 如果 Bean 实现了 BeanNameAware 接口,则 Spring 调用 Bean 的 setBeanName() 方法传入当前 Bean 的 id 值。
- 如果 Bean 实现了 BeanFactoryAware 接口,则 Spring 调用 setBeanFactory() 方法传入当前工厂实例的引用。
- 如果 Bean 实现了 ApplicationContextAware 接口,则 Spring 调用 setApplicationContext() 方法传入当前 ApplicationContext 实例的引用。
- 如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的预初始化方法 postProcessBeforeInitialzation() 对 Bean 进行加工操作,此处非常重要,Spring 的 AOP 就是利用它实现的。
- 如果 Bean 实现了 InitializingBean 接口,则 Spring 将调用 afterPropertiesSet() 方法。
- 如果在配置文件中通过 init-method 属性指定了初始化方法,则调用该初始化方法。
- 如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的初始化方法 postProcessAfterInitialization()。此时,Bean 已经可以被应用系统使用了。
- 如果在 中指定了该 Bean 的作用范围为 scope=“singleton”,则将该 Bean 放入 Spring IoC 的缓存池中,将触发 Spring 对该 Bean 的生命周期管理;如果在 中指定了该 Bean 的作用范围为 scope=“prototype”,则将该 Bean 交给调用者,调用者管理该 Bean 的生命周期,Spring 不再管理该 Bean。
- 如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁;如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁。
控制反转(IOC)和依赖注入(DI)区别
-
依赖注入
从应用程序的角度在描述,应用程序依赖容器创建并注入它所需要的外部资源
-
控制反转
从容器的角度在描述,容器控制应用程序,有容器反向的向应用程序注入应用程序所需要的外部资源
依赖注入
-
注入方式
-
属性setter注入
指 IoC 容器使用 setter 方法注入被依赖的实例。通过调用无参构造器或无参 static 工厂方法实例化 bean 后,调用该 bean 的 setter 方法,即可实现基于 setter 的 DI
设值注入要求一个 Bean 的对应类必须满足以下两点要求:
- 必须提供一个默认的无参构造方法。
- 必须为需要注入的属性提供对应的 setter 方法。
-
构造方法注入
指 IoC 容器使用构造方法注入被依赖的实例。基于构造器的 DI 通过调用带参数的构造方法实现,每个参数代表一个依赖
-
-
注入方式对比
自动装配
-
原理
-
装配机制
-
在XML中进行显示装配
-
在Java代码中进行显示装配
-
隐式的bean发现机制和自动装配
- 组建扫描(component scanning):Spring 会自动发现应用上下文中所创建的bean
- 自动装配(autowiring):Spring 自动将满足类型或名称的Bean注入到使用到的类
-
-
自动装配方式
模式 描述 no 默认值;手动装配方式,需要通过ref设定bean的依赖关系 byName 根据setter方法名进行自动装配。Spring容器查找容器中全部Bean,找出其id与setter方法名去掉set前缀,并小写首字母后同名的Bean来完成注入。如果没有找到匹配的Bean实例,则Spring不会进行任何注入 byType 根据setter方法的形参类型来自动装配。Spring容器查找容器中的全部Bean,如果正好有一个Bean类型与setter方法的形参类型匹配,就自动注入这个Bean;如果找到多个这样的Bean,就抛出一个异常;如果没有找到这样的Bean,则什么都不会发生,setter方法不会被调用。 constructor 与byType类似,区别是用于自动匹配构造器的参数。如果容器不能恰好找到一个与构造器参数类型匹配的Bean,则会抛出一个异常。 autodetect Spring容器根据Bean内部结构,自行决定使用constructor或byType策略。如果找到一个默认的构造函数,那么就会应用byType策略 注意: 当一个Bean既使用自动装配依赖,又使用ref显式指定依赖时,则显式指定的依赖覆盖自动装配依赖;对于大型的应用,不鼓励使用自动装配。虽然使用自动装配可减少配置文件的工作量,但大大将死了依赖关系的清晰性和透明性。依赖关系的装配依赖于源文件的属性名和属性类型,导致Bean与Bean之间的耦合降低到代码层次,不利于高层次解耦
基于注解的配置
-
Bean 装配
注解 作用 @Component 描述 Spring 中的 Bean,但它是一个泛化的概念,仅仅表示一个组件(Bean),并且可以作用在任何层次 @Repository *数据访问层(DAO层)*用于将数据访问层的类标识为 Spring 中的 Bean @Service *业务层(Service 层)*用于将业务层的类标识为 Spring 中的 Bean @Controller *控制层(Controller层)*用于将控制层的类标识为 Spring 中的 Bean @Autowired 用于对 Bean 的属性变量、属性的 Set 方法及构造函数进行标注,配合对应的注解处理器完成 Bean 的自动配置工作。默认按照 Bean 的类型进行装配 @Resource 其作用与 Autowired 一样。 默认按照 Bean 实例名称进行装配 @Autowired @Qualifier 会将默认的按 Bean 类型装配修改为按 Bean 的实例名称装配,Bean 的实例名称由 @Qualifier 注解的参数指定 @PostConstruct Bean 的初始化 @PreDestroy Bean 的销毁 @Scope Bean 的范围 -
基于 Java 的配置
注解 作用 @Configuration 作用在任意类上,表示该类是一个配置类,其实就相当于一个xml配置文件 @Bean 作用于方法上,其实就相当于xml配置文件中的bean,表示创建一个Bean,方法的返回值类型表示该Bean的类型,方法名表示该Bean的ID
AOP
概念
- AOP 即:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术
- AOP 针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果
- AOP 的思想就是将整个业务流程的代码进行各部分的划分,将在多个业务流程里都出现的部分作为切面定义,将整个业务流程中特有的处理操作定义为核心业务。然后通过动态代理的方式,在程序运行期间将切面织入到核心业务之上,从而实现整个业务流程
分类
-
静态AOP实现
AOP框架在编译阶段对程序进行修改,以实现对目标类的增强,生成静态的AOP代理类,以AspectJ为代表
-
动态AOP实现
AOP框架在运行阶段动态生成AOP代理,以实现对目标对象的增强,以Spring AOP为代表
-
对比
- 静态AOP实现具有较好的性能,但需要使用特殊的编译器。
- 动态AOP实现是纯Java实现,因此无须特殊的编译器,但是通常性能略差
术语
| 名称 | 说明 |
|---|---|
| Joinpoint(连接点) | 指那些被拦截到的点,在 Spring 中,可以被动态代理拦截目标类的方法。 |
| Pointcut(切入点) | 指要对哪些 Joinpoint 进行拦截,即被拦截的连接点。 |
| Advice(通知) | 指拦截到 Joinpoint 之后要做的事情,即对切入点增强的内容。 |
| Target(目标) | 指代理的目标对象。 |
| Weaving(植入) | 指把增强代码应用到目标上,生成代理对象的过程。 |
| Proxy(代理) | 指生成的代理对象。 |
| Aspect(切面) | 切入点和通知的结合。 |
通知类型
| 切入方式 | 说明 |
|---|---|
| @Before(前置通知) | 在一个方法执行之前,执行通知,可以应用于权限管理等功能。 |
| @After(最终通知) | 在一个方法执行之后,不考虑其结果,执行通知。 |
| @AfterReturning(后置通知) | 在一个方法执行之后,只有在方法成功完成时,才能执行通知,可以应用于关闭流、上传文件、删除临时文件等功能。 |
| @AfterThrowing(异常通知) | 在一个方法执行之后,只有在方法退出抛出异常时,才能执行通知,可以应用于处理异常记录日志等功能。 |
| @Around(环绕通知) | 在方法调用之前和之后,执行通知,可以应用于日志、事务管理等功能。 |
JDBC
事务管理
概念
Spring 的事务管理是基于 AOP 实现的,而 AOP 是以方法为单位的。Spring 的事务属性分别为传播行为、隔离级别、只读和超时属性,这些属性提供了事务应用的方法和描述策略。
实现声明式事务管理的方式
- 通过在xml文件中配置事务代理工厂bean实现事务管理
- 通过 Annotation 注解
@Transational方式的事务管理 - 通过Aop配置声明式事务切面来实现事务管理
事务的传播特性
SpringMVC
概念
-
**分层体系结构 **
- 模型(Model):应用程序所使用的特定域信息的表现形式。(通过JavaBean,EJB组件实现)
- 视图(View):域模型的表现形式。(由JSP页面产生)
- 控制器(Controller):主要负责解释用户的输入并转换为模型,然后将转换后的结果显示给用户。(一般是一个Servlet)
特点
-
清晰的角色划分
控制器(controller)、验证器(validator)、命令对象(command obect)、表单对象(form object)、模型对象(model object)、Servlet分发器(DispatcherServlet)、处理器映射(handler mapping)、视图解析器(view resoler)等等。每一个角色都可以由一个专门的对象来实现。
-
强大而直接的配置方式
将框架类和应用程序类都能作为JavaBean配置,支持跨多个context的引用,例如,在web控制器中对业务对象和验证器validator)的引用。
-
可适配、非侵入
可以根据不同的应用场景,选择何事的控制器子类(simple型、command型、from型、wizard型、multi-action型或者自定义),而不是一个单一控制器(比如Action/ActionForm)继承。
-
可重用的业务代码
可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。
-
可定制的绑定(binding)和验证(validation)
比如将类型不匹配作为应用级的验证错误,这可以保证错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象,需要手动解析它并转换到业务对象。
-
可定制的handler mapping和view resolution
Spring提供从最简单的URL映射,到复杂的、专用的定制策略。与某些web MVC框架强制开发人员使用单一特定技术相比,Spring显得更加灵活。
-
灵活的model转换
在Springweb框架中,使用基于Map的键/值对来达到轻易的与各种视图技术集成。
-
可定制的本地化和主题(theme)解析
支持在JSP中可选择地使用Spring标签库、支持JSTL、支持Velocity(不需要额外的中间层)等等。
-
简单而强大的JSP标签库(Spring Tag Library)
支持包括诸如数据绑定和主题(theme)之类的许多功能。他提供在标记方面的最大灵活性。
-
JSP表单标签库
在Spring2.0中引入的表单标签库,使用在JSP编写表单更加容易。
-
Spring Bean的生命周期可
以被限制在当前的HTTp Request或者HTTp Session。准确的说,这并非Spring MVC框架本身特性,而应归属于Spring MVC使用的WebApplicationContext容器。
工作流程
-
具体流程
-
组件
- DispatcherServlet:前端控制器,也称为中央控制器,它是整个请求响应的控制中心,组件的调用由它统一调度。
- HandlerMapping:处理器映射器,它根据用户访问的 URL 映射到对应的后端处理器 Handler。也就是说它知道处理用户请求的后端处理器,但是它并不执行后端处理器,而是将处理器告诉给中央处理器。
- HandlerAdapter:处理器适配器,它调用后端处理器中的方法,返回逻辑视图 ModelAndView 对象。
- ViewResolver:视图解析器,将 ModelAndView 逻辑视图解析为具体的视图(如 JSP)。
- Handler:后端处理器,对用户具体请求进行处理,也就是我们编写的 Controller 类。
视图解析器
ViewResolver 视图解析器以及视图View详解,自定义视图解析器
请求参数获取
统一异常处理
-
方式
- 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
- 实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器;
- 使用@ExceptionHandler注解实现异常处理
-
解析
Mybatis
概念
- MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
- MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录
功能架构
- **API接口层:**提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理
- **数据处理层:**负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作
- **基础支撑层:**负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑
优缺点
-
优点
- **简单易学:**本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- **灵活:**mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
- **解除sql与程序代码的耦合:**通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql
-
缺点
- 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
- SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
- 框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
- 二级缓存机制不佳
ORM框架
- 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
- 简言之ORM就是一个桥梁,负责将程序持久层中需要持久化的java对象信息放入数据库对应的表中存储,当然也能将表中存储的记录转换成java应用程序需要的对象;
- Java典型的中间件有:
Hibernate,ibatis,speedframework
分页
逻辑分页和物理分页区别
-
分页本质不同
- 逻辑分页是将数据全部查出,然后通过程序提取指定部分的数据
- 物理分页是在数据库中通过执行SQL语句直接获取分页的数据信息
-
对内存消耗不同
- 逻辑分页内存消耗较大
- 物理分页内存消耗较小
-
使用场景不同
- 分页数据量小的情况下,逻辑分页效果高
- 分页数据量大的情况下,物理分页效率高
-
备注
- mybatis的
RowBounds就是逻辑分页 - mybatis的
PageHelper插件就是物理分页
- mybatis的
分页方式
- 使用mybatis提供的
subList(fristIndex,lastIndex)方法,从查询结果中截取分页的数据 - 使用sql语句进行分页,在SQL语句中加入
limit关键字 - 使用自定义拦截器进行分页,自定义拦截器需要实现
Interceptor接口 - 使用mybatis提供的
RowBounds类对象进行分页
执行器(Executor)
-
SimpleExecutor
每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。这是mybaits默认的执行器
-
ReuseExecutor
执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象
-
BatchExecutor
执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(
addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同
缓存
一级缓存
Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库
二级缓存
MyBatis的二级缓存是Application级别的缓存,也就是二级缓存可以在多个不同的SQLSession中缓存查询结果,如果第一个SQLSession中执行了某项查询并进行了缓存,那么后面其它的SQLSession进行相同查询时,直接提取第一次查询的结果,不用去数据库执行SQL,所以它可以提高对数据库查询的效率,以提高应用的性能。二级缓存默认是不开启的,二级缓存的开启需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的, 也就是要求实现Serializable接口
Mybatis 和 Hibernate 的区别
-
能否自动生成SQL语句
- hibernate可以自动生成要执行的SQL语句
- mybaits需要手动书写要执行的SQL语句
-
学习难度不同
- hibernate学习难度高,精通更难
- mybatis相对来说学习难度低,即学即用
-
对二级缓存的支持不同
hibernate对二级缓存支持的比mybatis更好
-
对数据库依赖不同
- hibernate与数据库无关,可以自由在多个不同的数据库中切换
- mybatis对具体的数据库产品依赖较大,更换数据库产品需要做大量的更改
-
框架功能不同
hibernate框架的功能比mybatis功能更加丰富
Springboot
概念
Spring boot是由 Pivotal团队提供的全新框架,其设计目的是用来简化新 Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。
特点
- 创建独立的 Spring应用程序
- 嵌入的 Tomcat,无需部署WAR文件
- 简化 Maven配置
- 自动配置 Spring
- 提供生产就绪型功能,如指标,健康检查和外部配置
- 绝对没有代码生成和对XML没有要求配置
启动流程
Spring Boot容器启动流程
Spring Boot启动流程
热部署
-
spring-boot-devtools -
Spring Loaded
多环境配置
监视器
Spring boot actuator是spring启动框架中的重要功能之一。Spring boot监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。
有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为HTTP URL访问的REST端点来检查状态。
SpringSecurity
概念
-
核心功能
认证(你是谁)、授权(你能干什么)、攻击防护(防止伪造身份)
-
基本原理
SpringSecurity的核心实质是一个过滤器链,即一组Filter,所有的请求都会经过这些过滤器,然后响应返回。每个过滤器都有特定的职责,可通过配置添加、删除过滤器。过滤器的排序很重要,因为它们之间有依赖关系。有些过滤器也不能删除,如处在过滤器链最后几环的ExceptionTranslationFilter(处理后者抛出的异常),FilterSecurityInterceptor(最后一环,根据配置决定请求能不能访问服务)。








5万+

被折叠的 条评论
为什么被折叠?



