主頁 >  其他 > springBoot快速學習筆記

springBoot快速學習筆記

2021-09-17 13:13:58 其他

springBoot快速學習筆記

概述:

springboot快速入門:

1.新添加一個module

2.通過maven創建專案

在pom.xml中匯入依賴等:

<!--springboot鞏華城需要繼承的父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.18.RELEASE</version>
    </parent>

    <!--    web開發的起步依賴-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

在Java源代碼目錄下創建controller類:

package com.xiaowei.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author xiaowei
 * @description:
 * @create 2021-09-09-20:56
 */
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        return "hello Spring Boot!";
    }
}

撰寫springboot的引導類:

package com.xiaowei;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author xiaowei
 * @description:引導類,SpringBoot專案的入口
 * @create 2021-09-09-21:05
 */
@SpringBootApplication
public class HelloApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class,args);
    }
}

運行引導類,在控制臺可以看到:

打開瀏覽器,輸入 http:localhost:8080/hello:

使用idea快速構建springboot工程:

與之前不同的是這一次,我們選擇 spring initializr ,可以看到它有提示:

點擊選擇下一步(這里的網址是springboot構建的默認網址):

網址如下:

配置:

使用圖形化界面配置依賴,可以選擇相應的依賴配置:

一路next即可;

等待依賴匯入,如果匯入有問題,可參考:

匯入成功如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.18.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.xiaowei</groupId>
    <artifactId>springboot-init</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-init</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

<!--        測驗用的依賴坐標-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.18.RELEASE</version>
            </plugin>
        </plugins>
    </build>

</project>

可以看到已經自動創建好引導類、測驗等,我們只需創建controller類即可:

創建controller類:

package com.xiaowei.springbootinit;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author xiaowei
 * @description:
 * @create 2021-09-09-21:55
 */
@RestController
public class HelloController {
@RequestMapping("/hello")
    public  String Hello(){
        return "hello spring boot1111";
    }
}

點擊運行,發現出錯!

根據提示得知原來是埠8080 被占用,原來是之前專案的tomcat并沒有關閉,只需關閉tomcat,然后重啟當前工程即可,

springboot起步依賴原理分析:

首先分析這個parent,ctrl點擊進入:

我們可以看它還依賴另一個parent,再次點擊進入:

可以看到里面有一個dependencyManagement(版本鎖定),里面配置了各個依賴的版本坐標資訊,當然也不僅僅是依賴

接下來分析spring-boot-starter-web,點進去查看,發現:

可以看到它的里面仍然引入了很多相關的依賴:(即相當如匯入了這一個依賴即匯入了以下依賴)

組態檔分類:

springboot是基于約定的,所以很多配置都有默認值,但如果想使用自己的配置替換默認配置的話,可以使用application.properties或者application.yml(application.yaml)進行配置,

  • propertie:
server.port=8080
  • yaml:
server:
  port: 8080

我們可以看到已經創建好的工程已經有一個已經創建好的組態檔,我們嘗試修改一下,并啟動工程

打開瀏覽器訪問:

加載組態檔中自定義內容:

如果同時在三個組態檔(application.properties、application.yml、application.yaml)中配置埠號那個會生效呢?

優先級從高到低依次為:application.properties > application.yml > application.yaml

yaml:

備注:使用idea等高級開發工會據時可忽略tab鍵問題,可直接使用

純量可直接認為是常量

自定義組態檔內容:

name: xiaowei

person:
  name: ${name}
  age: 18

address:
  - beijing
  - shanghai

address1: [hefei,zobo]

msg1: 'hello \n world'
msg2: "hello \n world"

測驗第一種方式:

@RestController
public class HelloController {

    @Value("${name}")
    private  String name;
    @RequestMapping("/hello2")
    public  String Hello2(){
        return name;
    }
}

測驗結果:

測驗陣列:

@RestController
public class HelloController {

    @Value("${address[0]}")
    private  String address1;
    @RequestMapping("/hello2")
    public  String Hello2(){
        return "我家在" + address1;
    }
 }

最終總結:組態檔內容一定切記加空格加空格加空格

第二種方式:

注意:在匯入environment的時候一定不要匯入錯了

public class HelloController {

    @Value("${msg1}")
    private  String msg1;

    @Value("${msg2}")
    private  String msg2;

    @Autowired
    private Environment env;

