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();
}
转载自:https://juejin.cn/post/7243828459289346107