Spring实例化Bean对象的三种方式

Spring实例化Bean对象的三种方式
一、Instantiation with a constructor (使用构造函数实例化)
二、Instantiation with a static factory method (使用静态工厂方法实例化)
三、Instantiation using an instance factory method (使用实例工厂方法实例化)
  • 下面通过代码来讲解三种方式的实现:
1、构造函数实例化
当您使用构造函数方法创建bean时,所有普通类都是可用的。也就是说,正在开发的类不需要实现任何特定的接口。是最常见也是最简单的一种实例化bean的方式。
需要的准备工作:
	创建一个动态web项目-->创建配置文件-->创建测试类-->创建service接口以及实现类;
	导入jar包: 4+1 beans、context、core、expression  依赖包commmons-logging;

applicationContext.xml

	<!-- class中为实现类的全路径 id即在测试类中通过getBean(id)获取 -->
	<bean id="userService" class="com.hym.service.impl.UserService"></bean>

UserService

public class UserService implements IUserService{

	@Override
	public void show() {
		//方法自己定义,目前只需要测试能否成功拿到bean对象即可
		System.out.println("Construct Func...");
	}

}

测试类:

public class InstanceBeanTest {
	
	@Test
	public void constructBean(){
		//加载Spring的主配置文件--要导包
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		//方式一、通过id拿到配置文件中的bean对象--类型为IUserService
		IUserService userService = (IUserService) context.getBean("userService");
		//方式二、通过传入接口的反射对象从而在配置文件中获取到相同类型的对象.
		//【注意通过类型得到对象时,不能存在两个class指向路径一样的bean对象,否则会报错】
		IUserService userService2 = context.getBean(IUserService.class);
		//得到对象就可以调用其中的方法
		userService.show();
	}

}
2、静态工厂方法实例化
用于生成实例对象,所有的方法必须是static。定义使用静态工厂方法创建的bean时,使用class属性指定包含要指定的静态工厂方法和名为
factory-method的属性的类工厂方法本身的名称。
相对第一种实现方式,多了工厂类;

applicationContext.xml

	<!-- id依旧自己命名,class中的值为静态工厂类的全路径 需要多写返回对象的静态方法,并且值要与方法名一致 -->
	<bean id="userStaticService" class="com.hym.factory.StaticFactory" factory-method="getInstance"></bean>

StaticFactory静态工厂类

public class StaticFactory {
	//通过静态工厂的方式来实例化对象
	private static IUserService userService = new UserService();

	public static IUserService getInstance() {
		return userService;
	}

}

测试类:

	@Test
	public void staticFactoryBean(){
		//加载Spring的主配置文件--要导包
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		//方式一、通过id拿到配置文件中的bean对象--类型为IUserService
		IUserService userService = (IUserService) context.getBean("userStaticService");
		//方式二、通过传入接口的反射对象从而在配置文件中获取到相同类型的对象.
		IUserService userService2 = context.getBean(IUserService.class);
		//得到对象就可以调用其中的方法
		userService2.show();
	}
3、实例工厂方法实例化
必须先有工厂实例对象,通过实例对象创建对象。提供所有的方法都是“非静态”的。与通过静态工厂方法实例化类似,使用实例工厂方法实例化从容器中调用
现有bean的非静态方法来创建新bean。使用这个机制,保留class属性为空,在factory-bean属性中指定a的名称包含要调用的实例方法的当前(或父/父)
容器中的bean创建对象。

applicationContext.xml

	<bean id="userInstanceService" class="com.hym.factory.InstanceFactory"></bean>
	<!-- 因为不是静态的返回对象,所以要先获取到工厂对象,然后再通过工厂对象使用非静态成员方法,得到userService对象 -->
	<!-- 这里的factory-bean中的值为前面写的指向实例工厂类bean的id -->
	<bean id="userService" factory-bean="userInstanceService" factory-method="getInstance"></bean>

实例工厂类

public class InstanceFactory {
	
	private IUserService userService = new UserService();
	
	public IUserService getInstance(){
		return userService;
	}

}

测试类

	@Test
	public void instanceFactoryBean(){
		//加载Spring的主配置文件--要导包
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		//方式一、通过id拿到配置文件中的bean对象--类型为IUserService
		IUserService userService = (IUserService) context.getBean("userService");
		//方式二、通过传入接口的反射对象从而在配置文件中获取到相同类型的对象.
		IUserService userService2 = context.getBean(IUserService.class);
		//得到对象就可以调用其中的方法
		userService.show();
	}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值