Spring為IOC容器注入Bean的五種方式詳解
這篇文章主要介紹了Spring為IOC容器注入Bean的五種方式詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
一 @Import導入組件,id默認是組件的全類名
//類中組件統(tǒng)一設置。滿足當前條件,這個類中配置的所有bean注冊才能生效;
@Conditional({WindowsCondition.class})
@Configuration
@Import({Color.class,Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
//@Import導入組件,id默認是組件的全類名
public class MainConfig2 {
//默認是單實例的
/**
* ConfigurableBeanFactory#SCOPE_PROTOTYPE
* @see ConfigurableBeanFactory#SCOPE_SINGLETON
* @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST request
* @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION sesssion
* @return\
* @Scope:調(diào)整作用域
* prototype:多實例的:ioc容器啟動并不會去調(diào)用方法創(chuàng)建對象放在容器中。
* 每次獲取的時候才會調(diào)用方法創(chuàng)建對象;
* singleton:單實例的(默認值):ioc容器啟動會調(diào)用方法創(chuàng)建對象放到ioc容器中。
* 以后每次獲取就是直接從容器(map.get())中拿,
* request:同一次請求創(chuàng)建一個實例
* session:同一個session創(chuàng)建一個實例
*
* 懶加載:
* 單實例bean:默認在容器啟動的時候創(chuàng)建對象;
* 懶加載:容器啟動不創(chuàng)建對象。第一次使用(獲取)Bean創(chuàng)建對象,并初始化;
*
*/
// @Scope("prototype")
@Lazy
@Bean("person")
public Person person(){
System.out.println("給容器中添加Person....");
return new Person("張三", 25);
}
/**
* @Conditional({Condition}) : 按照一定的條件進行判斷,滿足條件給容器中注冊bean
*
* 如果系統(tǒng)是windows,給容器中注冊("bill")
* 如果是linux系統(tǒng),給容器中注冊("linus")
*/
@Bean("bill")
public Person person01(){
return new Person("Bill Gates",62);
}
@Conditional(LinuxCondition.class)
@Bean("linus")
public Person person02(){
return new Person("linus", 48);
}
/**
* 給容器中注冊組件;
* 1)、包掃描+組件標注注解(@Controller/@Service/@Repository/@Component)[自己寫的類]
* 2)、@Bean[導入的第三方包里面的組件]
* 3)、@Import[快速給容器中導入一個組件]
* 1)、@Import(要導入到容器中的組件);容器中就會自動注冊這個組件,id默認是全類名
* 2)、ImportSelector:返回需要導入的組件的全類名數(shù)組;
* 3)、ImportBeanDefinitionRegistrar:手動注冊bean到容器中
* 4)、使用Spring提供的 FactoryBean(工廠Bean);
* 1)、默認獲取到的是工廠bean調(diào)用getObject創(chuàng)建的對象
* 2)、要獲取工廠Bean本身,我們需要給id前面加一個&
* &colorFactoryBean
*/
@Bean
public ColorFactoryBean colorFactoryBean(){
return new ColorFactoryBean();
}
二 實現(xiàn)Condition進行注入
Springboot有大量的@ConditionXXXX注解
public class LinuxCondition implements Condition {
/**
* ConditionContext:判斷條件能使用的上下文(環(huán)境)
* AnnotatedTypeMetadata:注釋信息
*/
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// TODO是否linux系統(tǒng)
//1、能獲取到ioc使用的beanfactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
//2、獲取類加載器
ClassLoader classLoader = context.getClassLoader();
//3、獲取當前環(huán)境信息
Environment environment = context.getEnvironment();
//4、獲取到bean定義的注冊類
BeanDefinitionRegistry registry = context.getRegistry();
String property = environment.getProperty("os.name");
//可以判斷容器中的bean注冊情況,也可以給容器中注冊bean
boolean definition = registry.containsBeanDefinition("person");
if(property.contains("linux")){
return true;
}
return false;
}
}
三 實現(xiàn)ImportSelector
public class MyImportSelector implements ImportSelector {
//返回值,就是到導入到容器中的組件全類名
//AnnotationMetadata:當前標注@Import注解的類的所有注解信息
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// TODO Auto-generated method stub
//importingClassMetadata
//方法不要返回null值
return new String[]{"com.atguigu.bean.Blue","com.atguigu.bean.Yellow"};
}
}
四 實現(xiàn)ImportBeanDefinitionRegistrar
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* AnnotationMetadata:當前類的注解信息
* BeanDefinitionRegistry:BeanDefinition注冊類;
* 把所有需要添加到容器中的bean;調(diào)用
* BeanDefinitionRegistry.registerBeanDefinition手工注冊進來
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean definition = registry.containsBeanDefinition("com.atguigu.bean.Red");
boolean definition2 = registry.containsBeanDefinition("com.atguigu.bean.Blue");
if(definition && definition2){
//指定Bean定義信息;(Bean的類型,Bean。。。)
RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
//注冊一個Bean,指定bean名
registry.registerBeanDefinition("rainBow", beanDefinition);
}
}
}
五 實現(xiàn) FactoryBean
/ /創(chuàng)建一個Spring定義的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {
//返回一個Color對象,這個對象會添加到容器中
@Override
public Color getObject() throws Exception {
// TODO Auto-generated method stub
System.out.println("ColorFactoryBean...getObject...");
return new Color();
}
@Override
public Class<?> getObjectType() {
// TODO Auto-generated method stub
return Color.class;
}
//是單例?
//true:這個bean是單實例,在容器中保存一份
//false:多實例,每次獲取都會創(chuàng)建一個新的bean;
@Override
public boolean isSingleton() {
// TODO Auto-generated method stub
return false;
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)及算法實例:樸素字符匹配 Brute Force
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實例:樸素字符匹配 Brute Force,本文直接給出實例代碼,代碼中包含詳細注釋,需要的朋友可以參考下2015-06-06
Spring boot整合Springfox生成restful的在線api文檔
這篇文章主要為大家介紹了Spring boot整合Springfox生成restful在線api文檔,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03
java String.split 無法使用小數(shù)點分割的問題
這篇文章主要介紹了java String.split 無法使用小數(shù)點分割的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02

