欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-03 12:33:18
...
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();
	}