Spring实例化bean的4种方式

1.无参构造器方法

现在开始测试无参构造器方法实例化bean:
第一步:创建一个类Bean1

public class Bean1 {
	
}

第二步:spring配置文件applicationContext.xml种配置bean

<bean id="bena1" class="com.igeek.Bean1"></bean>

第三步:编写测试类SpringTest,获取bean实例

public class SpringTest {
	@Test
	public void test1(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean1 bean1 =  (Bean1) ac.getBean("bean1");
		System.out.println(bean4);
	}
}

运行测试类后结果拿到了bean1实例:
在这里插入图片描述
这里要注意每个类都会有一个默认的无参构造器来实例化bean实例,但是如果类中定义了有参的构造器,那么无参的构造器会被覆盖掉,需要显示地在类中去声明无参的构造器来实例化bean.下面来测试证明这一结论:
还是上面的测试案例,只改动以下Bean1这个类,加入一个有参构造器:

public class Bean1 {
    private String name;
	public Bean1(String name){
	this.name = name;
	}
}

再次运行SpringTest测试类:
在这里插入图片描述
报错信息中提示没有空的构造方法来实例化bean,所以要显示的去添加无参构造方法来实例化bean
修改Bean1类:

public class Bean1 {
    private String name;
	public Bean1(String name){
	this.name = name;
	}
	public Bean1(){
	
	}
}

加入了无参构造方法后,再次运行测试类,就可以正常的实例化bean了。

2.静态工厂方法

第一步:创建Bean1类

public class Bean2 {
	
	//静态方法,用来返回对象的实例
	public static Bean2 getBean2(){
		//在做实例化的时候,可以做其他的事情,即可以在这里写初始化其他对象的代码
		//Connection conn....
		return new Bean2();
	}

}

第二步:配置Spring配置文件applicationContext.xml

<!--静态工厂的方式创建bean,用来自己定义以下工厂,让Spring的大工厂来调用我们的小工厂可以将对象的创建权限
交给我们的小工厂,factory-method:工厂的静态放过,在实例化bean的时候自动调用-->
<bean id="bean2" class="com.igeek.Bean2" factory-method="getBean2"/>

第三步:编写测试类SpringTest.java

public class SpringTest {
	@Test
	public void test1(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean2 bean2 =  (Bean2) ac.getBean("bean2");
		System.out.println(bean2);
	}
}

3.实例工厂方法

第一步:创建Bean3类

public class Bean3 {

}

第二步:创建实例工厂类Bean3Factory

public class Bean3Factory {
	//普通的方法,非静态方法
	public Bean3 getBean3(){
		//初始化实例对象返回
		return new Bean3();
	}
}

第三步:Spring容器的配置,applicationContext.xml

<!-- 3:实例工厂的方式实例化bean -->
	<bean id="bean3Factory" class="com.igeek.Bean3Factory"/>
	<!-- factory-bean相当于ref:引用一个bean对象 -->
	<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"/>

第四步:使用测试类SpringTest进行测试

public class SpringTest {
	@Test
	public void test1(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean3 bean3 =  (Bean3) ac.getBean("bean3");
		System.out.println(bean3);
	}
}

4.FactoryBean方式

第一步:创建Bean4类

public class Bean4 {

}

第二步:创建工厂Bean,Bean4FactoryBean.java,实现FactoryBean的接口

//实现FactoryBean接口的方式
//泛型,想要返回什么类型的对象,泛型就是什么,FactoryBean提供getObject方法返回目标类型对象
public class Bean4FactoryBean implements FactoryBean<Bean4>{
	//用来获取bean的实例,对象
	public Bean4 getObject() throws Exception {
		//写一些初始化数据库连接等等其他代码
		return new Bean4();
	}
	public Class<?> getObjectType() {
		return null;
	}
	public boolean isSingleton() {
		return false;
	}
}

第三步:applicationContext.xml配置

<!--实现接口FactoryBean的方法,spring在准备实例化bean的时候,new Bean4FactoryBean没有急着返回bean
对象,会判断类型对象是否实现了FactoryBean接口,如果实现了就调用接口的getObject方法。得到bean的实例返回-->
<bean id="bean4" class="com.igeek.Bean4FactoryBean"></bean>

第四步:启动SpringTest测试类来测试

public class SpringTest {
	@Test
	public void test1(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean4 bean4 =  (Bean4) ac.getBean("bean4");
		System.out.println(bean4);
	}
}

//测试结果成功获取到了bean4实例对象

小结

第一种最常用,
第二种,第三种框架初始化的时候用的多
第三种,第四种Spring底层用的多
BeanFactory和FactoryBean的区别:
BeanFactory:是一个工厂(其实是构建了一个spring上下文的环境容器),用来管理和获取很多的bean对象,例如加载applicationContext.xml文件。
FactoryBean:是一个bean生成工具,是用获取一种类型对象的bean,它是构造Bean实例的一种方式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值