@Bean和@Import注解都将对象添加到容器。
@Bean标在方法上,方法执行结束把返回结果添加到容器
@Configuration// public class MainConfig { @Bean //标在方法上,返回的对象会被添加到容器。 public Person person(){ Person person = new Person(); person.setName("TomasByConfiguration"); return person; } }
@Import可以引入打包好的第三方jar包;也可以批量导入逻辑组件
有三种引入方式
1.直接写Class :Person{name='null'} 利用无参构造器创造对象放在容器中,因为只说了要这个类的对象,没有赋值信息,所以直接调用无参构造器构造出来的
2.导入实现ImportSelector接口的自定义类:导入选择器,是一个接口,要实现接口中只有一个selectImports方法,返回一个String[ ] 数组,这个数组可以为空数组,但是不能是null
3.导入实现ImportBeanDefinitionRegistrar接口的自定义类 :导入自定义的Bean 定义注册类,接口中有一个空方法registerBeanDefinitions(当前类注解信息,BeanDefinition注册类),
可以调用第二个参数 BeanDefinitionRegistry.registerBeanDefinition手动注册。
把上边的配置类修改成
@Configuration//
@Import({Person.class,MyImportSelector.class,MyBeanDefinitionRegistrar.class}) public class MainConfig { /*将@Bean的person方法去掉,用@import导入*/ }
static class MyImportSelector implements ImportSelector{
selectImports(){
return String [] {"组件"}
}
}
static class MyImportRegistrar implements ImportBeanDefinitionRegistrar{
/**
*
* @param importingClassMetadata annotation metadata of the importing class
*
* @param registry bean定义注册中心:图纸中心;里边都是Bean定义信息:BeanDefinition
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
//
RootBeanDefinition catDefinition = new RootBeanDefinition();
//指定类的类型
catDefinition.setBeanClass(Cat.class);
//可以声名定义信息,包括需要自动装配什么
//注册一个bean信息,name+BeanDefinition;类型和名字
registry.registerBeanDefinition("TomasCat",catDefinition);
//此时就将Bean的创建步骤,可以被@import注解导进去
}
}