29.定制stater

如果现有的strter无法满足自己目前的需求,可以自定starter

实现步骤:
    1.创建两个项目
        1.1创建一个maven项目(相当于面子:里面引入1.2的依赖)
        1.2用springboot的快速向导创建一个sprinboot的项目(相当于里子)
        目的:maven项目引入1.2的依赖,其他模块引入的是maven项目
        1.1创建的相当于面子,面向于其他依赖,其他引入时,只需要引入1.1的包
        1.2创建的相当于里子,真正干活的,里面包含了所需要的所有业务逻辑和依赖
基本的项目结构如下:

2.在springboot项目中,删除配置文件、启动类,留下以下的目录环境

springboot的基本代码如下(里子的代码):
    1.注册在容器中被上层调用的方法
        //注意点1:该类上没有@service标签,所以该类目前没有被加载到容器中
        public class HelloService {
            @Autowired
            private Person person;
            public String sayHello(){
                return "前缀:"+person.getPrefix()+"   后缀:"+person.getSuffix()+"  person:"+person;
            }
        }
    2.Person类代码,person类属性和配置文件中的属性进行绑定
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @ToString
        //注意点1:使用@ConfigurationProperties标签和配置文件中的wmd.person进行绑定,但是里子代码没有application.properties文件,是在上层引用的配置文件中配置
        //重点2:@ConfigurationProperties只能用在容器组件中,但该类没有@Component标签,暂时还不是容器中的组件,所以需要和@EnableConfigurationProperties标签配合使用
        @ConfigurationProperties(prefix = "wmd.person")
        public class Person {
            private String name;
            private Integer age;
            private String msg;
            //前缀
            private String prefix;
            //后缀
            private String suffix;
        }
    
    3.自定义配置类
        //重点1:@Configuration标签表明当前是springboot配置类
        @Configuration
        //重点2:@EnableConfigurationProperties(Person.class)会向容器中注入Person组件,这时2步骤就不会报错
        @EnableConfigurationProperties(Person.class)
        public class HelloServiceConfig {
            //重点3:当容器中没有HelloService组件时再注入,这样当上层依赖自己创建HelloService对象时,就不会执行下述代码!
            @ConditionalOnMissingBean(HelloService.class)
            @Bean
            public HelloService getPerson(){
                return new HelloService();
            }
        }

    4.重点!!!重点!!!!重点!!!
        整个自定义starter的最重点,由之前的源码得知,springboot启动时只会引入spring-boot-autoconfigure/META-INF/spring.factories中的自动配置项
        不会加载自定义starter中配置的自动配置项,所以需要在里子代码中设置
        在resources文件夹下创建META-INF\spring.factories文件,内容如下
        
            # Auto Configuration Import Filters
            org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
            #重点1:配置里子代码中的自定义配置类位置
            com.cn.wmd.config.HelloServiceConfig

这时,自定义的starter就创建完毕,其中最重要的是:
    上层依赖启动时不会自动加载自定义starter的自动配置类,需要在里子代码中添加META-INF\spring.factories文件,并添加其自定义配置类!
    
测试:
    重新创建一个springboot项目,引入面子依赖
    1.在配置文件中配置
        wmd:
          person:
            age: 18
            name: 吴孟达
            msg: 你好,吴孟达
            prefix: 吴孟达前缀
            suffix: 吴孟达后缀
    2.测试代码:
        @RestController
        public class HelloControler {
            //重点1:引入HelloService组件
            @Autowired
            HelloService helloService;
            @RequestMapping("/hello")
            public String helloControler(){
                return helloService.sayHello();
            }
        }
    3.页面访问http://localhost:8080/hello
        页面输出:前缀:吴孟达前缀 后缀:吴孟达后缀 person:Person(name=吴孟达, age=18, msg=你好,吴孟达, prefix=吴孟达前缀, suffix=吴孟达后缀)

 

posted @ 2022-05-11 22:40  努力的达子  阅读(45)  评论(0编辑  收藏  举报