• springboot 自定义starter


    Starter的准备工作

    因为需要一个starter和一个autoconfigure,其中starter引用着autoconfigure

    用Spring Init新建一个项目

    pom.xml如下

    <?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.5.4</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
    	<groupId>com.atguigu</groupId>
    	<artifactId>atguigu-hello-spring-boot-starter-autoconfigure</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>atguigu-hello-spring-boot-starter-autoconfigure</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</artifactId>
    		</dependency>
    	</dependencies>
    </project>
    

    目录结构

    image

    代码如下

    package com.atguigu.hello.bean;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    @ConfigurationProperties("atguigu.hello")
    public class HelloProperties {
    
        private String prefix;
        private String suffix;
    
        public String getPrefix() {
            return prefix;
        }
    
        public void setPrefix(String prefix) {
            this.prefix = prefix;
        }
    
        public String getSuffix() {
            return suffix;
        }
    
        public void setSuffix(String suffix) {
            this.suffix = suffix;
        }
    }
    
    package com.atguigu.hello.auto;
    
    import com.atguigu.hello.bean.HelloProperties;
    import com.atguigu.hello.service.HelloService;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    //默认放在容器中,并绑定配置文件
    @EnableConfigurationProperties(HelloProperties.class)
    public class HelloServiceAutoConfiguration {
    
        @ConditionalOnMissingBean(HelloService.class)
        @Bean
        public HelloService helloService(){
            HelloService helloService = new HelloService();
            return helloService;
        }
    }
    
    package com.atguigu.hello.service;
    
    import com.atguigu.hello.bean.HelloProperties;
    import org.springframework.beans.factory.annotation.Autowired;
    
    /**
     * 默认不要放在容器中
     */
    public class HelloService {
    
        @Autowired
        HelloProperties helloProperties;
    
        public String sayHello(String userName){
            return helloProperties.getPrefix() + ": " + userName + ">>" + helloProperties.getSuffix();
        }
    }
    
    

    在resources下建一个META-INF/spring.factories

    指定加载的autoconfig,因为spring启动默认会加载该目录下的properties文件

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=
    com.atguigu.hello.auto.HelloServiceAutoConfiguration
    

    maven -> clean 和 install 一下

    image

    以maven新建一个项目

    引入刚才autoconfig的依赖

    <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.atguigu</groupId>
        <artifactId>atguigu-hello-spring-boot-starter</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>com.atguigu</groupId>
                <artifactId>atguigu-hello-spring-boot-starter-autoconfigure</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </project>
    

    目录结构

    image

    maven -> clean 和 install 一下

    image

    用spring init新建一个测试用的project

    添加web依赖

    引入自定义starter

    pom.xml如下

    <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.atguigu</groupId>
        <artifactId>atguigu-hello-spring-boot-starter</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>com.atguigu</groupId>
                <artifactId>atguigu-hello-spring-boot-starter-autoconfigure</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </project>
    

    application.properties新建配置属性

    #atguigu.hello.prefix=卡卡罗特
    #atguigu.hello.suffix=超级赛亚人
    #
    atguigu.hello.prefix=我日
    atguigu.hello.suffix=妈的
    
    #atguigu.hello.prefix=whatthefuck
    #atguigu.hello.suffix=shit
    
    #server.servlet.encoding.charset=UTF-8
    #server.servlet.encoding.force=true
    #server.servlet.encoding.enabled=true
    
    banner.charset=UTF-8
    #server.tomcat.uri-encoding=UTF-8
    #server.servlet.encoding.charset=UTF-8
    #server.servlet.encoding.enabled=true
    #server.servlet.encoding.force=true
    #spring.messages.encoding=UTF-8
    

    代码

    package com.atguigu.controller;
    
    import com.atguigu.hello.service.HelloService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloController {
    
        @Autowired
        HelloService helloService;
    
        @Value("${atguigu.hello.prefix}")
        String prefix;
    
        @GetMapping(value = "/hello")
        public String sayHello(){
            System.out.println(prefix + " prefix");
            return helloService.sayHello("贝吉塔");
        }
    }
    

    下面这个不写也可以,这个是覆盖了starter里边的HelloService,自定义的HelloService

    package com.atguigu.config;
    
    import com.atguigu.hello.service.HelloService;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class MyConfig {
    
        @Bean
        public HelloService helloService(){
            HelloService helloService = new HelloService();
            return helloService;
        }
    }
    
    @SpringBootApplication
    public class Boot09HelloTestApplication {
        public static void main(String[] args) {
            SpringApplication.run(Boot09HelloTestApplication.class, args);
        }
    }
    

    启动项目测试访问

    image

    遇到的问题

    当我在application.properties设置中文时老是出现乱码

    把这个勾上,但是光勾这个不太好使

    image

    还需要在applicaiton.properties中添加配置

    banner.charset=UTF-8
    #server.tomcat.uri-encoding=UTF-8
    #server.servlet.encoding.charset=UTF-8
    #server.servlet.encoding.enabled=true
    #server.servlet.encoding.force=true
    #spring.messages.encoding=UTF-8
    
  • 相关阅读:
    ThreadLocal垮线程池传递数据解决方案:TransmittableThreadLocal
    java steam 使用指南groupingBy进阶用法
    微言Netty:百万并发基石上的epoll之剑
    ES聚合查询详解(一)
    肝了一个月的Netty知识点(上)
    kafka 如何保证消息不丢失
    IO多路复用
    Java 重入锁
    Kotlin中的协程和多线程比较实验
    mysql性能排查思路
  • 原文地址:https://www.cnblogs.com/kaka-qiqi/p/15183607.html
Copyright © 2020-2023  润新知