Spring 装配 Bean 的几种方式
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(); } }