基于XML创建bean对象
基于XML创建bean对象
1. 调用构造函数创建Bean
调用构造方法创建Bean是最常用的一种情况,Spring容器通过new关键字调用构造器来创建Bean实例,通过class属性指定Bean实例的实现类,也就是说,如果使用构造器创建Bean方法,则<bean/>
元素必须指定class属性,其实Spring容器也就是相当于通过实现类new了一个Bean实例。调用构造方法创建Bean实例,通过名字也可以看出,我们需要为该Bean类提供无参数的构造器。如果此类中没有默认构造函数,则对象无法创建。
1.Bean实现类Person.java
package ioc.pojo; public class Person{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
1
2
3
4
5
6
7
8
9
10
11
12因为是通过构造函数创建Bean,因此我们需要提供无参数构造函数,另外我们定义了一个name属性,并提供了setter方法,Spring容器通过该方法为name属性注入参数。
2.配置文件applicationContext.xml
<?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.xsd"> <!-- 指定class属性,通过构造方法创建Bean实例 --> <bean id="person" class="cn.edu.wtu.Person"> <!-- 通过构造方法赋值 --> <constructor-arg name="name" value="魔术师"></constructor-arg> </bean> </beans>
1
2
3
4
5
6
7
8
9
10配置文件中,通过
<bean>
元素的id属性指定该bean的唯一名称,class属性指定该bean的实现类,可以理解成Spring容器就是通过该实现类new了一个Bean。通过<constructor-arg>
标签的name属性和value属性指定了:构造方法赋值。
2. 调用静态工厂方法创建Bean
把创建Bean的任务交给了静态工厂,而不是构造函数,这个静态工厂就是一个Java类,那么使用静态工厂创建Bean咱们又需要添加哪些属性呢?我们同样需要在<bean/>
元素内添加class属性,上面也说了,静态工厂是一个Java类,那么该class属性指定的就是该工厂的实现类,而不再是Bean的实现类,告诉Spring这个Bean应该由哪个静态工厂创建,另外我们还需要添加factory-method属性来指定由工厂的哪个方法来创建Bean实例,因此使用静态工厂方法创建Bean实例需要为<bean/>
元素指定如下属性:
class:指定静态工厂的实现类,告诉Spring该Bean实例应该由哪个静态工厂创建(指定工厂地址)
factory-method:指定由静态工厂的哪个方法创建该Bean实例(指定由工厂的哪个车间创建Bean)
如果静态工厂方法需要参数,则使用<constructor-arg/>
元素传入
public class StaticFactory {
public static IAccountService getAccountService() {
return new AccountServiceImpl();
}
}
2
3
4
5
配置方式如下:
<bean id = "accountService" class = "cn.edu.wtu.factory.StaticFactory" factory-method="getAccountService"></bean>
3. 调用实例工厂方法创建Bean
使用某个类中的静态方法创建对象,并存入spring容器,如下
/**
*模拟一个工厂类,该类可能存在于jar包中,无法通过修改源码的方式来提供默认构造函数
*
*/
public class InstanceFactory {
public IAccountService getAccountService() {
return new AccountServiceImpl();
}
}
2
3
4
5
6
7
8
9
配置方式如下:
<bean id = "instanceFactory" class = "cn.edu.wtu.factory.InstanceFactory"></bean>
<bean id = "accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>
2
先把工厂的创建交给 spring 来管理。然后在使用工厂的 bean 来调用里面的方法
- factory-bean 属性:用于指定实例工厂 bean 的 id。
- factory-method 属性:用于指定实例工厂中创建对象的方法。