SpringBoot概述
SpringBoot提供了一種快速使用Spring的方式,基于約定優于配置的思想,可以讓開發人員不必在配置與邏輯業務之間進行思維的切換,全身心的投入到邏輯業務的代碼撰寫中,從而大大提高了開發的效率
SpringBoot功能
1)自動配置
Spring Boot的自動配置是一個運行時(更準確地說,是應用程式啟動時)的程序,考慮了眾多因素,才決定Spring配置應該用哪個,不該用哪個,該程序是SpringBoot自動完成的,
2)起步依賴
起步依賴本質上是一個Maven專案物件模型(Project Object Model,POM),定義了對其他庫的傳遞依賴,這些東西加在一起即支持某項功能,
簡單的說,起步依賴就是將具備某種功能的坐標打包到一起,并提供一些默認的功能,
3)輔助功能
提供了一些大型專案中常見的非功能性特性,如嵌入式服務器、安全、指標,健康檢測、外部配置等,
注意:Spring Boot 并不是對 Spring 功能上的增強,而是提供了一種快速使用 Spring 的方式,
SpringBoot快速入門
需求:搭建SpringBoot工程,定義HelloController.hello()方法,回傳“Hello SpringBoot!”,
實作步驟:
①創建Maven專案
②匯入SpringBoot起步依賴
<!--springboot工程需要繼承的父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
</parent>
<dependencies>
<!--web開發的起步依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
③定義Controller
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return " hello Spring Boot !";
}
}
④撰寫引導類
/**
* 引導類, SpringBoot專案的入口
*/
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class,args);
}
}
⑤啟動測驗
快速構建SpringBoot工程
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ICOkYPrz-1631353027800)(/images/springboot01.png3">
/**
* 測驗類
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootJunitApplication.class )
public class UserServiceTest {
@Test
public void test(){
System.out.println(111);
}
}
4.測驗
整合mybatis
①搭建SpringBoot工程
②引入mybatis起步依賴,添加mysql驅動
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--<scope>runtime</scope>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
③撰寫DataSource和MyBatis相關配置
application.yml
# datasource
spring:
datasource:
url: jdbc:mysql:///springboot?serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# mybatis
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml # mapper映射檔案路徑
type-aliases-package: com.Huzc.springbootmybatis.domain
# config-location: # 指定mybatis的核心組態檔
④定義表和物體類
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
⑤撰寫dao和mapper檔案/純注解開發
撰寫dao
@Mapper
@Repository
public interface UserXmlMapper {
public List<User> findAll();
}
mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hzc.springbootmybatis.mapper.UserXmlMapper">
<select id="findAll" resultType="user">
select * from t_user
</select>
</mapper>
純注解開發
@Mapper
@Repository
public interface UserMapper {
@Select("select * from t_user")
public List<User> findAll();
}
⑥測驗
整合redis
①搭建SpringBoot工程
②引入redis起步依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
③配置redis相關屬性
spring:
redis:
host: 127.0.0.1 # redis的主機ip
port: 6379
④注入RedisTemplate模板
⑤撰寫測驗方法,測驗
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootRedisApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testSet() {
//存入資料
redisTemplate.boundValueOps("name").set("zhangsan");
}
@Test
public void testGet() {
//獲取資料
Object name = redisTemplate.boundValueOps("name").get();
System.out.println(name);
}
}
自動配置-Condition-1
Condition是Spring4.0后引入的條件化配置介面,通過實作Condition介面可以完成有條件的加載相應的Bean
@Conditional要配和Condition的實作類(ClassCondition)進行使用
- ClassCondition
public class ClassCondition implements Condition {
/**
*
* @param context 背景關系物件,用于獲取環境,IOC容器,ClassLoader物件
* @param metadata 注解元物件, 可以用于獲取注解定義的屬性值
* @return
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//1.需求: 匯入Jedis坐標后創建Bean
//思路:判斷redis.clients.jedis.Jedis.class檔案是否存在
boolean flag = true;
try {
Class<?> cls = Class.forName("redis.clients.jedis.Jedis");
} catch (ClassNotFoundException e) {
flag = false;
}
return flag;
}
}
- UserConfig
@Configuration
public class UserConfig {
@Bean
@Conditional(ClassCondition.class)
public User user(){
return new User();
}
}
測驗
@SpringBootApplication
public class SpringbootConditionApplication {
public static void main(String[] args) {
//啟動SpringBoot的應用,回傳Spring的IOC容器
ConfigurableApplicationContext context = SpringApplication.run(SpringbootConditionApplication.class, args);
Object user = context.getBean("user");
System.out.println(user);
}
}
自動配置-Condition-2
需求:將類的判斷定義為動態的,判斷哪個位元組碼檔案存在可以動態指定,
自定義條件注解類
import org.springframework.context.annotation.Conditional;
import java.lang.annotation.*;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ClassCondition.class)
public @interface ConditionOnClass {
String[] value();
}
**注意:**此處@ConditionOnClass為自定義注解
@Configuration
public class UserConfig {
@Bean
//@Conditional(ClassCondition.class)
@ConditionOnClass("com.alibaba.fastjson.JSON")
public User user(){
return new User();
}
@Bean
@ConditionalOnProperty(name = "hzc",havingValue = "hzc")
public User user2(){
return new User();
}
}
測驗User物件的創建
@SpringBootApplication
public class SpringbootConditionApplication {
public static void main(String[] args) {
//啟動SpringBoot的應用,回傳Spring的IOC容器
ConfigurableApplicationContext context = SpringApplication.run(SpringbootConditionApplication.class, args);
Object user = context.getBean("user");
System.out.println(user);
}
}
查看條件注解原始碼
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hTL4IrzI-1631353027807)(/images/springboot06.png2">
創建RedisProperties組態檔引數系結類
@ConfigurationProperties(prefix = "redis")
public class RedisProperties {
private String host = "localhost";
private int port = 6379;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
}
創建RedisAutoConfiguration自動配置類
@Configuration
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {
/**
* 提供Jedis的bean
*/
@Bean
public Jedis jedis(RedisProperties redisProperties) {
return new Jedis(redisProperties.getHost(), redisProperties.getPort());
}
}
在resource目錄下創建META-INF檔案夾并創建spring.factories
注意:“\ ”是換行使用的
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.hzc.redis.config.RedisAutoConfiguration
- 在springboot-enable工程中引入自定義的redis的starter
<!--自定義的redis的starter-->
<dependency>
<groupId>com.hzc</groupId>
<artifactId>redis-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
在SpringbootEnableApplication啟動類中測驗
Jedis jedis = context.getBean(Jedis.class);
System.out.println(jedis);
自動配置-自定義starter實作-2
測驗springboot-enable工程中的application.properties中的配置引數
redis.port=6666
使用注解完成有條件加載配置類
@Configuration
@EnableConfigurationProperties(RedisProperties.class)
@ConditionalOnClass(Jedis.class)
public class RedisAutoConfiguration {
/**
* 提供Jedis的bean
*/
@Bean
@ConditionalOnMissingBean(name = "jedis")
public Jedis jedis(RedisProperties redisProperties) {
System.out.println("RedisAutoConfiguration....");
return new Jedis(redisProperties.getHost(), redisProperties.getPort());
}
}
事件監聽
Java中的事件監聽機制定義了以下幾個角色:
- 事件:Event,繼承 java.util.EventObject 類的物件
- 事件源:Source ,任意物件Object
- 監聽器:Listener,實作 java.util.EventListener 介面 的物件
SpringBoot 在專案啟動時,會對幾個監聽器進行回呼,我們可以實作這些監聽器介面,在專案啟動時完成一些操作,
- ApplicationContextInitializer
- SpringApplicationRunListener
- CommandLineRunner
- ApplicationRunner
自定義監聽器的啟動時機:MyApplicationRunner和MyCommandLineRunner都是當專案啟動后執行,使用@Component放入容器即可使用
MyApplicationRunner
/**
* 當專案啟動后執行run方法,
*/
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("ApplicationRunner...run");
System.out.println(Arrays.asList(args.getSourceArgs()));
}
}
MyCommandLineRunner
@Component
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("CommandLineRunner...run");
System.out.println(Arrays.asList(args));
}
}
MyApplicationContextInitializer的使用要在resource檔案夾下添加META-INF/spring.factories
org.springframework.context.ApplicationContextInitializer=com.hzc.springbootlistener.listener.MyApplicationContextInitializer
@Component
public class MyApplicationContextInitializer implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("ApplicationContextInitializer....initialize");
}
}
MySpringApplicationRunListener的使用要添加構造器
public class MySpringApplicationRunListener implements SpringApplicationRunListener {
public MySpringApplicationRunListener(SpringApplication application, String[] args) {
}
@Override
public void starting() {
System.out.println("starting...專案啟動中");
}
@Override
public void environmentPrepared(ConfigurableEnvironment environment) {
System.out.println("environmentPrepared...環境物件開始準備");
}
@Override
public void contextPrepared(ConfigurableApplicationContext context) {
System.out.println("contextPrepared...背景關系物件開始準備");
}
@Override
public void contextLoaded(ConfigurableApplicationContext context) {
System.out.println("contextLoaded...背景關系物件開始加載");
}
@Override
public void started(ConfigurableApplicationContext context) {
System.out.println("started...背景關系物件加載完成");
}
@Override
public void running(ConfigurableApplicationContext context) {
System.out.println("running...專案啟動完成,開始運行");
}
@Override
public void failed(ConfigurableApplicationContext context, Throwable exception) {
System.out.println("failed...專案啟動失敗");
}
}
流程分析-初始化
- 配置啟動引導類(判斷是否有啟動主類)
- 判斷是否是Web環境
- 獲取初始化類、監聽器類
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aHMDQFzl-1631353027809)(/images/springboot10.png3">
@EnableAdminServer
@SpringBootApplication
public class SpringbootAdminServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootAdminServerApplication.class, args);
}
}
admin-client:
- 創建 admin-client 模塊
- 匯入依賴坐標 admin-starter-client
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>
- 配置相關資訊:server地址等
# 執行admin.server地址
spring.boot.admin.client.url=http://localhost:9000
management.endpoint.health.show-details=always
management.endpoints.web.exposure.include=*
- 啟動server和client服務,訪問server
SpringBoot部署
SpringBoot 專案開發完畢后,支持兩種方式部署到服務器:
- jar包(官方推薦)
- war包
更改pom檔案中的打包方式為war
修改啟動類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class SpringbootDeployApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringbootDeployApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringbootDeployApplication.class);
}
}
指定打包的名稱
<build>
<finalName>springboot</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
spring boot博客密碼:springboot
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/299406.html
標籤:其他