    @RequestMapping("/hello2")
    public  String Hello2(){

        System.out.println(env.getProperty("person.name"));
        System.out.println(env.getProperty("address[0]"));
        return "xinxi" + msg2;
    }
 }

第三種方式:注冊物件將對應屬性值注入

首先創建對應類:

package com.xiaowei.springbootinit;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @author xiaowei
 * @description:
 * @create 2021-09-11-14:43
 */
//@Component 注解用于被spring識別為bean
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private int age;
    private  String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

測驗:

package com.xiaowei.springbootinit;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author xiaowei
 * @description:
 * @create 2021-09-09-21:55
 */
@RestController
public class HelloController {

    @Value("${msg1}")
    private  String msg1;

    @Value("${msg2}")
    private  String msg2;

    @Autowired
    private Environment env;
    @Autowired
    private Person person;

    @RequestMapping("/hello2")
    public  String Hello2(){

        System.out.println(env.getProperty("person.name"));
        System.out.println(env.getProperty("address[0]"));
        System.out.println(person);
        return "xinxi" + msg2;
    }
}

同時我們注意到在創建person Bean類加入@ConfigurationProperties的時候,有以下提示:

根據檔案提示,在pom.xml中加入以下依賴:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>

可以使得組態檔在添加屬性是有相應提示;

profile:

方式一:多profile檔案方式

在開發環境組態檔中修改埠號為:8081

在主組態檔添加: spring.profiles.active=dev

方式二:yml多檔案方式

即在一個yml檔案中以分隔符分成多個檔案,并為每個檔案起個名

---
server:
  port: 8081
spring:
  profiles: dev


---
server:
  port: 8082
spring:
  profiles: test


---
server:
  port: 8083

spring:
  profiles: pro
  
---
spring:
  profiles:
    active: dev

結果:

激活方式:虛擬機引數

測驗結果:

激活方式:命令列引數

測驗結果:

在非idea開發環境下如何傳入引數:

使用maven工程將專案打包:

在空白處按 shift 加 滑鼠右鍵 選擇 打開Windows PowerShell :

這樣即可給它加上引數

內部組態檔加載順序:

外部配置加載順序:

參考官方檔案:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

springboot整合redis:

1.創建springboot工程

2.選擇對應的依賴

redis未學,學完再看

springboot整合junit:

1.創建springboot工程

2.引入junit測驗的依賴(一般默認自帶)

3.創建對應業務類(service類)

4.創建對應測驗類

一個注意事項:

在創建測驗類的程序中如果對應service類的包名和test對應測驗類的包名相同,則@SpringBootTest注解中不需要添加classes屬性

springboot整合mybatis:

1.創建springboot工程

2.引入mybatis依賴,以及mysql驅動:

查看相應pom依賴檔案:

不同于之前的專案的start,這個是以mybatis開頭的,不是springboot官方提供的依賴,是mybatis提供的

3.在mybatis中新建一個資料庫:

4.創建對應的物體類:

5.創建對應資料庫的組態檔:

# datasource

spring:
  datasource:
    url: jdbc:mysql:///springboot
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

6.1創建對應mapper檔案(注解方式):

package com.xiaowei.springbootmybatis.mapper;

import com.xiaowei.springbootmybatis.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * @author xiaowei
 * @description:
 * @create 2021-09-12-14:52
 */
@Mapper
public interface UserMapper {
    @Select("select * from t_user")
    public List<User> findAll();
}

6.2創建對應mapper檔案(組態檔方式)

package com.xiaowei.springbootmybatis.mapper;

import com.xiaowei.springbootmybatis.domain.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * @author xiaowei
 * @description:
 * @create 2021-09-12-15:05
 */
@Mapper
public interface UserXmlMapper {
    public List<User> findAll();
}

7.創建對應的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.xiaowei.springbootmybatis.mapper.UserXmlMapper">
    <select id="findAll" resultType="user">
        select * from t_user
    </select>
</mapper>

8.配置mybatis對應組態檔:

# mybatis
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml #mapper映射檔案路徑
  type-aliases-package: com.xiaowei.springbootmybatis.domin
  #config-location: #指定mybatis的核心組態檔

9.創建測驗類測驗:

package com.xiaowei.springbootmybatis;

