一、通过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容器.