3. 自定义Starter

3.1 创建自定义starter

  1. 新建maven工程
  2. 编写JavaBean
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "simplebean")
public class SimpleBean {
private String name;
private Integer id;

public String getName() {
return name;
}

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

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

@Override
public String toString() {
return "SimpleBean{" +
"name='" + name + '\'' +
", id=" + id +
'}';
}
}
  1. 编写配置类
@Configuration
public class MyAutoConfiguration {

@Bean
public SimpleBean simpleBean(){
return new SimpleBean();
}
}
  1. resources下创建/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.elvis.config.MyAutoConfiguration

3.2 使用自定starter

  1. pom文件导入依赖
<dependency>
<groupId>com.lagou</groupId>
<artifactId>zdy-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
  1. 配置文件新增属性
simplebean:
id: 1
name: zdy-starter
  1. 编写测试类
//测试自定义starter
@Autowired
private SimpleBean simpleBean;
@Test
public void zdyStarterTest(){
System.out.println(simpleBean);
}

但此处还有一个问题,如果有一天我们不想要启动工程的时候自动装配SimpleBean呢?可能有的同学会想,那简单啊,我们去pom中把依赖注释掉,的确,这是一种方案,但未免有点Low。

3.3 热插拔

还记得我们经常会在启动类Application上面加@EnableXXX注解吗?

其实这个@Enablexxx注解就是一种热拔插技术,加了这个注解就可以启动对应的starter,当不需要对应的starter的时候只需要把这个注解注释掉就行,是不是很优雅呢?

那么这是如何实现的呢?

**改造zdy工程新增热插拔支持类 **

  1. 新增标记类ConfigMarker
public class ConfigMarker {
}
  1. 新增EnableRegisterServer注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({ConfigMarker.class})
public @interface EnableRegisterServer {
}

改造MyAutoConfiguration 新增条件注解@ConditionalOnBean(ConfigMarker.class) ,@ConditionalOnBean 这个是条件注解,前面的意思代表只有当期上下文中含有ConfigMarker对象,被标注的类才会被实例化。

@Configuration
@ConditionalOnBean(ConfigMarker.class)
public class MyAutoConfiguration {
static {
System.out.println("MyAutoConfiguration init....");
}
@Bean
public SimpleBean simpleBean(){
return new SimpleBean();
}
}

**改造service工程 **

在启动类上新增@EnableImRegisterServer注解

到此热插拔就实现好了,当你加了@EnableImRegisterServer 的时候启动zdy工程就会自动装配 SimpleBean,反之则不装配。 原理也很简单,当加了@EnableImRegisterServer 注解的时候,由于这个注解使用了@Import({ConfigMarker.class}) ,所以会导致Spring去加载ConfigMarker 到上下文中,而又因为条件注解@ConditionalOnBean(ConfigMarker.class) 的存在,所以 MyAutoConfiguration 类就会被实例化。