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=吴孟达后缀)