Spring学习笔记

Spring框架是事实上的Java后端标准,众人皆知,学习spring框架固然相当重要。

MVC 分层思想

DAO层

数据持久层/数据访问层

  • 对外提供统一的数据操作接口
  • 可以使数据库操作,可以是文件操作,也可以使缓存操作
  • 专注于数据业务的处理

Entity层

实体类

  • 数据库表相对应的实体类
  • DAO层取出来的数据封装成一个对象,也称为Pojo
  • 用于层级之间的数据传输

DTO层

数据传输层

  • 用于层级之间的数据传输,也称为VO
  • 比Entity层包含更多数据 ResultDTO<T>
  • 数据可以包含结果表示服

Service层

业务逻辑层

业务逻辑接口层

  • 站在使用者的角度设计的业务接口
  • 业务模块的逻辑应用设计

业务逻辑实现层

  • 实现具体的业务的接口
  • 可以实现事务控制
  • 可以实现切面编程

Controller层

业务逻辑控制层

  • 负责具体的业务模块流程的控制
  • 调用Service业务逻辑接口来操作具体的业务

View层

展示层

  • 使用Model对象在View和Controller层传输数据
  • 负责前端jsp,html页面的展示
  • 前后端分离的架构已经很少用到这一层

MVC 模块划分

背景

现在的后端开发大多数都用Maven进行项目管理及自动构建。 而Maven的最佳实践是将项目进行模块划分,所谓分而治之。
那么问题来了,模块划分是按照功能(业务/子系统)来划分还是按照分层思想进行划分?
通常项目都会按照一个原则进行设计:高内聚 低耦合
我想先对两个划分方式进行优劣比较。

需求

要开发一个物联网设备云;支持MQTT协议,CoAP协议,Socket IO协议(Netty,smart-socket);对外提供OAuth2.0授权服务;支持对话式人工智能平台的智能家居技能;使用消息队列服务处理消息数据;支持设备管理等。

团队

该团队有4个人,协作开发。

按功能模块划分(垂直)

每一个模块都是一个完整的业务

  1. 耦合性低;
  2. 减少与其他模块之间的交互;
  3. 逻辑更加清晰;
  4. 只需依赖公共基础模块utilscommonfilterinterceptor等;

  1. 接触面太广;
  2. 避免不了对其他包的依赖;

按分层思想划分(水平)

多个模块整合成一个完整的业务

  1. 开发者更专注与业务逻辑;
  2. 方便代码重用,只需添加依赖即可,例如daoservice

  1. 耦合性高;
  2. 沟通成本高;
  3. 需要整个项目进行编译;
  4. 容易影像这个项目进度;

结论

  1. 考虑项目大小:多功能项目按功能划分,子系统/子模块中再按分层思想划分。
  2. 考虑部署方式:如果模块独立部署则模块为大,如果分层部署,则层为大;
  3. 考虑团队大小:如果是小团队,或者一个人,分层思想较好,一层一层的实现。

全家桶注解

Java元注解

注解 解释
@Documented javadoc文档中列出被此注解注解的元素
@Target 注解能被应用的目标元素,比如类、方法、属性、参数等等
@Retention 仅在源码保留,还是保留到编译后的字节码,还是到运行时也去加载
@Inherited 如果子类没有定义注解的话,能自动从父类获取定义了继承属性的注解
@Repeatable 通过关联注解容器定义可重复注解
@Native 是否在.h头文件中生成被标记的字段,原生程序需要和Java程序交互

SpringCore 注解

