Spring创建Bean的几种方式

一、通过xml配置

最简单的配置,可以通过xml中bean标签来设置

<bean id = " *** ", class = "com.***">
</bean>

通过这种方法要在响应类中添加get和set方法,或者添加构造方法.

或者可以通过静态工厂或者实例工厂方法


public class PersonFactory{
    //静态工厂
    public static Person createPerson(){
        return new Person();
    }
    //实例工厂
    public Person createPerson(){
        return new Person();
    }
}

通过这种方式配置要创建一个工厂类,然后将类和方法在xml文件中配置.

最后我们还可以通过实现FactoryBean接口来创建一个bean,然后再xml中配置这个实现类即可.

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

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

需要注意的是BeanFactory和FactoryBean完全不是一个概念.

BeanFactory是spring容器最基本的接口,他提供了spring容器的最基本方法,但是不提供具体的实现.日常我们用了spring容器就是DefaultListableBeanFactory,是BeanFactory的实现类.所以可以说BeanFactory就是spring容器,负责管理所有的bean.

FactoryBean是一个Bean,也可以用来创建Bean,他为我们提供了一个更灵活的创建Bean的方法.Factory产生的bean也是要交给spring容器管理的.

二、通过@Configuration注解

这种方式也就是java Config方式,我们不再需要写配置文件,转而通过配置类的方式来完成配置.

@Configuration
public class MyConfig{

    @Bean
    public Person createPerson(){
        return new Person();
    }
}

无论是xml还是java config,spring都是通过BeanDefinition读取配置信息的.

三、通过@Component注解

这种方式使我们经常使用的,除了@Component还有@Controller,@Service,@Repository@Entity等.

这种方式的实现原理是@SpringBootApplication注解,这个注解中包含了@ComponentScan注解,他会扫描springboot主启动类的包下的所有类,如果一个类被标注了@Component注解就会被加载进spring容器

四、通过Import注解

这个方法是相对较高级的用法,我们日常不经常用但是在@SpringBootApplication注解中却使用地淋漓尽致.

首先说@Import注解的用法

@Import({Person.class})
@Configuration
public class MyConfig{


}

我们可以在配置类上加入import注解,导入要注入spring容器的类,这样spring

容器就会自动导入了.

除了导入普通类之外,还可以导入配置类

@Import({MyConfig2.class})
@Configuration
public class MyConfig{
}

这样做的好处是可以将非主启动类子包下的配置类导入进来

有的时候我们需要根据条件判断导入某些Bean,不导入某些Bean

这个时候可以通过继承ImportSeclector接口的方法

public class DataImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.sue.async.service.User",
                             "com.sue.async.service.Role"};
    }
}

然后用@Import注解将实现类导入.

@SpringBootApplication中的EnableAutoConfiguration注解就是使用了这种方式,扫描所有根目录下的META-INFO文件夹中的spring.factories配置文件,将其中autoconfiguration字段下的所有类都加载进spring容器.


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