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();
    }
}
经验分享 程序员 微信小程序 职场和发展