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();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值