大家都知道我们给容器中定义组件有个方式,
@Bean,容器来添加作为Bean
还有包扫描注解,比如@Conrtroller,@Service,@Respiratory,@Component
还有一种就是@Import【快速给容器添加一个组件】
把Bean就是导在容器中,调用无参构造器,创建一个对象
1.1第一种方法定义Bean组件
package com.Config; import com.Bean.Person; import com.Conditional.Linux; import com.Conditional.windows; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Scope; public class MainConfig { @Bean("bill") public Person person1(){ return new Person("Bill",60); } @Bean("Lin") public Person person2(){ return new Person("Lin",48); } }
1.2创建测试类
import com.Bean.Person; import com.Config.MainConfig; import com.Config.config; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.core.env.ConfigurableEnvironment; public class TestP { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class); @Test public void testImport() { printBean(applicationContext); } private void printBean(AnnotationConfigApplicationContext annotationConfigApplicationContext) { String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames(); for (String name : beanDefinitionNames) { System.out.println(name); } }}
1.3运行后
利用Bean添加组件
二 利用Import添加组件
2.1 创建一个Color类
package com.Bean; public class Color { }
2.2 在MainConfig中添加@Import注解
package com.Config; import com.Bean.Color; import com.Bean.Person; import com.Conditional.Linux; import com.Conditional.windows; import org.springframework.context.annotation.*; @Import(Color.class) public class MainConfig { @Bean("bill") public Person person1(){ return new Person("Bill",60); } @Bean("Lin") public Person person2(){ return new Person("Lin",48); } }
2.3 测试运行
运行后我们发现Color也被添加到IOC里来
三.关于Import有三种方法添加组件,一种就是我们刚刚看到的添加@Import注解,在里面直接添加类。
还有就是添加ImportSelect:返回需要导入组件的全类名
3.1新建一个类MyImportSelect实现ImportSelector接口,在实现其方法
package com.Conditional; import com.Bean.Blue; import org.springframework.context.annotation.ImportSelector; import org.springframework.core.type.AnnotationMetadata; public class MyImportSelect implements ImportSelector { //AnnotationMetadata:只能获取到@Import注释类的信息 @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { return new String[]{"com.Bean.Blue"}; } }
3.2 新建一个Blue类
package com.Bean; public class Blue { }
3.3在Config中@Import里添加MyImportSelect类
package com.Config; import com.Bean.Color; import com.Bean.Person; import com.Conditional.Linux; import com.Conditional.MyImportSelect; import com.Conditional.windows; import org.springframework.context.annotation.*; @Conditional({windows.class}) @Import({Color.class, MyImportSelect.class}) public class MainConfig { @Bean("bill") public Person person1(){ return new Person("Bill",60); } @Bean("Lin") public Person person2(){ return new Person("Lin",48); } }
3.4 运行后
发现我们利用这种自定义组件也加载进来了
三.利用ImportBeanDefinitionRegistrar加载Bean
3.1 创建Rainbow类
package com.Bean; public class Rainbow { }
3.2新建一个MyImportBeanDefinitionRegistrar实现ImportBeanDefinitionRegistrar接口,并实现其方法
package com.Conditional; import com.Bean.Rainbow; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.type.AnnotationMetadata; public class MyImportBeanDefinitionRegistar implements ImportBeanDefinitionRegistrar { //AnnotationMetadata:当前类的注解信息 //BeanDefinitionRegistry:注册类信息 可以吧所有需要添加到容器中的bean,调用BeanDefinitionRegistry.registerBean手工注册进来 @Override public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { boolean blue = beanDefinitionRegistry.containsBeanDefinition("com.Bean.Blue"); //判断Bean容器中是否有包含Blue的bean,如果有Blue这个bean在添加rainbow if(blue){ //bean名自定义类名 RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Rainbow.class); beanDefinitionRegistry.registerBeanDefinition("rainbow",rootBeanDefinition); } } }
3.3在@Import注解中添加MyportBeanDefinitionRegistrar
package com.Config; import com.Bean.Color; import com.Bean.Person; import com.Conditional.Linux; import com.Conditional.MyImportBeanDefinitionRegistar; import com.Conditional.MyImportSelect; import com.Conditional.windows; import org.springframework.context.annotation.*; @Conditional({windows.class}) @Import({Color.class, MyImportSelect.class, MyImportBeanDefinitionRegistar.class}) //ImportBeanDefinitionRegistar: public class MainConfig { @Bean("bill") public Person person1(){ return new Person("Bill",60); } @Bean("Lin") public Person person2(){ return new Person("Lin",48); } }