likes
comments
collection
share

Spring之Bean的创建方式

作者站长头像
站长
· 阅读数 11

Spring之Bean的创建方式

Spring框架,可以说是家喻户晓般的存在,闲暇之余研究下,不仅可以增加兴趣,也能修炼内功🔥

Bean的创建原始方式

  • 在之前,我们通过依赖注入的方式注入bean,那么通常会写一个applicationContent.xml 用来放置spring的配置文件,里面写上
<bean id="student" class="com.xxx.bean.Sttudent">
    <property name="age" value="23"></property>
    <property name="name" value="张三"></property>
</bean>
  • 现在我们通过注解的方式来配置Bean

通过注解的方式配置Bean

  • 包扫描+ia组件注解@Controller/@Service/@Repository/@Component
  • @Bean
//这个注解告诉spring,这是一个配置类,类似于以前的一个spring配置文件
@configuration
public class BeanConfig{

    //给容器中注入一个bean,类型为方法返回值的类型,id默认是方法名字
    @Bean
    public Student student(){
        return new Student(23, "张三");
    }

}
  • 默认的bean都是单例的,如果需要改变,可以在@Bean注解上面加上@Scope注解
//参数是可选的,有以下几个参数
//1.prototype:多实例:ioc容器启动并不会去调用方法创建对象放在容器中。而是每次获取的时候,才会调用方法创建对象
//2.singleton:单实例(默认)ioc容器启动会调用方法创建对象放在容器中,以后每次获取就是从容器中获取
//3.request:同一次请求创建一个实例
//4.session:同一个session创建一个实例
@Scope(""prototype)
  • 由于单实例的bean是在容器初始化的时候就创建了,所以可以设置懒加载,让他在被获取的时候创建,在@Bean上加@Lazy 注解
  • @Conditional 可以根据自定义条件判断是否需要创建Bean,参数需要一个实现condition的实现类,用来判断规则
@Conditional(StudentConditional.class)
@Bean
public Student student(){
    return new Student(23, "张三");
}

public class StudentConditional implements Condition{
    @override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata){
        return true;
    }
}
    
  • @Import
//import的方式,导致指定的类为bean,id默认是类的全类名
@Import(Student.class, Person.class)
@Configuration
public class BeanConfig{}

//import中也可以写实现了importSelector接口的类
@Import(MyImportSelector.class)
//实现类
public class MyImportSelector implements ImportSelector{
    @Override
    public String[] selectImports(AnnotatedTypeMetadata metadata){
        //可以批量导入
        return new String[]{"com.xxx.Student"};
    }
}

//import中也可以写实现了ImportBeanDefinitionRegisterar接口的类
//实现类
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
    @Override
    public void registerBeanDefinitions(AnnotatedTypeMetadata metadata, BeanDefinitionRegistry registry){
        //指定bean的定义信息
        RootBeanDefinition beanDefinition = new RootBeanDefinition(Student.class);
        //注册一个bean
        registry.registerBeanDefinition("student", beanDefinition);
    }
}
  • 实现了FactoryBean方式的,这个不在@Import注解中写,需要像开始的一样加@Bean注解
//创建一个spring定义的FactoryBean
public class StudentFactoryBean implements FactoryBean<Student>{
    //返回一个Student对象,这个对象会添加进容器中
    @Override
    public Student student() throws Exception{
        return new Studnet("25", "小红");
    }
}

@Bean
public StudentFactoryBean studentFactoryBean(){
    return new StudentFactoryBean();
}