一埃碱、 SpringBoot starter機制
統(tǒng)一管理,統(tǒng)一引入 減少繁瑣配置酥泞,解決版本沖突
二砚殿、 自定義starter
1.開發(fā)中有很多獨立于業(yè)務的配置模塊,重復引用的時候在pom中引用即可使用芝囤。
例如:
- 動態(tài)數(shù)據(jù)源似炎。
- 登錄模塊辛萍。
- 基于AOP技術實現(xiàn)日志切面。
......
2.自定義starter的命名規(guī)則
- SpringBoot提供的starter以spring-boot-starter-xxx 的方式命名的羡藐。
- 官方建議自定義的starter使用xxx-spring-boot-starter 命名規(guī)則贩毕。以區(qū)分SpringBoot生態(tài)提供
的starter
3.實現(xiàn)
3.1 新建maven jar工程,工程名為ldz-spring-boot-starter仆嗦,導入依賴:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
</dependencies>
自動配置的核心依賴
3.2 編寫javaBean實體
@EnableConfigurationProperties(SimpleBean.class)
@ConfigurationProperties(prefix = "simplebean")
public class SimpleBean {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "SimpleBean{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
通用的配置類實體(在調用的工程中配置調用的屬性值)
3.3 編寫配置類MyAutoConfiguration
@Configuration
public class MyAutoConfiguration {
static {
System.out.println("MyAutoConfiguration init....");
}
@Bean
public SimpleBean simpleBean(){
return new SimpleBean();
}
}
實例化通用Javabean的類辉阶,這個類實例化的時候@Bean方法的結果會作為spring的bean放到ioc容器中,交由spring管理.
3.4 resources下創(chuàng)建/META-INF/spring.factories
META-INF是自己手動創(chuàng)建的目錄欧啤,spring.factories也是手動創(chuàng)建的文件,在該文件中配置自
己的自動配置類
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.lagou.config.MyAutoConfiguration
spring啟動的時候會根據(jù)key:org.springframework.boot.autoconfigure.EnableAutoConfiguration加載/META-INF/spring.factories下的value睛藻,然后實例化,并且執(zhí)行@bean方法邢隧,進行配置bean的實例化店印。
4. 使用自定義starter
4.1 導入自定義starter的依賴
<dependency>
<groupId>com.lagou</groupId>
<artifactId>ldz-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
4.2 在全局配置文件中配置屬性值
simplebean.id=1
simplebean.name=自定義starter
4.2 測試
//測試自定義starter
@Autowired
private SimpleBean simpleBean;
@Test
public void zdyStarterTest(){
System.out.println(simpleBean);
}
三、 如果有一天我們不想要啟動工程的時候自動裝配SimpleBean
1. 刪除pom.xml中的依賴 (low)
2. 熱插拔技術
我們經(jīng)常會在啟動類Application上面加@EnableXXX注解倒慧,其實這個@Enablexxx注解就是一種熱拔插技術按摘,加了這個注解就可以啟動對應的starter,當不需要對應的starter的時候只需要把這個注解注釋掉就行纫谅。
2.1 改造ldz工程新增熱插拔支持類
2.1.1 新增標記類ConfigMarker
public class ConfigMarker {
}
2.1.2 新增EnableRegisterServer注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({ConfigMarker.class})
public @interface EnableRegisterServer {
}
2.1.3 改造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();
}
}
2.1.4 改造調用工程
在啟動類上新增@EnableImRegisterServer注解
當加了@EnableImRegisterServer 的時候啟動zdy工程就會自動裝配SimpleBean,反之則不裝配询吴。
2.1.4 原理
當加了@EnableImRegisterServer 注解的時候掠河,由于這個注解使用了@Import({ConfigMarker.class}) ,所以會導致Spring去加載ConfigMarker 到上下文中猛计,而又因為條件注@ConditionalOnBean(ConfigMarker.class) 的存在唠摹,所以MyAutoConfiguration 類就會被實例化。
3 關于條件注解的講解
- @ConditionalOnBean:僅僅在當前上下文中存在某個對象時奉瘤,才會實例化一個Bean勾拉。
- @ConditionalOnClass:某個class位于類路徑上,才會實例化一個Bean盗温。
- @ConditionalOnExpression:當表達式為true的時候藕赞,才會實例化一個Bean÷艟郑基于SpEL表
達式的條件判斷斧蜕。 - @ConditionalOnMissingBean:僅僅在當前上下文中不存在某個對象時,才會實例化一個
Bean吼驶。 - @ConditionalOnMissingClass:某個class類路徑上不存在的時候惩激,才會實例化一個Bean。
- @ConditionalOnNotWebApplication:不是web應用蟹演,才會實例化一個Bean风钻。
- @ConditionalOnWebApplication:當項目是一個Web項目時進行實例化。
- @ConditionalOnProperty:當指定的屬性有指定的值時進行實例化酒请。
- @ConditionalOnJava:當JVM版本為指定的版本范圍時觸發(fā)實例化骡技。
- @ConditionalOnResource:當類路徑下有指定的資源時觸發(fā)實例化。
- @ConditionalOnJndi:在JNDI存在的條件下觸發(fā)實例化羞反。
- @ConditionalOnSingleCandidate:當指定的Bean在容器中只有一個布朦,或者有多個但是指定
了首選的Bean時觸發(fā)實例化。