注:上節(jié)我們利用@Bean或者其他注解往Spring容器中添加一個Bean取胎,下面我們看一下向Spring容器中添加Bean的幾種方式。
@Bean
@Bean
public User user(){
return new User();
}
通過@Bean注解可往容器中添加Bean組件局劲,默認方法名為bean的Id,如果要特殊指定其名稱,可以使用@Bean("user"),詳細參考上一節(jié)
包掃描+@Component與其延伸注解
其實在項目中多用包掃描的方式屯仗,向容器中添加組件,可以在主配置類上搔谴,@Configuration和@ComponentScan魁袜,@ComponentScan默認掃描當前類所在的包,所以在Spring Boot程序中敦第,一般主程序類會建立在項目的根包中峰弹,然后利用@SpringBootApplication標注,@SpringBootApplication是一個組合注解包括@SpringBootConfiguration@EnableAutoConfiguration芜果、@ComponentScan三個注解鞠呈,其中就包含@ComponentScan注解,@ComponentScan還有其他屬性右钾,詳細查看上一小節(jié)蚁吝。
@Conditional
@Conditional注解是根據(jù)條件往容器中注冊Bean,它可以注冊在方法和類上旱爆,在SpringBoot自動配置中,廣泛利用@Conditional注解和它的延伸注解窘茁,往Spring容器中進行動態(tài)注冊怀伦。@ConditionalOnClass如果有這個類才注冊,@ConditionalOnMissingBean如果沒有這個Bean組件才注冊等等山林。
@Import
1) @Import
在容器中導入組件還可以通過@Import導入組建房待,例如:
@Configuration
@ComponentScan
@Import(User.class)
public class MainConfig {
}
如果使用@Import導入組件,導入的組件ID為其全類名捌朴。
2) ImportSelector
@Import組件的value如果是實現(xiàn)了ImportSelector接口吴攒,可以通過該類批量導入組件,該類的selectImports方法的返回值砂蔽,將會被注冊到Spring容器中洼怔,但該類本身并不會被導入到組件中。
3) ImportBeanDefinitionRegistrar
通過實現(xiàn)該類往容器中注冊一個Bean,例如
public class CustomImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
boolean b1 = beanDefinitionRegistry.containsBeanDefinition("mother");
boolean b2 = beanDefinitionRegistry.containsBeanDefinition("father");
if(b1&&b2){
//獲取bean的定義信息
RootBeanDefinition beanDefinition = new RootBeanDefinition(Child.class);
beanDefinitionRegistry.registerBeanDefinition("child",beanDefinition);
}
}
}
實現(xiàn)FactoryBean
public class UserFactoryBean implements FactoryBean<User>{
//通過getObject()方法創(chuàng)建對象左驾,如果是非單例镣隶,則在每次獲取時執(zhí)行該方法
@Nullable
@Override
public User getObject() throws Exception {
return new User();
}
//類型
@Nullable
@Override
public Class<?> getObjectType() {
return User.class;
}
//是否單例
@Override
public boolean isSingleton() {
return true;
}
}
該方式默認獲取到的工廠Bean調(diào)用getObject創(chuàng)建的對象;
如果獲取工廠Bean本身需要在ID前加&標識诡右,例如&userFactoryBean 安岂。
小結(jié):
本節(jié)課主要學習了如何往Spring容器中注冊Bean的4中方式,
1帆吻、通過@Bean
2域那、通過包掃描+@Component及其延伸組建
3、通過@Import(ImportSelector猜煮、ImportBeanDefinitionRegistrar)
4次员、通過實現(xiàn)工廠Bean(FactoryBean)
下節(jié)課我們學習Bean的生命周期相關的內(nèi)容。