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();
}
}