Spring 有多种装配 bean 的方式,最初学习的应该是在 xml 配置文件中装配 bean,而实际项目中最常用的当然是简单方便的自动扫描方式了。本文主要是记录一下通过 .java 配置类装配 bean 的三种方式。
直接创建
- 创建 Bean1 实体类(可以不要内容,空类即可)
- 配置文件中通过 createBean() 方法装配(创建) bean1
- 测试类获取 bean1
工厂方式
- 创建 Bean2 实体类(空类即可)
- 创建 Bean2Factory 工厂类,实现 FactoryBean 接口
- 配置文件中通过 createFactoryBean() 方法装配 bean2
- 测试类获取 bean2
- 测试类获取工厂 bean
混合方式
- 创建 Bean3 实体类(空类即可)
- 创建 Bean3Factory 工厂类
- 配置文件中先通过 Bean3Factory() 方法装配工厂 bean,再通过 createBean3() 方法获取工厂 bean 作为参数装配 bean3
- 测试类获取 bean3,这里获取工厂 bean 的方式则跟直接装配是一样的
ps:这三种方式的名字是自己这么叫的,如不恰当请结合代码理解
总体代码如下:
1、实体类 Bean1,Bean2,Bean3 都是空类
public class Bean1 {
}
2、Bean2Factory 工厂类
import org.springframework.beans.factory.FactoryBean;
public class Bean2Factory implements FactoryBean<Bean2> {
@Override
public Bean2 getObject() throws Exception {
return new Bean2();
}
@Override
public Class<?> getObjectType() {
return Bean2.class;
}
//是否是单例,默认true
public boolean isSingleton() {
return false;
}
}
3、Bean3Factory 工厂类
//不实现接口
public class Bean3Factory {
public Bean3 createBean() {
return new Bean3();
}
}
4、配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@Configuration
public class MyConfig {
@Bean(name = "myBean1")
@Scope("prototype") //默认单例,改成多例
public Bean1 createBean() {
return new Bean1();
}
//-----------------------------------------------
@Bean
public Bean2Factory createFactoryBean() {
return new Bean2Factory();
}
//-----------------------------------------------
@Bean
public Bean3Factory Bean3Factory() {
return new Bean3Factory();
}
@Bean
public Bean3 createBean3(Bean3Factory bean3Factory) {
return bean3Factory.createBean();
}
}
5、测试类,获取 bean
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class App {
public static void main( String[] args ) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
System.out.println(context.getBean(Bean1.class));
// 按bean的名字获取,未命名时默认为方法名,已命名则根据已命好的名字,并且不能用方法名获取该bean了
// System.out.println(context.getBean("createBean"));
System.out.println(context.getBean("myBean1"));
//通过 MyBeanFactory 工厂获取 bean2
System.out.println(context.getBean(Bean2.class));
System.out.println(context.getBean("createFactoryBean"));
//获取 MyBeanFactory 工厂本身这个 bean
System.out.println(context.getBean(Bean2Factory.class));
System.out.println(context.getBean("&createFactoryBean"));
System.out.println(context.getBean(Bean3.class));
System.out.println(context.getBean("createBean3"));
System.out.println(context.getBean(Bean3Factory.class));
System.out.println(context.getBean("Bean3Factory"));
context.close();
}
}