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();
}
上一篇: Bean实例化的三种方式