spring中Bean的创建方式

        在spring中Bean创建有三种方式.

  1. 直接通过spring调用相对应的构造函数创建对象
  2. 静态的工厂方法
  3. 实例的工厂方法

第一种是我们最常用的方式,这里就不论述了.主要说明下静态的工厂方法和实例的工厂方法如何配置。

package mislay;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		
		TestBean bean1 = (TestBean) context.getBean("testBean1");
		bean1.sayHello();
		
		TestBean bean2 = (TestBean) context.getBean("testBean2");
		bean2.sayHello();

		TestBean bean3 = (TestBean) context.getBean("testBean3");
		bean3.sayHello();
	}
}



 

package mislay;

public class TestBean {
	private TestBean(String hello) {
		this.s = hello;
	}
	
	public static TestBean newInstance(String hello) {
		return new TestBean(hello); 
	}
	
	public static TestBean newInstance() {
		return new TestBean("hello"); 
	}
	
	private String s;
	public void sayHello() {
		System.out.println(s);
	}
}

 

package mislay;

public class TestBeanFactory {
	public TestBean getTestBean() {
		return TestBean.newInstance("大家好");
	}
	
	public static TestBean getTestBeanByStaticMethod() {
		return TestBean.newInstance("再一次大家好");
	}
}

 

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

	<bean id="testBean1" class="mislay.TestBean" factory-method="newInstance" />
	
	<bean id="testBean2" class="mislay.TestBean" factory-bean="helloBeanFactory1" factory-method="getTestBean" />
	<bean id="helloBeanFactory1" class="mislay.TestBeanFactory"></bean>
	
	<bean id="testBean3" class="mislay.TestBeanFactory" factory-method="getTestBeanByStaticMethod"></bean>
</beans>

 

代码很简单,静态的工厂方法分别在TestBean和TestBeanFactory中各一个.其中TestBeanFactory中还有一个实例的工厂方法.所有的工厂方法都返回一个TestBean实例.

 

注意在spring配置文件中id为testBean1何testBean3都利用了静态工厂方法.而testBean2则是利用了实例工厂方法。从这几个配置中不难看出:

  •  factory-method针对的是方法名,如果factory-bean属性没有出现,那么则是利用的class属性配置的类的静态方法
  • 如果factory-method和factory-bean同时出现,那么则是利用的这个class属性配置的类的实例方法
  • 不管是实例方法和静态方法都共同有个缺点:不能带参数

对于实例工厂方法不能传参的问题可以通过配置不同实例,注入不同的参数,然后引用所需要的实例接达到目的。但是静态工厂方法就无能为力了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值