【Spring】IOC容器注册Bean的方法

一、@Bean直接导入单个类

@Configuration
public class MyConfig {
    @Bean
    public Student getStudent(){
        return new Student();
    }
}

二、@ComponentScan默认扫描(该注解会默认扫描该类所在包下的所有配置类(添加过spring注解的类、@Controller、@Service、@Repository、@Component))

@Configuration
@ComponentScan(value = "com.xinyu.major")
public class MyConfig {

}

三、@Import快速给容器导入Bean的方式

1.@Import直接参数导入

@Import(value = {PersonA.class})

2.实现ImportSelector自定义规则实现

@Configuration
@Import(value = {MyImportSelector.class})
public class MyConfig {}

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.xinyu.major.Company",
                            "com.xinyu.major.Member"};
    }
}

3.实现ImportBeanDefinitionRegistrar获得BeanDefinitionRegistry可以手动直接往IOC容器中注入

@Configuration
@Import(value = {MyImportBeanDefinitionRegistrar.class})
public class MyConfig {}

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    /**
     *
     * @param importingClassMetadata  当前类的注解信息
     * @param registry 完成BeanDefinition的注册
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        boolean company = registry.containsBeanDefinition("com.xinyu.major.Company");
        boolean member = registry.containsBeanDefinition("com.xinyu.major.Member");

        if(company && member){
            BeanDefinition beanDefinition = new RootBeanDefinition(User.class);
            registry.registerBeanDefinition("user",beanDefinition);
        }
    }
}

四.FactoryBean 把需要注册的对象封装成FactoryBean

FactoryBean 负责将Bean注册到IOC的bean,BeanFactory 从IOC中获得Bean对象

@Configuration
public class MyConfig {

    @Bean
    public MyFactoryBean getMyFactoryBean() {
    return new MyFactoryBean();
    }
}

public class MyFactoryBean implements FactoryBean<Monkey> {
    @Nullable
    @Override
    public Monkey getObject() throws Exception {
        return new Monkey();
    }

    @Nullable
    @Override
    public Class<?> getObjectType() {
        return Monkey.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}


调用
ApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
Object monkey = app.getBean("getMyFactoryBean");
System.out.println(monkey);

Object monkey1 = app.getBean("&getMyFactoryBean");
System.out.println(monkey1);

Class<?> aClass = app.getBean("&getMyFactoryBean").getClass();
System.out.println(aClass);

版权声明:本文为weixin_39723539原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。