SpringBoot入门
一、使用JavaConfig替代xml配置
我们通常使用 Spring 都会使用 XML 配置,随着功能以及业务逻辑的日益复杂,应用伴随着大量的 XML 配置文件以及复杂的 bean 依赖关系,使用起来很不方便。
优势:
1、面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分使用 Java 中的面向对象功能。一个配置类可以继承另一个重写它的 @Bean 方法等。
2、减少或者消除 XML 配置。提供了一种纯 Java 的方式来配置与 XML 配置概念相似的 Spring 容器。
3、类型安全和重构友好。提供了一种类型安全的方法了来配置 Spring 容器,由于 Java 5 对泛型的支持,现在可以按类型而不是名称检索 bean,不需要任何的强制转换或者基于字符串的查找。
二、JavaConfig 方式配置 IoC
@Configuration:在类上贴该注解表示该类是 Spring 的配置类,具有 applicationContext.xml 文件的作用。
@Configuration:在类上贴该注解表示该类是 Spring 的配置类,具有 applicationContext.xml 文件的作用。
@Bean:在 Spring 的配置类的方法上贴该注解后,该方法返回的对象会交给 Spring 容器管理,替代 applicationContext.xml 中的 bean 标签。(属于手动配置方式,可以使用注解配置替代)
@ComponentScan:在 Spring 配置类上贴该注解表示开启组件扫描器,默认扫描当前配置类所在的包,也可以自己指定,替代 XML 配置中的 <context:component-scan /> 标签。(扫描器,扫描需要生成的类)
AnnotationConfigApplicationContext:该类是 ApplicationContext 接口的实现类,该对象是基于 JavaConfig 的方式来运作的 Spring 容器(属于手动配置方式,可以使用注解配置替代)
三、JavaConfig 方式配置 DI
原理:Spring 容器在调用实例方法时,根据方法返回对象类型,判断容器中是否已经存在该类型的实例对象,如果不存在则执行实例方法,将返回对象实例交给容器管理,如果该实例已经存在了,直接从容器中拿已经存在实例对象方法,不执行实例方法。
```
@Bean
public SomeBean someBean() {
SomeBean someBean = new SomeBean();
return someBean;
}(属于手动配置,可使用注解替代)
```
四、使用 IoC DI 注解简化配置
与使用xml注解类似,在需要交给Spring容器管理的类贴上注解@Component,在字段或者设置器上贴@AutoWired即可,在字段上贴属于暴力破解封装,在设置器上贴注解属于使用反射获取。再创建配置类,在配置类上贴上两个注解即可,与xml配置中的 <context:component-scan base-package="cn.wolfcode.bean"/> 扫描器功能相同。
```
@Configuration // 表示该类是 Spring 的配置类
@ComponentScan // 开启组件扫描器,默认扫描当前类所在的包,及其子包
public class JavaConfig { }
```
五、使用junit4和junit5测试类测试的差异
说明:junit5测试类更加简洁。
```
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={配置类1.class, 配置类2.class, ...})
public class IoCTest {
@Autowired
private SomeBean someBean;
@Test
public void test() {
System.out.println(someBean);
}
}
```
```
@SpringJUnitConfig(配置类.class)
class IoCTest {
@Autowired
private SomeBean someBean;
@Test
void test() {
System.out.println(someBean);
}
}
```
六、JavaConfig配置关联次配置
说明:主配置类中关联了次配置类后,测试类中只需要加载主配置文件的路径即可。
```
// 主配置类 mvc.xml
@Configuration
@Import(OtherJavaConfig.class) // 在主配置类中关联次配置类
public class JavaConfig { ... }
// 次配置类 applicationContext.xml
@Configuration
public class OtherJavaConfig { ... }
// 测试
@SpringJUnitConfig(classes = JavaConfig.class) // 加载主配置类
public class IoCTest { ... }
```
七、Spring Boot 介绍
概念:Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。
人们把 Spring Boot 称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建庞大的 Spring 项目,并且尽可能的减少一切 XML 配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。
1、优点
创建独立运行的 Spring 应用程序;
可嵌入 Tomcat,无需部署 war 文件;
简化 Maven 配置;
自动配置 Spring(减少配置);
提供生产就绪型功能,如:日志,健康检查和外部配置等;
不要求配置 XML;
非常容易和第三方框架集成起来。
2、缺点
版本更新较快,可能出现较大变化;
因为约定经常会出现一些很难解决的问题。
(一)使用 IDEA 创建 Spring Boot 工程
两种创建方式:
1.使用官方提供的工具来快速构建项目。IDEA 自带该功能,但需要联网使用。
2.直接在idea上创建。
疑惑解答:
当前项目继承的 spring-boot-starter-parent 项目有什么用?
导入的依赖 spring-boot-starter-web 有什么用?
占用 8080 端口的 Tomcat9 服务器哪来的?
之前的 Web 应用打包是 war,为什么现在的打包方式是 jar?
@SpringBootApplication 注解有什么用?
main 方法中执行的代码 SpringApplication.run(..) 有什么用?
(二)Spring Boot Starter
概述:Spring Boot 在配置上相比 Spring 要简单许多,其核心在于 spring-boot-starter, 在使用 Spring Boot 来搭建一个项目时,只需要引入官方提供的 starter,就可以直接使用,免去了各种配置。
以后若添加依赖时候,发现这个依赖有 starter, 一般这个依赖都会帮开发者配置东西
官方目前已提供的常见的 Starter 如下 :
spring-boot-starter:核心启动器,提供了自动配置,日志和 YAML 配置支持。
spring-boot-starter-aop:支持使用 Spring AOP 和 AspectJ 进行切面编程。
spring-boot-starter-freemarker:支持使用 FreeMarker 视图构建 Web 应用。
spring-boot-starter-test:支持使用 JUnit,测试 Spring Boot 应用。
spring-boot-starter-web:支持使用 Spring MVC 构建 Web 应用,包括 RESTful 应用,使用 Tomcat 作为默认的嵌入式容器。
spring-boot-starter-actuator:支持使用 Spring Boot Actuator 提供生产级别的应用程序监控和管理功能。
spring-boot-starter-logging:提供了对日志的支持,默认使用 Logback。
有关 Spring Boot Starter 命名规范,所有官方发布的 Starter 都遵循以下命名模式:spring-boot-starter-*,其中 * 指特定的应用程序代号或名称。任何第三方提供的 Starter 都不能以 spring-boot 作为前缀,应该将应用程序代号或名称作为前缀,譬如 mybatis-spring-boot-starter。
(三)重要的依赖
web启动器:(Spirngboot已经帮我们配置好了)
```
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
```
```
Spring Boot 项目打包独立运行:
需要我们手动导入,导入后打包会自动生成可独立运行的jar包,否则只有源代码的jar包,运维拿到后还需要装tomcat才能运行
命令行 **启动项目** 时的指令:java -jar xxx.jar --server.port=80;
<!-- pom.xml 中添加插件 -->
<build>
<plugins>
<!-- Spring Boot 打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
```
八、Spring Boot 参数配置
配置文件的三种写法(一般使用application.properties配置)
自定义 properties 文件
```
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/rbac
jdbc.username=root
jdbc.password=admin
```
application.properties 语法
```
server.port=80
server.session-timeout=30
server.tomcat.uri-encoding=UTF-8
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/rbac
spring.datasource.username=root
spring.datasource.password=admin
```
application.yml 语法
```
server:
port: 80
session-timeout: 30
tomcat.uri-encoding: UTF-8
spring:
datasource:
url: jdbc:mysql://localhost:3306/crm
username: root
password: admin
driverClassName: com.mysql.jdbc.Driver
```
概述:读取三种配置文件的方式
一、使用自定义 properties 文件,一定要关联配置类,使用@PropertySource("classpath:db.properties")以及@Value("${jdbc.driverClassName}")两个注解同时完成配置(一般不使用)
二、参数配置在 application.properties(不要关联)
三、@ConfigurationProperties 绑定对象属性
注意:若是使用测试类加载贴有 @Configuration 的配置类,则需要在配置类中添加 @EnableConfigurationProperties 注解;若是使用测试类加载贴有 @SpringBootApplication 的配置类,则不需要。
四、使用 Spring 的 Environment 对象绑定属性
第一步:在# application.properties写好配置文件
```
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/crm
jdbc.username=root
jdbc.password=admin
```
第二步:在配置类中贴上对应的注解
第一种方式:
```
@Component
@ToString
@Setter
@ConfigurationProperties(prefix="jdbc")
public class MyDataSource {
private String driverClassName;
private String url;
private String username;
private String password;
}
第二种方式:
```
@Bean
@ConfigurationProperties("jdbc")
public MyDataSource dataSource() {
return new MyDataSource();
}
```
第三步:在测试类中创建environment对象,使用environment对象获取配置文件的信息
```
@Configuration
@PropertySource("classpath:db.properties")
public class JavaConfig {
/**
* environment:表示 Spring 的环境对象,该对象包含了加载的属性数据
* 可以获取到 application.properties 里面的参数,也可以获取到 @PropertySource 中的参数
* 但 application.properties 的优先级比 @PropertySource 高
*/
@Autowired
private Environment environment;
@Bean
public MyDataSource dataSource() {
MyDataSource dataSource = new MyDataSource();
dataSource.setDriverClassName(environment.getProperty("jdbc.driverClassName"));
dataSource.setUrl(environment.getProperty("jdbc.url"));
dataSource.setUsername(environment.getProperty("jdbc.username"));
dataSource.setPassword(environment.getProperty("jdbc.password"));
return dataSource;
}
}
```
使用时机: