配置類
/**
- 給容器註冊組件:
- 1)包掃描+組件標註註解(@Controller,@Service,@Component,@Repository)[侷限:自己寫的]
- 2)@Bean [導入的第三方包裏面的組件]
- 3)@Import[快速的給容器中導入組件]
- 1)@Import(要導入到容器中的組件),容器中就會自動註冊這個組件,id默認是全類名
- 2)@ImportSelecor:返回需要導入的組件的全類名的數組
- 3)ImportBeanDefinitionRegistrar:手動註冊bean到容器中
- 4)Spring提供的FactoryBean(工廠Bean)
-
1)默認獲取的是工廠Bean調用getObejct()創建的對象
-
2)要想獲取工廠類型的Bean,我們需要再beanId前面添加一個&符號
*/
package com.ysy.config;
import com.ysy.bean.Color;
import com.ysy.bean.ColorFactoryBean;
import com.ysy.bean.Red;
import com.ysy.Person;
import com.ysy.condition.LinuxCondition;
import com.ysy.condition.MacCondition;
import com.ysy.condition.MyImportBeanDefinitionRegistrar;
import com.ysy.condition.MyImportSelector;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.*;
/**
* @author shanyangyang
* @date 2020/5/27
*/
@Configuration
//導入組件,id默認是全類名
@Import({Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {
/**
* 默認是單例的
* @see ConfigurableBeanFactory#SCOPE_PROTOTYPE
* @see ConfigurableBeanFactory#SCOPE_SINGLETON
* 單實例情況下,ioc容器啓動會調用方法創建對象放到IOC容器中,以後每次調用從容器中(map.get)拿;
* request:同一個請求
* session:同一個session
*
* 懶加載:
* 單實例bean,容器啓動時,先不創建對象,第一次使用的時候再創建對象,並進行初始化
*/
// @Scope("prototype")
@Lazy
@Bean("person")
public Person person(){
System.out.println("給容器添加bean");
return new Person("zhangsan",21);
}
/**@Conditional
* 按照一定條件進行判斷,滿足條件註冊Bean
*如果是windows系統則註冊ali,否則註冊百度;
* 可以放在類上,表示condition爲true時,配置類中所有bean一起生效
*/
@Conditional({MacCondition.class})
@Bean("ali")
public Person person01(){
return new Person("alibaba",12);
}
@Conditional({LinuxCondition.class})
@Bean("baidui")
public Person person02(){
return new Person("baidu",24);
}
/**
* 給容器註冊組件:
* 1)包掃描+組件標註註解(@Controller,@Service,@Component,@Repository)[侷限:自己寫的]
* 2)@Bean [導入的第三方包裏面的組件]
* 3)@Import[快速的給容器中導入組件]
* 1)@Import(要導入到容器中的組件),容器中就會自動註冊這個組件,id默認是全類名
* 2)@ImportSelecor:返回需要導入的組件的全類名的數組
* 3)ImportBeanDefinitionRegistrar:手動註冊bean到容器中
* 4)Spring提供的FactoryBean(工廠Bean)
* 1)默認獲取的是工廠Bean調用getObejct()創建的對象
* 2)要想獲取工廠類型的Bean,我們需要再beanId前面添加一個&符號
*/
@Bean
public ColorFactoryBean colorFactoryBean(){
return new ColorFactoryBean();
}
}
其中的實體類
package com.ysy.bean;
/**
* @author shanyangyang
* @date 2020/5/29
*/
public class Color {
}
package com.ysy.condition;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
/**
* @author shanyangyang
* @date 2020/5/29
* 自定義邏輯,返回需要導入的組件
*/
public class
MyImportSelector implements ImportSelector {
//返回值就是導入到容器中的組件全類名
//AnnotationMetadata:當前標註@Import註解的類的所有註解信息
//方法不要返回null
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.ysy.Bean.Blue","com.ysy.Bean.Yellow"};
}
}
package com.ysy.condition;
import com.ysy.bean.RainBow;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
/**
* @author shanyangyang
* @date 2020/5/29
*/
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
*AnnotationMetadata:當前類的註解信息
* BeanDefinitionRegistry:BeanDefinition註冊類
* 把所有需要添加到容器中的bean,調用BeanDefinitionRegistry.registerBeanDefinition手工註冊
* */
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,
BeanNameGenerator importBeanNameGenerator) {
boolean definition = registry.containsBeanDefinition("com.ysy.Bean.Red");
boolean definition1 = registry.containsBeanDefinition("com.ysy.Bean.Blue");
if(definition && definition1){
//指定Bean定義信息,(bean的類型等等)
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);
//註冊一個Bean,指定Bean名字
registry.registerBeanDefinition("rainBowl",rootBeanDefinition);
}
}
}