【Spring01】Bean的创建方式

Bean的创建方式

首先来了解一下bean是什么?

Spring 官方文档对 bean 的解释是:
In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.
翻译过来就是:在Spring中,构成应用程序并由Spring IOC容器进行管理的对象称为bean。bean是一个由IOC容器实例化、组装和管理的对象。

Bean的创建方式

一、注解+包扫描

注解+包扫描的方式就是我们注解版Spring中常用的实现方式

@Component/@Controller/@Service/@Repository

其中有相关注解可以指定bean的作用域、注入时机条件等。

@Scope 设置bean的作用域,其属性 value 可指定bean是单实例还是多实例,单实例:“singleton”,多实例:“prototype”

@Lazy 可以设置bean是否懒加载,即用到时才加载,不在容器初始化时进行加载

@Conditional 可以进行bean的注入时条件判断,如:@ConditionalOnMissingBean、@Conditional({ConditionImpl.class})

二、@Bean方式注入

使用@Bean注解配合@Configuration进行注入,@Bean(“SpringPeople2”) 可以自定义组件的ID,可以导入第三方包中的组件

// 标注为配置类
@Configuration
public class BeanCreate02_Bean {

    /**
     * 创建自定义bean
     **/
    @Bean("SpringPeople2")
    SpringPeople createPeople() {
        return new SpringPeople("wei", 18);
    }
}
@Data
@AllArgsConstructor
public class SpringPeople {

    private String name;

    private Integer age;

    public SpringPeople() {
        System.out.println("SpringPeople...无参构造...");
    }
}

三、@Import注入Bean

@Configuration + @Import 实现bean的注入

1、容器自动注册类

容器自动注册bean,其id为全类名

@Configuration
@Import({SpringPeople.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class BeanCreate03_Import {
}
2、ImportSelector

@Configuration + @Import + ImportSelector (返回需导入的组件的全类名数组)

实现ImportSelector接口,其selectImports方法返回类名,自动注入bean

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{SpringPeople.class.getName()};
    }
}
3、ImportBeanDefinitionRegistrar

@Configuration + @Import + ImportBeanDefinitionRegistrar (手动注册bean至容器中)

实现ImportBeanDefinitionRegistrar接口,其registerBeanDefinitions方法进行bean的注入

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //构建一个 BeanDefinition , Bean的类型为 UserConfig,这个Bean的属性username的值为后端元宇宙
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(SpringPeople.class)
            .addPropertyValue("name", "wei05")
            .getBeanDefinition();
        //把 UserConfig 这个Bean的定义注册到容器中
        registry.registerBeanDefinition("SpringPeople3_ImportBeanDefinitionRegistrar", beanDefinition);
    }

}

四、工厂bean FactoryBean

// 标注为配置类
@Configuration
public class BeanCreate02_Bean {

    @Bean("SpringPeople4")
    BeanCreate04_FactoryBean create04FactoryBean() {
        return new BeanCreate04_FactoryBean();
    }
}

默认获取到的是工厂bean调用 getObject() 创建的对象
要获取工厂Bean本身,我们需要给id前面加一个&
&BeanCreate04_FactoryBean

public class BeanCreate04_FactoryBean implements FactoryBean<SpringPeople> {
    @Override
    public SpringPeople getObject() throws Exception {
        return new SpringPeople();
    }

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

    /**
     * @author  luomengwei
     * 是否单例对象,默认为true
     **/
    @Override
    public boolean isSingleton() {
        return FactoryBean.super.isSingleton();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值