• spring boot自定义starter


      使用spring boot开发微服务后,工程的数量大大增加(一定要按照领域来切,不要一个中间件客户端包一个),让各个jar从开发和运行时自包含成了一个重要的内容之一。spring boot starter就可以用来解决该问题(没事启动时别依赖于applicationContext.getBean获取bean进行处理,依赖关系太折腾,有时候在复杂系统中解决此事比较麻烦,需要修改开源框架代码才能实现,反过来修改开源源码后,维护也是个麻烦事)。言归正传,说说自定义starter。首先请熟悉spring boot的核心理念,不然容易为了starter而starter,这种情况太多了。

    1. 创建一个maven项目,在pom文件中添加如下依赖:
       <dependencies>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-autoconfigure</artifactId>
               <version>2.0.0.RELEASE</version>
           </dependency>
       </dependencies>
    
       <build>
           <plugins>
               <plugin>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-maven-plugin</artifactId>
               </plugin>
           </plugins>
       </build>
    1. 创建properties属性类,用于读取属性(当然可选,如果一开始没有按照spring boot autoconfig的套路来,改起来还是挺费劲的,但是一旦这么做了,就会想,TMD这才是真正的开发模式,@Value那套早该丢了)。
    @ConfigurationProperties(prefix = "com.xxx")
    public class HelloServiceProperties {
    
        private String name = "james";
    
        private String hobby = "cc";
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getHobby() {
            return hobby;
        }
    
        public void setHobby(String hobby) {
            this.hobby = hobby;
        }
    }

      @ConfigurationProperties配置此注解可以自动导入application.properties配置文件中的属性,前提需要指定属性前缀prefix。

      3.创建配置类

    public class HelloService {
    
        private String name;
    
        private String hobby;
    
        public String getName() {
            return "name is " + name;
        }
    
        public String getHobby() {
            return "hobby is " + hobby;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setHobby(String hobby) {
            this.hobby = hobby;
        }
    }
    1. 创建自动配置类:
    @Configuration
    @EnableConfigurationProperties(HelloServiceProperties.class)
    @ConditionalOnClass(HelloServiceConfiguration.class)
    @ConditionalOnProperty(prefix = "com.xxx", value = "enabled", matchIfMissing = true)
    @ComponentScan({"com.xxx"}) // 如果bean比较多,一般采用这种方式
    public class HelloServiceAutoConfiguration { @Autowired private HelloServiceProperties helloServiceProperties; @Bean // bean比较少、且顺序和逻辑有特殊要求的模块,一般采用这种方式 @ConditionalOnMissingBean(HelloServiceConfiguration.class) public HelloServiceConfiguration helloServiceConfiguration() { HelloService helloService = new HelloService(); helloService.setName(helloServiceProperties.getName()); helloService.setHobby(helloServiceProperties.getHobby()); return helloService; } }
    1. 在resources文件夹下面新建一个META-INF文件,并在下面创建spring.factories文件,将4中的配置类进行注册。
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.xxx.HelloServiceAutoConfiguration
    1. 新建一个springboot项目,在pom文件中添加刚刚打包的jar的坐标。
    2. 使用@Autowired访问接口。
    @SpringBootApplication
    @RestController
    public class Springboot03Application {
    
        @Autowired
        private HelloService helloService;
    
        public static void main(String[] args) {
            SpringApplication.run(Springboot03Application.class, args);
        }
    
        @RequestMapping("/name")
        public String getName() {
            return helloService.getName();
        }
    
        @RequestMapping("/hobby")
        public String getHobby() {
            return helloService.getHobby();
        }
    }

      相比原来要使用@Import注解导入一个@Configuration类,或者在一处集中维护ComponentScan的所有路径,使用autoconfigure starter可以让应用明显实现的更加自包含和解耦。

  • 相关阅读:
    WITH HINDSIGHT
    圆桌最后冲刺
    圆桌总结
    圆桌十日冲刺之⑨
    圆桌十日冲刺之八
    圆桌十日冲刺之七
    圆桌十日冲刺之六
    【09NOIP提高组】Hankson 的趣味题(信息学奥赛一本通 1856)(洛谷 1072)
    灯泡(信息学奥赛一本通 1438)
    最大公约数(信息学奥赛一本通 1627)
  • 原文地址:https://www.cnblogs.com/zhjh256/p/12045636.html
Copyright © 2020-2023  润新知