Spring中bean的三种实例化方式的简单实例

Bean的配置方式有三种:通过全类名(反射)、通过工厂方法(静态工厂方法&实例工厂方法)、FactoryBean.

1.首先是通过全类名来配置,这种方式最为简单也很常用,这里就不创建实例了:

在spring配置文件中配置如下:

<!-- 
		配置bean:
		bean的全类名,通过反射的方式在容器创建Bean,所以要求Bean必须要有无参构造器 
		id:Bean的名称,在IOC容器中必须是唯一的,若ID没有指定,spring将权限定性类名作为bean的名字
		id可以指定多个名字,名字之间可以用逗号、分号、或空格分隔
	-->
	<bean id="helloWord" class="com.spring.po.HelloWord">
		<property name="name" value="Spring"></property>
	</bean>

2.通过静态工厂来配置bean实例:

首先建立静态工厂:

import java.util.HashMap;
import java.util.Map;
import com.spring.po.Car;
/**
 * 静态工厂方法:直接调用某一个类的静态方法就可以返回Bean实例
 *
 */
public class StaticFactory {
	private static Map<String, Car> cars = new HashMap<>();
	//初始化模拟数据
	static {
		cars.put("audi", new Car("audi",300000.0));
		cars.put("baoma", new Car("baoma",400000.0));
	}
	//静态工厂方法
	public static Car getCar(String name) {
		return cars.get(name);
	}
}
在spring配置文件中进行如下配置:

<!-- 通过静态工厂方法来配置Bean,不是配置静态工厂实例,而是配置bean实例 -->
	<bean id="car1" class="com.spring.factory.StaticFactory" factory-method="getCar">
		<constructor-arg value="baoma"></constructor-arg>
</bean>
在静态工厂中,通过factory-method来获取返回的bean,通过constructor-arg标签来传递参数,获取对应的bean对象

下面是测试类:

public class FactoryTest {
	public static void main(String[] args) {
		//获取spring IOC容器
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		Car car1 = (Car) context.getBean("car1");
		System.out.println(car1);
	}
}

最后结果输出: Car[name=baoma, price=400000.0]


3.通过实例工厂方法来配置bean简单实例:

首先创建实例工厂:

import java.util.HashMap;
import java.util.Map;
import com.spring.po.Car;
/**
 * 实例工厂的方法:需先创建实例工厂本身,再调用工厂的方法返回bean实例
 *
 */
public class InstanceFactory {
	private Map<String, Car> cars = null;
	public InstanceFactory() {		//通过构造器来初始化模拟数据
		cars = new HashMap<>();
		cars.put("audi", new Car("audi",300000.0));
		cars.put("baoma", new Car("baoma",400000.0));
	}
	
	public Car getCar(String name) {
		return cars.get(name);
	}
}
在spring配置文件的配置如下:

<!-- 实例工厂 -->
<bean id="carFactory" class="com.spring.factory.InstanceFactory"></bean>
<!-- 通过实例工厂来配置bean -->
<bean id="car2" factory-bean="carFactory" factory-method="getCar">
	<constructor-arg value="baoma"></constructor-arg>
</bean>

测试类:

public class FactoryTest {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
	
		Car car2 = (Car) context.getBean("car2");
		System.out.println(car2);
	}
}

输出结果: Car[name=baoma, price=400000.0]


4.通过FactoryBean来配置Bean的简单实例:

首先创建一个实现FactoryBean接口的类:

	package com.spring.factoryBean;
	import org.springframework.beans.factory.FactoryBean;
	import com.spring.po.Car;
	
	public class FactoryCarBean implements FactoryBean<Car>{
	        private String name;
	        
	        public void setName(String name) {
	                this.name = name;
	        }
	        /**
	         * 返回bean
	         */
	        @Override
	        public Car getObject() throws Exception {
	                return new Car(name, 500000.0);
	        }
	        /**
	         * 返回的类型
	         */
	        @Override
	        public Class<?> getObjectType() {
	                return Car.class;
	        }
	        /**
	         * 是否单例
	         */
	        @Override
	        public boolean isSingleton() {
	                return true;
	        }
	
	}

在spring的配置文件如下:

<!-- 通过FactoryBean来配置Bean, class直接指向实现FactoryBean的类-->
	<bean id="car3" class="com.spring.factoryBean.FactoryCarBean">
		<property name="name" value="BMW"></property>
</bean>
测试类:

	public class FactoryBeanTest {
	        public static void main(String[] args) {
	                ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
	                Car car = (Car) context.getBean("car3");
	                System.out.println(car);
	        }
	}

输出结果: Car[name=BMW, price=500000.0]


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值