上一篇(Spring系列—基础篇之配置)主要讲解了Spring三种配置方式,下面是Spring中Bean的实例化,以下主要是注解配合XML的方式讲解。
在Spring中bean定义本质上是创建一个或多个对象的方法。容器在被请求时查看命名bean的列表,并使用该bean定义封装的配置元数据来创建(或获取)实际对象。
如果是基于XML的元数据配置,需要在<bean/>元素中的class属性中指定需要实例化的对象的类型(或者class)。这个class属性实际上是 BeanDefinition实例的一个属性。你可以通过以下两种方式中的某一种方式:
- 通常,我们指定需要构造的Bean,在容器本身通过反射调用其构造函数来直接创建bean,这在某种程度上相当于使用new操作符的Java代码。
- 通过指定一个容器通过调用一个静态工厂方法的类来创建对象,调用静态工厂方法可以返回一个同样类型或者其他类型的对象。
一、通过构造方法实例化对象
Spring可以管理任何类型的Java类,不用实现任何借口和使用特殊的方式。一般的需要Spring管理的类必须有一个无参的构造方法。
如下一个基本的Java POJO类需要通过Spring管理,需要有默认的构造方法
package com.spring.po;
/**
* @Auther admin
* @Date 2018/11/21
* @Description
*/
public class Users {
private String name;
private int age;
private String ename;
public Users(){
}
public Users(String name, int age){
this.name = name;
this.age = age;
}
// getter and setter
}
在Spring 的XML方式的配置如下所示:
<bean id="user" class="com.spring.po.Users" />
二、通过静态工厂方法实例化对象
在遗留的项目代码中有些可能是通过静态工厂模式进行类的实例化操作,这个样依然可以通过Spring管理。
如下所示,有一个静态工厂类
package com.spring.facotry;
import com.spring.po.Users;
/**
* @Auther admin
* @Date 2018/12/2
* @Description
*/
public class MyBeanFactory {
public static Users getUsers(){
return new Users();
}
}
在Spring中的配置如下所示:
<bean id="factoryUsers" class="com.spring.facotry.MyBeanFactory" factory-method="getUsers"/>
三、通过实例化工厂方法实例化对象
如果在工厂类的方法不是静态方法时仍然可通过Spring进行实例化Bean。如存在以下工厂类
package com.spring.facotry;
import com.spring.po.Users;
/**
* @Auther admin
* @Date 2018/12/2
* @Description
*/
public class NoStaticBeanFactory {
public Users createInstance(){
return new Users();
}
}
在Spring配置时可以通过指定<bean />标签的 factory-bean属性。如下配置
<!-- 首先实例化工厂实例 -->
<bean id="noStaticBeanFactory" class="com.spring.facotry.NoStaticBeanFactory" />
<!-- 去除 class属性,通过factory-bean属性指定工厂实例 -->
<bean id="user1" factory-bean="noStaticBeanFactory" factory-method="createInstance" />
静态内部类实例化
如果想实例化一个静态内部类,可以通过二进制名称
如下类所示:
package com.spring.po;
/**
* @Auther admin
* @Date 2018/12/2
* @Description
*/
public class Foo {
public static class Bar{
}
}
可在Spring容器中通过如下配置实现内部类
<bean id="bar" class="com.spring.po.Foo$Bar" />