Spring与Spring Boot
从开发及架构上,Spring框架具有以下优点:
- Spring的依赖反转功能让我们可以开发出方便进行测试的代码。
- 提供了易用、灵活、强大的数据事务管理支持功能。
- Spring强大的开放基因,使得其可以和众多框架,如JAP/hibernate、JSF、Kafka、RabbitMQ、Thymeleaf等整合。
- 提供了标准化的Web应用开发支持Spring MVC。
Spring Boot框架所提供的自动配置机制可以完成这些配置,快速启动一个项目,并且在后续的开发上配置保持最简。
在使用上,Spring Boot通过提供一系列名称以spring-boot-starter开头的启动器帮助我们简化项目的依赖。
- spring-boot-starter-web:Web应用开发
- spring-boot-starter-logging:日志处理
- spring-boot-starter-jpa:数据存储管理
- spring-boot-starter-security:安全管理
- spring-boot-starter-actuator:应用监控
- spring-boot-starter-data-redis:Redis数据库集成
- spring-boot-starter-amqp:消息中间件集成。
快速启动Spring Boot
![fb20ef2f0d7a2a049db228cdf275c026.png](https://img-blog.csdnimg.cn/img_convert/fb20ef2f0d7a2a049db228cdf275c026.png)
![3bb28106a8440c13699365190e23a8fb.png](https://img-blog.csdnimg.cn/img_convert/3bb28106a8440c13699365190e23a8fb.png)
2、编写应用引导类
@SpringBootApplication注解告诉Spring容器:使用该类作为所有Bean源,通过该起始点构建应用的上下文。
@SpringBootApplication注解继承自@EnableAutoConfiguration和@ComponentScan,通过该注解使得项目启动时Spring就会对该类所属目录下的所有子包进行扫描并根据SpringBoot的自动配置机制进行配置。
Application类的main()方法调用了SpringApplication.run(),该方法在项目启动时构建一个Spring容器,并返回一个ApplicationContext对象,也就是项目应用的上下文。
对于引导类来说其是整个应用启动的初始点,因为,如果在应用启动时需要进行某些初始化处理,那么最好都在该类中完成。
![8e126f0ef161fd6235ace94ef36d88f9.png](https://img-blog.csdnimg.cn/img_convert/8e126f0ef161fd6235ace94ef36d88f9.png)
3、编写配置文件
Spring Boot配置文件支持properties和yml两种格式,默认文件名称都是application,存放在resources目录中。
![815cd625dc3788a594b8053a9f4be9bd.png](https://img-blog.csdnimg.cn/img_convert/815cd625dc3788a594b8053a9f4be9bd.png)
4、运行项目
对后续将要编写的微服务来说,更多的时候是打包成一个部署单元。在打包时就会使用Maven脚本中配置的spring-boot-maven-plugin插件,然后通过mvn clean package命令将项目打包成一个Fat Jar,在生产环境下可以直接使用java -jar test.jar。
Fat jar是通过Mavne打包所生成的这种Jar不仅仅包含本项目中源码所编译生成的Java类文件,还会包含项目所依赖的第三方库及有关项目启动的相关信息。
spring-boot-starter-web默认依赖了spring-boot-starter-tomcat,通过该依赖,SpringBoot在启动应用时就会启动一个内嵌的Tomcat容器,并在该容器中运行项目。如果不想使用Tomcat作为启动容器,而是使用Jetty,那么可以在pom.xml文件中排除对Tomcat的依赖,并增加spring-boot-starter-jetty。
使用SpringBoot构建实例项目
1、经典三层应用架构
架构分层采用最广泛三层架构开发
![7b79cf68db3fa2a802f7339a1a9fbfcf.png](https://img-blog.csdnimg.cn/img_convert/7b79cf68db3fa2a802f7339a1a9fbfcf.png)
- 客户端层UI层:主要用来与用户进行交互,显示数据并接受用户的输入。
- 应用层:关注业务规则的制定和业务流程的实现,负责与UI层进行交互及数据存储的处理。
- 业务逻辑层:定义业务实体(Domain),业务逻辑的具体实现(Service)。
- 接口层(API层):使用REST方式提供API接口,提供数据集业务处理(Controller)。
- 数据接口层(DAO):负责业务实体对象的数据处理(Repository)。
- 存储层:即持久层,主要用来保存我们的业务数据(Mysql、MongoDB、Redis或者文件存储系统)。
2、设计业务实体
清晰地识别出这些业务实体,以及它们之间如何交互及关联关系之后,才能进行下一步开发。
这些业务实体是开发系统的核心,一旦业务实体对象定义不合理,往往会造成业务逻辑实现的复杂度升高及系统灵活性降低,甚至可能需要重新设计开发。
3、实现数据管理
ORM(Object Relational Mapping)框架可以辅助将业务对象通过映射的方式存储到数据库中,而不需要使用最原始的SQL语句。
JPA(Java Persistence API)完成数据存储处理。通过JPA可以将业务与具体所要存储的数据库解耦,方便在多种数据库之间进行切换。
- @Entoty:指所注解的类会被认为是JPA的一个实体对象,JAP就会对该对象进行映射处理。
- @Id: 用来注解数据库主键,并且通过@GeneratedValue自动生成主键的方式,默认使用数据自增方式
- @OneToOne、@OneToMany、@ManyToOne、@ManyToMany:实体关联关系,用来处理业务实体之间一对一、一对多、多对一、多对多关系的声明。
- @Table :注解使用在业务实体类上,自定义实体类映射到数据库具体哪张表上。
- @Column :使用该注解自定义字段映射关系。
4、编写业务逻辑层
按照开发方式来说,设计和开发的顺序应该是:Entity->REST API->业务逻辑层->数据存储层,通过测试驱动的方式设计锁需要的功能。
DTO(Data Transfer Object):数据传输对象,用来处理跨进程或网络传输数据聚合容器。
5、编写RESTful API(Controller层)
Spring MVC针对Controller提供了两个注解@Controller和@RestController。
@RestController注解,在该类中所有使用了@RequestMapping的方法就会返回响应体(response body)。
@Controller注解,则会将HTML部分的代码也一起返回给调用者。
@RequestMapping注解,可以使用在方法或类上,如果是注解在类上,那么该类中所有注解的方法都会继承类中锁声明的属性。@GetMapping和@PostMapping,分别处理GET和POST请求。
6、数据库初始化
SpringBoot框架提供的Spring JDBC初始化DataSource特性,是在启动系统时检测classpath根目录下是否有schema.sql和data.sql脚本文件,如果这两个脚本文件都存在或其中一个,将会尝试加载并执行该脚本。如果脚本初始化产生异常,那么应用系统启动将会失败。
还可以在配置文件中通过设置spring.datasource.schema属性的值,定义数据库创建脚本的位置,通过spring.datasource.data属性设置数据初始化脚本的位置。如果将spring.datasource.initialize属性设置为false,则在启动时不将不执行数据库初始化处理。