import com.xiaowei.springbootmybatis.domain.User;
import com.xiaowei.springbootmybatis.mapper.UserMapper;
import com.xiaowei.springbootmybatis.mapper.UserXmlMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class SpringbootMybatisApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private UserXmlMapper userXmlMapper;
    @Test
   public void testFindAll() {
        List<User> list = userMapper.findAll();
        System.out.println(list);
    }

    @Test
    public void testFindAll1() {
        List<User> list = userXmlMapper.findAll();
        System.out.println(list);
    }

}

springboot自動配置原理分析:

condition:

condition是在spring4.0增加的條件判斷功能,通過這個可以實作選擇性的創建bean操作

實作需求1:

0.匯入jedis坐標:

dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

1.創建user的bean:

public class User {
}

2.嘗試是否能獲取這個bean :

package com.itheima.springbootcondition;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class SpringbootConditionApplication {

    public static void main(String[] args) {
        //啟動SpringBoot的應用,回傳Spring的IOC容器
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootConditionApplication.class, args);

        //獲取Bean
        Object user = context.getBean("user");
        

       
        System.out.println(user);

    }

}

3.創建條件判斷對應類:

package com.itheima.springbootcondition.condtion;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;

import java.util.Map;

public class ClassCondition implements Condition {
    /**
     *
     * @param context 背景關系物件,用于獲取環境,IOC容器,ClassLoader物件
     * @param metadata 注解元物件, 可以用于獲取注解定義的屬性值
     * @return
     */
    @Override
    //該方法判斷決定是否創建對應的bean
    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;  

    }
}

4.寫user bean對應的J配置類:

package com.itheima.springbootcondition.config;

import com.itheima.springbootcondition.condtion.ClassCondition;
import com.itheima.springbootcondition.condtion.ConditionOnClass;
import com.itheima.springbootcondition.domain.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

@Configuration
public class UserConfig {

    @Bean
    //conditional內部指定創建的條件物件,回傳true創建物件,false不創建物件
    //@Conditional(ClassCondition.class)
    public User user(){
        return new User();
    }
}

實作需求2:判斷位元組碼檔案可以動態指定

1.創建一個自定義注解:

上面三個注解為參考原始碼的元注解,第一個代表注解可以添加的范圍,第二個代表注解生效的時機,第三個代表生成javadoc的檔案

同時還需要加上內部指定創建的條件物件

package condition;

import org.springframework.context.annotation.Conditional;

import java.lang.annotation.*;

