2022 Spring梳理 2 @Bean与@Import的用法

@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.classMyBeanDefinitionRegistrar.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注解导进去

}
}
 

 

上一篇:Spring学习


下一篇:Spring AOP 源码刨析