//配置類==配置文件 @Configuration //告訴Spring這是一個配置類 public class MainConfig { //給容器中註冊一個Bean;類型爲返回值的類型,id默認是用方法名做爲id @Bean("person") public Person person01(){ return new Person("lisi", 20); } }
這個就是相似在xml文件中添加的掃描的註解linux
@ComponentScan("com.lemon.bean") @Configuration public class MainConfig { }
@Component 將當前類聲明爲IOC容器中的一個普通的組件(除了下面三種外的組件)
@Controller 將當前類聲明爲IOC容器中的一個控制器組件
@Service 將當前類聲明爲IOC容器中的業務邏輯層組件
@Repository 將當前類聲明爲IOC容器中的一個持久化層組件spring
@ComponentScan指定的包路徑下標註了以上註解的組件都會添加到IOC容器中數組
Conditional註解在springBoot底層中大量用到的註解,很是的重要,瞭解這個註解對理解SpringBoot自動裝配原理會更深,下面是實現一個若是操做系統時Linux時就添加person實例到容器app
@Configuration //告訴Spring這是一個配置類 public class MainConfig { @Conditional(LinuxCondition.class) @Bean("linus") public Person person02(){ return new Person("linus", 48); } }
public class LinuxCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); ClassLoader classLoader = context.getClassLoader(); Environment environment = context.getEnvironment(); BeanDefinitionRegistry registry = context.getRegistry(); String property = environment.getProperty("os.name"); boolean definition = registry.containsBeanDefinition("person"); if(property.contains("linux")){ return true; } return false; } }
@Import快速給容器添加組件有三種方式 ide
@Import({Color.class,Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class}) public class MainConfig2 { }
1)、@Import(要導入到容器中的組件);容器中就會自動註冊這個組件,id默認是全類名spa
如上直接添加Color.class,Red.class操作系統
2)、實現ImportSelector:返回須要導入的組件的全類名數組.net
public class MyImportSelector implements ImportSelector { //返回值,就是到導入到容器中的組件全類名 //AnnotationMetadata:當前標註@Import註解的類的全部註解信息 @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { // TODO Auto-generated method stub //importingClassMetadata //方法不要返回null值 return new String[]{"com.lemon.bean.Blue","com.lemon.bean.Yellow"}; } }
方法不能返回null 不然會報空指針異常錯誤指針
3)、實現ImportBeanDefinitionRegistrar接口:手動註冊bean到容器中xml
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { /** * AnnotationMetadata:當前類的註解信息 * BeanDefinitionRegistry:BeanDefinition註冊類; * 把全部須要添加到容器中的bean;調用 * BeanDefinitionRegistry.registerBeanDefinition手工註冊進來 */ @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { boolean definition = registry.containsBeanDefinition("com.lemon.bean.Red"); boolean definition2 = registry.containsBeanDefinition("com.lemon.bean.Blue"); if(definition && definition2){ //指定Bean定義信息;(Bean的類型,Bean。。。) RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class); //註冊一個Bean,指定bean名 registry.registerBeanDefinition("rainBow", beanDefinition); } } }
//建立一個Spring定義的FactoryBean public class ColorFactoryBean implements FactoryBean<Color> { //返回一個Color對象,這個對象會添加到容器中 public Color getObject() throws Exception { // TODO Auto-generated method stub System.out.println("ColorFactoryBean...getObject..."); return new Color(); } // 返回組件類型 public Class<?> getObjectType() { // TODO Auto-generated method stub return Color.class; } //是單例? //true:這個bean是單實例,在容器中保存一份 //false:多實例,每次獲取都會建立一個新的bean; public boolean isSingleton() { // TODO Auto-generated method stub return true; } }
注意:1)、默認獲取到的是工廠bean調用getObject建立的對象
2)、要獲取工廠Bean自己,咱們須要給id前面加一個&, 好比: &colorFactoryBean
//工廠Bean獲取的是調用getObject建立的對象 Object bean2 = applicationContext.getBean("colorFactoryBean"); Object bean3 = applicationContext.getBean("colorFactoryBean"); System.out.println("bean的類型:"+bean2.getClass()); System.out.println(bean2 == bean3); Object bean4 = applicationContext.getBean("&colorFactoryBean"); System.out.println(bean4.getClass());