/**
 * @author xiaowei
 * @description:
 * @create 2021-09-13-20:09
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ClassCondition.class)
public @interface ConditionOnClass {
String[] value();
}

2.修改config類:

@Configuration
public class UserConfig {
    @Bean
    //改為自己配置的注解,內部指定判斷位元組碼檔案
  @ConditionOnClass("redis.clients.jedis.Jedis")
    public User user(){
        return new User();
    }
}

3.修改條件判斷類:

public class ClassCondition implements Condition {
    /**
     *
     * @param context 背景關系物件,用于獲取環境,IOC容器,ClassLoader物件
     * @param metadata 注解元物件, 可以用于獲取注解定義的屬性值
     * @return
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
       
       
        //2.需求: 匯入通過注解屬性值value指定坐標后創建Bean

        //獲取注解屬性值  value
        Map<String, Object> map = metadata.getAnnotationAttributes(ConditionOnClass.class.getName());
        //System.out.println(map);
        String[] value = https://www.cnblogs.com/xiaowei99/p/(String[]) map.get("value");

        boolean flag = true;
        try {
            for (String className : value) {
                Class<?> cls = Class.forName(className);
            }
        } catch (ClassNotFoundException e) {
            flag = false;
        }
        return flag;

    }
}

切換內置web服務器:

springboot默認使用tomcat作為內置服務器,springboot提供了4種內置服務器供我們選擇,

tomcat是在web-start坐標內包含的,我們需要將其祛除,再引入別的web服務器:

按照下圖式操作,可查看依賴圖示:

打開如下,找到對應tomcat依賴,右鍵選擇exclude:

發現pom檔案有一些改動:

此時我們再引入需要的web服務器:

<dependency>
            <artifactId>spring-boot-starter-jetty</artifactId>
            <groupId>org.springframework.boot</groupId>
        </dependency>

此時我們重啟服務:

@Enable注解:

SpringBoot中提供了很多Enable開頭的注解,這些注解都是用于動態啟用某些功能的,而其底層原理是使用@Import注 解匯入一些配置類,實作Bean的動態加載,

springboot不能直接獲取外部包里定義的bean

解決方案:

1.使用@componentScan掃描要引入外部包

eg: @ComponentScan("com.xiaowei.config")

2.可以使用@import注解,加載類,這些類都會被spring創建,并放入IOC容器

eg:@import(UserConfig.class)

3.將@import注解封裝

package com.itheima.config;

import org.springframework.context.annotation.Import;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(UserConfig.class)
public @interface EnableUser {
}

在外部需要使用的地方,直接使用@EnableUser注解即可

@import注解:

@Enable*底層依賴于@Import注解匯入一些類,使用@Import匯入的類會被Spring加載到IOC容器中,而@Import提供4種用 法:

① 匯入Bean

@Import(User.class)
public class SpringbootEnableApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);
      User user = context.getBean(User.class);
        System.out.println(user);
  }

② 匯入配置類 (可以匯入配置類中的所有類)

@Import(UserConfig.class)
public class SpringbootEnableApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);


      	User user = context.getBean(User.class);
        System.out.println(user);

        Role role = context.getBean(Role.class);
        System.out.println(role);
    }

③ 匯入 ImportSelector 實作類,一般用于加載組態檔中的類

實作類:

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.itheima.domain.User", "com.itheima.domain.Role"};
    }
}

匯入:

@Import(MyImportSelector.class)
public class SpringbootEnableApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);

        User user = context.getBean(User.class);
        System.out.println(user);

        Role role = context.getBean(Role.class);
        System.out.println(role);
  }

④ 匯入 ImportBeanDefinitionRegistrar 實作類,

實作類:

package com.itheima.config;

import com.itheima.domain.User;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
        registry.registerBeanDefinition("user", beanDefinition);
    }
}

匯入

@Import({MyImportBeanDefinitionRegistrar.class})
@SpringBootApplication
public class SpringbootEnableApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);

    	User user = context.getBean(User.class);
        System.out.println(user);
 }

@EnableAutoConfiguration注解

? @EnableAutoConfiguration 注解內部使用 @Import(AutoConfigurationImportSelector.class)來加載配置類,

? 組態檔位置:META-INF/spring.factories,該組態檔中定義了大量的配置類,當 SpringBoot 應用啟動時,會自動加載 這些配置類,初始化Bean
? 并不是所有的Bean都會被初始化,在配置類中使用Condition來加載滿足條件的Bean

自定義starter:

實作步驟:

1.創建模塊:

redis-springboot-starter模塊添加依賴:

redis-springboot-autoconfigure模塊添加依賴:

在autoconfigure中配置

配置從用戶段獲取redis的主機名與埠號:

初始化jedis的bean:

創建檔案:

復制全名稱寫入檔案:

關閉mybatis依賴,啟用自定義starter依賴:

測驗是否成功:

springboot監聽機制:

ApplicationContextInitializer:

@Component
public class MyListenner implements ApplicationContextInitializer {
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("監聽器已生效!!!!!");
    }
}

SpringApplicationRunListener:

package com.xiaowei.springbootlistenner.listenner;

import org.springframework.boot.ConfigurableBootstrapContext;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.stereotype.Component;

/**
 * @author xiaowei
 * @description:
 * @create 2021-09-15-20:04
 */
@Component
public class MyListenner2 implements SpringApplicationRunListener {
    @Override
    public void starting(ConfigurableBootstrapContext bootstrapContext) {
        System.out.println("專案啟動中!");
    }

    @Override
    public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {
        System.out.println("環境準備中!!!");
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        System.out.println("背景關系物件開始準備!!!");
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        System.out.println("背景關系物件開始加載!!!");
    }

    @Override
    public void started(ConfigurableApplicationContext context) {
        System.out.println("背景關系物件加載完成!!!");
    }

    @Override
    public void running(ConfigurableApplicationContext context) {
        System.out.println("專案開始運行!!!!");
    }

    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) {
        System.out.println("專案啟動失敗!!!");
    }
}

CommandLineRunner:

package com.xiaowei.springbootlistenner.listenner;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/**
 * @author xiaowei
 * @description:
 * @create 2021-09-15-20:12
 */
@Component
public class MyListenner3 implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("runner!!!!");
    }
}

