自定義Starter
如果Spring Boot自帶的入口類不能滿足要求,則可以自定義Starter,自定義Starter的步驟 如下,
1.引入必要的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2.自定義Properties類
在使用Spring官方的Starter時,可以在application.properties檔案中配置引數,以覆寫默認值,在自定義Starter時,也可以根據需要來配置Properties類,以保存配置資訊,見以下代碼:
package com.itheima.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "spring.mystarter")
public class MyStarterProperties {
private String parameter;
public String getParameter() {
return parameter;
}
public void setParameter(String parameter) {
this.parameter = parameter;
}
}
3.定義核心服務類
每個Starter都需要有自己的功能,所以需要定義服務類,如:
package com.itheima.properties;
public class MyStarter {
private MyStarterProperties myProperties;
public MyStarter() {
}
public MyStarter(MyStarterProperties myProperties) {
this.myProperties = myProperties;
}
public String print(){
System.out.println("引數:"+myProperties.getParameter());
String result = myProperties.getParameter();
return result;
}
}
4.定義自動配置類
每個Starter —般至少有一個自動配置類,命名規則為“名字+AutoConfiguration”,如MyStarterServiceAutoConfiguration, 配置方法見以下代碼:
package com.itheima.properties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(MyStarterProperties.class)
@ConditionalOnClass(MyStarter.class)
@ConditionalOnProperty(prefix = "spring.mystarter",value = "https://www.cnblogs.com/liwenruo/p/enabled",matchIfMissing = true)
public class MyStartServiceConfiguration {
@Autowired
private MyStarterProperties myStarterProperties = new MyStarterProperties();
@Bean
@ConditionalOnMissingBean(MyStarter.class)
public MyStarter myStarterService(){
MyStarter myStarter = new MyStarter(myStarterProperties);
return myStarter;
}
}
最后,在resources檔案夾下新建目錄META-INF,在目錄中新建spring.factories檔案, 并且在spring.factories中配置AutoConfiguration,加入以下代碼:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.itheima.properties.MyStartServiceConfiguration
注解詳解:
??使用
??ConfigurationProperties:
??外部化配置的注釋,如果您想系結和驗證一些外部屬性(例如,來自 .properties 檔案),請將其添加到類定義或@Configuration類中的@Bean方法中,系結可以通過在帶注釋的類上呼叫 setter 來執行,或者,如果正在使用@ConstructorBinding ,則通過系結到建構式引數來執行,請注意,與@Value相反,SpEL 運算式不會被評估,因為屬性值是外部化的,
??原始碼解釋:
表示一個類宣告了一個或多個@Bean方法,并且可以被 Spring 容器處理以在運行時為這些 bean 生成 bean 定義和服務請求,例如:
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
// instantiate, configure and return bean ...
}
}
引導@Configuration類
通過AnnotationConfigApplicationContext
@Configuration類通常使用AnnotationConfigApplicationContext或其支持 Web 的變體AnnotationConfigWebApplicationContext進行引導,前者的簡單示例如下:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AppConfig.class);
ctx.refresh();
MyBean myBean = ctx.getBean(MyBean.class);
// use myBean ...
有關詳細資訊,請參閱AnnotationConfigApplicationContext javadocs,有關Servlet容器中的 Web 配置說明,請參閱AnnotationConfigWebApplicationContext ,
通過 Spring <beans> XML
作為直接針對AnnotationConfigApplicationContext注冊@Configuration類的替代方法, @Configuration類可以在 Spring XML 檔案中宣告為普通的<bean>定義:
<beans>
<context:annotation-config/>
<bean />
</beans>
在上面的示例中,需要<context:annotation-config/>以啟用ConfigurationClassPostProcessor和其他有助于處理@Configuration類的注釋相關的后處理器,
通過組件掃描
@Configuration使用@Component進行元注釋,因此@Configuration類是組件掃描的候選物件(通常使用 Spring XML 的<context:component-scan/>元素),因此也可以像任何常規@Component一樣利用@Autowired / @Inject @Component ,特別是,如果存在單個建構式,則自動裝配語意將透明地應用于該建構式:
@Configuration
public class AppConfig {
private final SomeBean someBean;
public AppConfig(SomeBean someBean) {
this.someBean = someBean;
}
// @Bean definition using "SomeBean"
}
@Configuration類不僅可以使用組件掃描進行引導,還可以使用@ComponentScan注解配置組件掃描:
@Configuration
@ComponentScan("com.acme.app.services")
public class AppConfig {
// various @Bean definitions ...
}
有關詳細資訊,請參閱@ComponentScan javadocs,
使用外化值
使用Environment API
可以通過將 Spring org.springframework.core.env.Environment注入@Configuration類來查找外部化的值——例如,使用@Autowired注釋:
@Configuration
public class AppConfig {
@Autowired Environment env;
@Bean
public MyBean myBean() {
MyBean myBean = new MyBean();
myBean.setName(env.getProperty("bean.name"));
return myBean;
}
}
通過Environment決議的屬性駐留在一個或多個“屬性源”物件中, @Configuration類可以使用@PropertySource注釋將屬性源貢獻給Environment物件:
@Configuration
@PropertySource("classpath:/com/acme/app.properties")
public class AppConfig {
@Inject Environment env;
@Bean
public MyBean myBean() {
return new MyBean(env.getProperty("bean.name"));
}
}
有關更多詳細資訊,請參閱Environment和@PropertySource javadocs,
使用@Value注釋
可以使用@Value注釋將外部化的值注入到@Configuration類中:
@Configuration
@PropertySource("classpath:/com/acme/app.properties")
public class AppConfig {
@Value("${bean.name}") String beanName;
@Bean
public MyBean myBean() {
return new MyBean(beanName);
}
}
這種方法通常與 Spring 的PropertySourcesPlaceholderConfigurer結合使用,可以通過<context:property-placeholder/>在 XML 配置中自動啟用,或者通過專用的static @Bean方法在@Configuration類中顯式啟用(參見“關于 BeanFactoryPostProcessor-returning @Bean方法”的@Bean的 javadocs 的詳細資訊),但是請注意,通常僅當您需要自定義配置(例如占位符語法等)時才需要通過static @Bean方法顯式注冊PropertySourcesPlaceholderConfigurer ,特別是,如果沒有 bean 后處理器(例如PropertySourcesPlaceholderConfigurer )已注冊作為ApplicationContext的嵌入式值決議器,Spring 將注冊一個默認的嵌入式值決議器,它根據在Environment中注冊的屬性源決議占位符,請參閱下面有關使用@ImportResource使用 Spring XML 組合@Configuration類的部分;參見@Value javadocs;有關使用BeanFactoryPostProcessor型別(例如PropertySourcesPlaceholderConfigurer )的詳細資訊,請參閱@Bean javadocs,
組合@Configuration類
使用@Import注釋
@Configuration類可以使用@Import注解組成,類似于<import>在 Spring XML 中的作業方式,因為@Configuration物件在容器中作為 Spring bean 進行管理,所以可以注入匯入的配置——例如,通過建構式注入:
@Configuration
public class DatabaseConfig {
@Bean
public DataSource dataSource() {
// instantiate, configure and return DataSource
}
}
@Configuration
@Import(DatabaseConfig.class)
public class AppConfig {
private final DatabaseConfig dataConfig;
public AppConfig(DatabaseConfig dataConfig) {
this.dataConfig = dataConfig;
}
@Bean
public MyBean myBean() {
// reference the dataSource() bean method
return new MyBean(dataConfig.dataSource());
}
}
現在AppConfig和匯入的DatabaseConfig都可以通過僅針對 Spring 背景關系注冊AppConfig來引導:
new AnnotationConfigApplicationContext(AppConfig.class);
使用@Profile注釋
@Configuration類可以用@Profile注釋標記,以表明只有在給定的組態檔或組態檔處于活動狀態時才應處理它們:
@Profile("development")
@Configuration
public class EmbeddedDatabaseConfig {
@Bean
public DataSource dataSource() {
// instantiate, configure and return embedded DataSource
}
}
@Profile("production")
@Configuration
public class ProductionDatabaseConfig {
@Bean
public DataSource dataSource() {
// instantiate, configure and return production DataSource
}
}
或者,您也可以在@Bean方法級別宣告組態檔條件 - 例如,對于同一配置類中的替代 bean 變體:
@Configuration
public class ProfileDatabaseConfig {
@Bean("dataSource")
@Profile("development")
public DataSource embeddedDatabase() { ... }
@Bean("dataSource")
@Profile("production")
public DataSource productionDatabase() { ... }
}
有關更多詳細資訊,請參閱@Profile和org.springframework.core.env.Environment javadocs,
使用@ImportResource注解的 Spring XML
如上所述, @Configuration類可以在 Spring XML 檔案中宣告為常規 Spring <bean>定義,也可以使用@ImportResource注釋將 Spring XML 組態檔匯入@Configuration類,可以注入從 XML 匯入的 Bean 定義——例如,使用@Inject注解:
@Configuration
@ImportResource("classpath:/com/acme/database-config.xml")
public class AppConfig {
@Inject DataSource dataSource; // from XML
@Bean
public MyBean myBean() {
// inject the XML-defined dataSource bean
return new MyBean(this.dataSource);
}
}
使用嵌套@Configuration類
@Configuration類可以相互嵌套,如下所示:
@Configuration
public class AppConfig {
@Inject DataSource dataSource;
@Bean
public MyBean myBean() {
return new MyBean(dataSource);
}
@Configuration
static class DatabaseConfig {
@Bean
DataSource dataSource() {
return new EmbeddedDatabaseBuilder().build();
}
}
}
當引導這樣的安排時,只需要針對應用程式背景關系注冊AppConfig ,由于是嵌套的@Configuration類, DatabaseConfig將自動注冊,當AppConfig和DatabaseConfig之間的關系已經隱式明確時,這避免了使用@Import注釋的需要,
還要注意,嵌套的@Configuration類可以與@Profile注釋一起使用,從而為封閉的@Configuration類提供同一個bean 的兩個選項,
配置延遲初始化
默認情況下, @Bean方法將在容器引導時急切地實體化,為了避免這種情況,@ @Lazy @Configuration一起使用,以指示在類中宣告的所有@Bean方法默認情況下都是惰性初始化的,請注意, @Lazy也可以用于單個@Bean方法,
測驗對@Configuration類的支持
spring-test模塊中可用的 Spring TestContext 框架提供了@ContextConfiguration注解,它可以接受一組組件類參考——通常是@Configuration或@Component類,
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {AppConfig.class, DatabaseConfig.class})
public class MyTests {
@Autowired MyBean myBean;
@Autowired DataSource dataSource;
@Test
public void test() {
// assertions against myBean ...
}
}
有關詳細資訊,請參閱TestContext 框架 參考檔案,
使用@Enable注解啟用內置 Spring 功能
Spring 特性,如異步方法執行、計劃任務執行、注釋驅動的事務管理,甚至 Spring MVC 都可以使用它們各自的“ @Enable ”注釋從@Configuration類中啟用和配置,有關詳細資訊,請參閱@EnableAsync 、 @EnableScheduling 、 @EnableTransactionManagement 、 @EnableAspectJAutoProxy和@EnableWebMvc ,
創作@Configuration類時的約束
配置類必須作為類提供(即不是作為從工廠方法回傳的實體),允許通過生成的子類進行運行時增強,
配置類必須是非最終的(允許在運行時使用子類),除非proxyBeanMethods標志設定為false ,在這種情況下不需要運行時生成的子類,
配置類必須是非本地的(即不能在方法中宣告),
任何嵌套的配置類都必須宣告為static ,
@Bean方法可能不會反過來創建進一步的配置類(任何此類實體都將被視為常規 bean,它們的配置注釋仍然未被檢測到),
??EnableConfigurationProperties:
??啟用對@ConfigurationProperties注釋 bean 的支持, @ConfigurationProperties bean 可以以標準方式注冊(例如使用@Bean方法),或者為了方便起見,可以直接在此注釋上指定,
??ConditionalOnClass:
??@Conditional僅在指定的類在類路徑上時匹配,可以在@Configuration類上安全地指定value() ,因為在加載類之前使用 ASM 決議注釋元資料,放置在@Bean方法上時需要格外小心,考慮將條件隔離在單獨的Configuration類中,特別是如果方法的回傳型別與target of the condition匹配,
??ConditionalOnProperty:
??@Conditional檢查指定屬性是否具有特定值,默認情況下,屬性必須存在于Environment中并且不等于false , havingValue()和matchIfMissing()屬性允許進一步自定義,
havingValue屬性可用于指定屬性應具有的值,
5.打包發布
在完成上面的配置后,打包生成JAR檔案,然后就可以像使用官方Starter那樣使用了,如果不發布到Maven中心倉庫,則需要用戶手動添加依賴,
6.創建用于測驗Starter的專案
在創建新頊目后,如果要添加自定義的Starter依賴,則不能用添加官Starter的方法,因為 此時還未將Starter發布到Maven中心倉庫,只能通過開發工具匯入此依賴JAR檔案(在IDEA 中,通過單擊選單欄的 FILE—>ProjectStructure—>Modules—>Dependencies,然后單擊+號,選擇 JARs or directories......選項添加依賴),然后,配置 application.properties檔案,加入以下引數:
spring.mystarter.parameter=buretuzi
7.使用starter
在需要使用的地方注入依賴即可,具體使用見以下代碼:@Autowiredprivate MyStarter myStarterService;@Testpublic void hello(){ System.out.println(myStarterService.print());}
正規的Starter是一個獨立的工程,可以在Maven中的新倉庫注冊發布,以便幵發人員使用,
自定義Starter包括以下幾個方面的內容,
- 自動組態檔:根據classpath是否存在指定的類來決定是否要執行該功能的自動配置,
- factories:指導Spring Boot找到指定的自動組態檔,
- endpoint:包含對服務的描述、界面、互動(業務資訊的查詢),
- health indicator:該Starter提供的服務的健康指標,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/499558.html
標籤:Java