注解 解释
@Controller 定义表现层组件
@Service 定义业务逻辑层组件
@Repository 定义数据访问层资源库组件
@Component 定义其它组件(比如访问外部服务的组件)
@Autowired 自动装配Bean(默认按类型装配byType
@Required 用于在setter方法标记属性值需要由Spring进行装配
@Qualifier 用于通过给Bean定义修饰语来注入相应的Bean
@Resource 自动装配Bean(默认按照名称进行装配byName
@Value 用于注入属性配置或SpEL表达式
@Lookup 可以实现方法注入(注入的对象是Prototype生命周期,每次new一个出来)
@EnableTransactionManagement 用于开启事务管理
@Transactional 用于开启事务以及设置传播性、隔离性、回滚条件等
@TransactionalEventListener 用于配置事务的回调方法(事务提交前、提交后、完成后,回滚后)
@Order 注解可以设置Spring管理对象的加载顺序
@AliasFor 注解可以设置一组注解属性相互作为别名

SpringContext 注解

注解 解释
@Configuration 用于标注配置类,启用Java配置方式的Bean配置
@Bean 用于配置一个Bean
@ComponentScan 用于扫描包方式配置Bean
@ComponentScans 用于配置一组@ComponentScan
@PropertySource 用于导入配置文件
@PropertySources 用于配置一组@PropertySource
@Conditional 用于设置关联的条件类,在合适的时候启用Bean的配置
@Import 用于导入其它配置类
@ImportResource 用于导入非Java配置方式的XML配置
@Profile 用于指定在合适的Profile下启用配置
@Lazy 用于告知容器延迟到使用的时候实例化Bean(默认情况下容器启动的时候实例化Bean来检查所有的问题)
@Description 用于给Bean设置描述
@Scope 用于设置Bean的生命周期
@Primary 用于在定义了多个Bean的时候指定首选的Bean
@EventListener 用于设置回调方法监听Spring制定的以及自定义的各种事件
@EnableAspectJAutoProxy 用于开启支持AspectJ@Aspect切面配置支持

SpringMVC 注解

注解 解释
@RequestScope Bean特殊生命周期的复合注解(需要Bean跟随请求声明周期)
@SessionScope Bean特殊生命周期的复合注解(需要Bean跟随会话声明周期)
@ApplicationScope Bean特殊生命周期的复合注解(需要Bean跟随应用程序的声明周期)
@RequestMapping 用于配置Http请求路径参数等,手动配置HttpMethod
@PostMapping 基于@RequestMapping的复核注解,HTTPPOST请求
@GetMapping 基于@RequestMapping的复核注解,HTTPGET请求
@DeleteMapping 基于@RequestMapping的复核注解,HTTPDELETE请求
@PutMapping 基于@RequestMapping的复核注解,HTTPPUT请求
@ResponseStatus 可用到方法或异常上,请求得到响应代码
@ExceptionHandle 可用到方法或异常上,请求得到异常原因,可以进行统一的全局异常处理
@ResponseBody 把返回内容(序列化后)输出到请求体,@RestController常用
@RequestBody 从请求体获取参数(处理复杂数据,比如JSON
@RequestHeader 从请求头获取参数获取参数
@CookieValue cookie中获取参数
@SessionAttribute 从会话中获取参数
@RequestAttribute 从请求的Attribute中(过滤器和拦截器手动设置的一些临时数据)
@RequestParam 从请求参数(处理简单数据,键值对)
@PathVariable 从路径片段中获取参数
@MatrixAttribute 矩阵变量允许我们采用特殊的规则在URL路径后加参数(分号区分不同参数,逗号为参数增加多个值)
@ControllerAdvice 允许我们在集中的地方配置控制器,相当于为@ExceptionHandler加上了@ResponseBody
@RestControllerAdvice @ControllerAdvice类似
@InitBinder 用来设置WebDataBinderWebDataBinder用来自动绑定前台请求参数到Model
@ModelAttribute 让全局的@RequestMapping都能获得在此处设置的键值对
@CrossOrigin 用到@ControllerMethod上(需要配合@RequestMapping)设置细粒度的跨域行为

SpringBoot 注解

注解 解释
@ConfigurationProperties 配合@EnableConfigurationProperties注解来设置需要启用的配置类,用来自定义配置类和配置文件进行关联
@EnableConfigurationProperties 启动自定义配置
@DeprecatedConfigurationProperty 用于标记废弃的配置以及设置替代配置和告知废弃原因
@ConfigurationPropertiesBinding 用于指定自定义的转换器用于配置解析的时的类型转换
@NestedConfigurationProperty 用于关联外部的类型作为嵌套配置类
@EnableAutoConfiguration 可以启用自动配置
@SpringBootApplication 复合注解,SpringBoot启动注解
@AutoConfigureOrder 用于设置自动配置类加载顺序,以及精确控制加载依赖关系(值越小优先级越高)
@AutoConfigureAfter 在指定的配置类初始化后再加载
@AutoConfigureBefore 在指定的配置类初始化前加载
@ConditionalOnBean 用于仅当容器中已经包含指定的Bean类型或名称时才匹配条件
@ConditionalOnClass 仅当classpath上存在指定类时条件匹配
@ConditionalOnCloudPlatform 仅当指定的云平台处于活动状态时条件匹配
@ConditionalOnExpression 依赖于SpEL表达式的值的条件元素的配置注解
@ConditionalOnJava 基于应用运行的JVM版本的条件匹配
@ConditionalOnJndi 基于JNDI可用和可以查找指定位置的条件匹配
@ConditionalOnMissingBean 仅当容器中不包含指定的Bean类型或名称时条件匹配
@ConditionalOnMissingClass 仅当classpath上不存在指定类时条件匹配
@ConditionalOnNotWebApplication 仅当不是WebApplicationContext(非Web项目)时条件匹配
@ConditionalOnWebApplication 仅当是WebApplicationContextWeb项目)时条件匹配
@ConditionalOnProperty 是检查指定的属性是否具有指定的值
@ConditionalOnResource 示仅当classpath上存在指定资源时条件匹配
@ConditionalOnSingleCandidate 仅当容器中包含指定的Bean类并且可以判断只有单个候选者时条件匹配
@Conditional 关联到自己实现的SpringBootCondition

SpringCloud 注解

注解 解释
@EnableXXX 开启某个功能
@RibbonClient 这个注解用来为负载均衡客户端做一些自定义的配置
@SpringCloudApplication 复合注解,SpringCloud启动注解
@LoadBalanced 用于和RestTemplate配合使用构成一个负载均衡的Http客户端,实现原理上其实这个注解是一个@Qualifier注解
@SpanName 手动设置span的名称

  1. 元注解,也就是注解的注解
  2. Spring容器相关的一些注解,包括@Qualifier@AliasFor@Order等看似不重要但其实很重要的注解
  3. SpringJava配置相关的一些注解,包括条件注解
  4. SpringBoot自动配置相关的一些注解
  5. 很多注解可以同时应用到类型、方法、参数上,有的时候应用到不同的地方作用会略微不一样,这个需要重点关注

Boot Starter 组件

应用类 Starter

名称 描述 POM
spring-boot-starter 核心 starter,包含自动配置支持、日志和 YAML Pom
spring-boot-starter-activemq 提供 JMS 消息支持,使用 Apache ActiveMQ Pom
spring-boot-starter-amqp 提供 Spring AMQP 与 Rabbit MQ 支持 Pom
spring-boot-starter-aop 提供 Spring AOP 与 AspectJ 面向切面编程支持 Pom
spring-boot-starter-artemis 提供 JMS 消息服务支持,使用 Apache Artemis Pom
spring-boot-starter-batch 提供 Spring Batch 支持 Pom
spring-boot-starter-cache 提供 Spring Framework 缓存支持 Pom
spring-boot-starter-cloud-connectors 使用 Spring Cloud Connectors 简单连接到类似 Cloud Foundry 和 Heroku 等云平台 Pom
spring-boot-starter-data-cassandra 提供对 Cassandra 分布式数据库和 Spring Data Cassandra 的支持 Pom
spring-boot-starter-data-cassandra-reactive 提供对 Cassandra 分布式数据库和 Spring Data Cassandra Reactive 的支持 Pom
spring-boot-starter-data-couchbase 提供对 Couchbase 面向文档数据库和 Spring Data Couchbase 的支持 Pom
spring-boot-starter-data-couchbase-reactive 提供对 Couchbase 面向文档数据库和 Spring Data Couchbase Reactive 的支持 Pom
spring-boot-starter-data-elasticsearch 提供对 Elasticseach 搜索与分析引擎和 Spring Data Elasticsearch 的支持 Pom
spring-boot-starter-data-jpa 提供 Spring Data JPA 与 Hibernate 的支持 Pom
spring-boot-starter-data-ldap 提供对 Spring Data LDAP 的支持 Pom
spring-boot-starter-data-mongodb 提供对 MongoDB 面向文档数据库和 Spring Data MongoDB 的支持 Pom
spring-boot-starter-data-mongodb-reactive 提供对 MongoDB 面向文档数据库和 Spring Data MongoDB Reactive 的支持 Pom
spring-boot-starter-data-neo4j 提供对 Neo4j 图数据库与 SPring Data Neo4j 的支持 Pom
spring-boot-starter-data-redis 提供对 Redis 键值数据存储、Spring Data Redis 和 Lettuce 客户端的支持 Pom
spring-boot-starter-data-redis-reactive 提供对 Redis 键值数据存储、Spring Data Redis Reactive 和 Lettuce 客户端的支持 Pom
spring-boot-starter-data-rest 提供使用 Spring Data REST 通过 REST 暴露 Spring Data 资源库的支持 Pom
spring-boot-starter-data-solr 提供对 Apache Solr 搜索平台与 Spring Data Solr 的支持 Pom
spring-boot-starter-freemarker 提供使用 Freemakrer 视图构建 MVC web 应用的支持 Pom
spring-boot-starter-groovy-templates 提供使用 Groovy 模板视图构建 MVC web 应用的支持 Pom
spring-boot-starter-hateoas 提供使用 Spring MVC 与Spring HATEOAS 构建基于超媒体的 RESTful web 应用的支持 Pom
spring-boot-starter-integration 提供对 Spring Integration 的支持 Pom
spring-boot-starter-jdbc 提供 JDBC 与 Tomcat JDBC 连接池的支持 Pom
spring-boot-starter-jersey 提供对使用 JAX-RS 与 Jersey 构建 RESTful web 应用的支持。spring-boot-starter-web 的替代方案 Pom
spring-boot-starter-jooq 提供对使用 JOOQ 访问 SQL 数据库的支持。spring-boot-starter-data-jpaspring-boot-starter-jdbc 的替代方案 Pom
spring-boot-starter-json 提供了读写 json 的支持 Pom
spring-boot-starter-jta-atomikos 提供 Atomikos JTA 事务支持 Pom
spring-boot-starter-jta-bitronix 提供 Bitronix JTA 事务支持 Pom
spring-boot-starter-jta-narayana 提供 Narayana JTA 支持 Pom
spring-boot-starter-mail 提供使用 Java Mail 与 Spring Framework 的邮件发送支持 Pom
spring-boot-starter-mustache 提供使用 Mustache 视图构建 web 应用的支持 Pom
spring-boot-starter-quartz Quartz 支持 Pom
spring-boot-starter-security Spring Security 支持 Pom
spring-boot-starter-test 提供包含了 JUnit、Hamcrest 与 Mockito 类库的 Spring Boot 单元测试支持 Pom
spring-boot-starter-thymeleaf 提供使用 Thymeleaf 视图构建 MVC web 应用的支持 pom
spring-boot-starter-validation 提供 Hibernate Validator 与 Java Bean Validation 的支持 Pom
spring-boot-starter-web 提供使用 Spring MVC 构建 web(包含 RESTful)应用的支持,使用 Tomcat 作为默认嵌入式容器 Pom
spring-boot-starter-web-services Spring Web Services 支持 Pom
spring-boot-starter-webflux 提供使用 Spring Framework 的 Reactive Web 支持构建 WebFlux 应用的支持 Pom
spring-boot-starter-websocket 提供使用 Spring Framework 的 WebSocket 支持构建 WebSocket 应用的支持 Pom

生产类 starter

名称 描述 POM
spring-boot-starter-actuator Spring Boot 的 Actuator 支持,其提供了生产就绪功能,帮助您监控和管理应用 Pom

技术类 starter

名称 描述 POM
spring-boot-starter-jetty 使用 Jetty 作为嵌入式 servlet 容器。可代替 spring-boot-starter-tomcat Pom
spring-boot-starter-log4j2 使用 Log4j2 作为日志组件。可代替 spring-boot-starter-logging Pom
spring-boot-starter-logging 使用 Logback 作为日志组件,此 starter 为默认的日志 starter Pom
spring-boot-starter-reactor-netty 使用 Reactor Netty 作为内嵌响应式 HTTP 服务器 Pom
spring-boot-starter-tomcat 使用 Tomcat 作为嵌入式 servlet 容器,此为 spring-boot-starter-web 默认的 servlet 容器 starter Pom
spring-boot-starter-undertow 使用 Undertow 作为嵌入式 servlet 容器,可代替 spring-boot-starter-tomcat Pom

提示

有关其它社区贡献的 starter 列表,请参阅 GitHub 上的 spring-boot-starters 模块中的 README 文件

Cloud Starter 组件

组件 说明
Spring Cloud Config 配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git以及Subversion。
Spring Cloud Bus 事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。
Eureka 云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
Hystrix 熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。
Zuul Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。
Archaius 配置管理API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。
Consul 封装了Consul操作,consul是一个服务发现与配置工具,与Docker容器可以无缝集成。
Spring Cloud for Cloud Foundry 通过Oauth2协议绑定服务到CloudFoundry,CloudFoundry是VMware推出的开源PaaS云平台。它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题
Spring Cloud Sleuth 日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案。
Spring Cloud Data Flow 大数据操作工具,作为Spring XD的替代产品,它是一个混合计算模型,结合了流数据与批量数据的处理方式。
Spring Cloud Security 基于spring security的安全工具包,为你的应用程序添加安全控制。
Spring Cloud Zookeeper 操作Zookeeper的工具包,用于使用zookeeper方式的服务发现和配置管理。
Spring Cloud Stream 数据流操作开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。
Spring Cloud CLI 基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件。
Ribbon 提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。
Turbine Turbine是聚合服务器发送事件流数据的一个工具,用来监控集群下hystrix的metrics情况。
Feign Feign是一种声明式、模板化的HTTP客户端。
Spring Cloud Task 提供云端计划任务管理、任务调度。
Spring Cloud Connectors 便于云端应用程序在各种PaaS平台连接到后端,如:数据库和消息代理服务。
Spring Cloud Cluster 提供Leadership选举,如:Zookeeper, Redis, Hazelcast, Consul,选举、集群的状态一致性、全局锁、tokens等常见状态模式的抽象和实现。提供在分布式系统中的集群所需要的基础功能支持,
Spring Cloud Starters Spring Boot式的启动项目,为Spring Cloud提供开箱即用的依赖管理。
Turbine Turbine是聚合服务器发送事件流数据的一个工具,用来监控集群下hystrix的metrics情况。

参考文献

朱晔和你聊Spring系列S1E9:聊聊Spring的那些注解
Maven最佳实践:划分模块
OSChina讨论
国内W3CSchool
国外GitBook
SpringBoot官方文档
SpringBoot官方文档中文翻译
SpringBoot组件说明

今日诗词

作者信息