ApplicationRunner:

package com.xiaowei.springbootlistenner.listenner;

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

/**
 * @author xiaowei
 * @description:
 * @create 2021-09-15-20:14
 */
@Component
public class MyListenner4 implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("runner!!!!!");
    }
}

嘗試啟動專案后發現只有后兩種方案可以列印出來,前兩種需要配置;

如何配置前兩種:

在resource檔案夾下創建 META-INF/spring.factories,在其中配置 實作介面全類名=實作類的全類名

org.springframework.context.ApplicationContextInitializer=com.xiaowei.springbootlistenner.listenner.MyListenner

org.springframework.boot.SpringApplicationRunListener=com.xiaowei.springbootlistenner.listenner.MyListenner2

第一個實作沒有問題,我們發現第二個出錯:

經過分析原始碼,查看其他實作類得知需要一個初始化的構造器方法(將@component注解去除):

package com.xiaowei.springbootlistenner.listenner;

import org.springframework.boot.ConfigurableBootstrapContext;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;

/**
 * @author xiaowei
 * @description:
 * @create 2021-09-15-20:04
 */

public class MyListenner2 implements SpringApplicationRunListener {
    public MyListenner2(SpringApplication application,String[] args) {
    }

    @Override
    public void starting(ConfigurableBootstrapContext bootstrapContext) {
        System.out.println("專案啟動中!");
    }

    @Override
    public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {
        System.out.println("環境準備中!!!");
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        System.out.println("背景關系物件開始準備!!!");
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        System.out.println("背景關系物件開始加載!!!");
    }

    @Override
    public void started(ConfigurableApplicationContext context) {
        System.out.println("背景關系物件加載完成!!!");
    }

    @Override
    public void running(ConfigurableApplicationContext context) {
        System.out.println("專案開始運行!!!!");
    }

    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) {
        System.out.println("專案啟動失敗!!!");
    }
}

springboot啟動流程分析:

springboot監控:

SpringBoot自帶監控功能Actuator,可以幫助實作對程式內部運行情況監控,比如監控狀況、Bean加載情況、配置屬性 、日志資訊等,

使用步驟:

在springboot里創建新模塊,匯入依賴:

啟動專案:

查看:

得到json字串,決議有:

health是專案的健康資訊,不暴露過多

在application.properties添加

#開啟健康資訊
management.endpoint.health.show-details=always

運行結果為:

開啟所有endpoint :

在application.properties添加

#將所有的endpoint暴露出來
management.endpoints.web.exposure.include=*

查看:

Admin圖形化界面使用:

? Spring Boot Admin是一個開源社區專案,用于管理和監控SpringBoot應用程式,

? Spring Boot Admin 有兩個角色,客戶端(Client)和服務端(Server),

? 應用程式作為Spring Boot Admin Client向為Spring Boot Admin Server注冊

? Spring Boot Admin Server 的UI界面將Spring Boot Admin Client的Actuator Endpoint上的一些監控資訊,

admin-server:

① 創建 admin-server 模塊

② 匯入依賴坐標 admin-starter-server

③ 在引導類上啟用監控功能@EnableAdminServer

admin-client:

① 創建 admin-client 模塊

② 匯入依賴坐標 admin-starter-client

③ 配置相關資訊:server地址等

④ 啟動server和client服務,訪問server

使用:

創建一個新模塊:

查看pom.xml檔案,引入了相關依賴:

在啟動類加上EnableAdminServer

創建一個client類:

查看依賴;

在屬性中添加配置:

#執行admin.server地址
spring.boot.admin.client.url=http://localhost:9000

management.endpoint.health.show-details=always
management.endpoints.jmx.exposure.include=*

注意:server的埠號已改為9000

將兩個模塊都啟動,并在瀏覽器輸入:localhost:9000

同時在IDEA中我們也能直接看到endpoint相關的資訊:

springboot專案部署:

使用maven打包,默認打jar包;

如何打war包:在啟動類:

將pom.xml中打包方式改為 war,可以指定外部服務器

打包好后如何部署:

直接放到外部服務器(tomcat)的webapps中,啟動服務器即可

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300859.html

標籤:其他

上一篇:Jmeter-集合點【同步定時器】應用

下一篇:穿越時空,跟我一起探索云棲數字谷(2021云棲大會免費送票)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more