Spring Bean的定义
课程    Spring框架

本篇介绍什么是Spring Bean类,如何创建Bean类,以及如何将Bean类添加到Spring IOC容器。通过本篇的学习,可以达成如下目标。

● 认识Spring Bean类

● 掌握Bean类的配置项

● 将Bean类添加到Spring IOC容器


1、什么是Spring Bean类

Spring Bean是事物处理组件类和实体类(POJO)对象的总称,Spring Bean被Spring IOC容器初始化,装配和管理。

Spring  Bean类包含事务处理组件和实体类(POJO)。在课程案例SpringProgram项目中,EmailNotice和PhoneNotice类属于事务组件类,用于处理发送通知事务,包含事务处理代码;Teacher类是实体类(POJO),仅包含实体属性及其set和get方法。

Teacher类代码如下。

package com.milihua.springprogram.entity;
public class Teacher {
    private String name;
    private String classtime;
 
    public String getNotify() {
        return name + "在" + classtime;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getClasstime() {
        return classtime;
    }
 
    public void setClasstime(String classtime) {
        this.classtime = classtime;
    }
 
}

Teacher类仅有两个属性:老师姓名(name)和上课时间(classtime)。方法getNotify()返回老师的上课时间。

EmailNotice类代码如下。
package com.milihua.springprogram.notice;
import com.milihua.springprogram.entity.Teacher;
public class EmailNotice implements NoticeInterface {
 
    private Teacher teacher;
    String  message;
   
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    @Override
    public void sendMessage() {
        // TODO Auto-generated method stub
        teacher.setClasstime(message + "_邮件发送");
    }
    public Teacher getTeacher() {
        return teacher;
    }
    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
 
}

EmailNotice类主要通过sendMessage()方法发送邮件给老师,因此该类依赖于老师类。sendMessage()是主要的事务处理方法。

2、Bean类的配置项

Spring IOC容器管理Bean时,需要了解Bean的类名、名称、依赖项、属性、生命周期及作用域等信息。为此,Spring IOC提供了一系列配置项,用于Bean在IOC容器中的定义。

① class

该配置项是强制项,用于指定创建Bean实例的Bean类的路径。

② name

该配置项是强制项,用于指定Bean唯一的标识符,在基于 XML 的配置项中,可以使用 id和或 name 属性来指定 Bean唯一 标识符。

③ scope

该配置项是可选项,用于设定创建Bean对象的作用域。

④ constructor-arg  

该配置项是可选项,用于指定通过构造函数注入依赖数据到Bean。

⑤ properties

该配置项是可选项,用于指定通过set方法注入依赖数据到Bean。

⑥ autowiring mode

该配置项是可选项,用于指定通过自动依赖方法注入依赖数据到Bean。

⑦ lazy-initialization mode

该配置项是可选项,用于指定IOC容器延迟创建Bean,在用户请求时创建Bean,而不要在启动时就创建Bean。

⑧ initialization

该配置项是可选项,用于指定IOC容器完成Bean必要的创建后,调用Bean类提供的回调方法对Bean实例进一步处理。

⑨ destruction

该配置项是可选项,用于指定IOC容器在销毁Bean时,调用Bean类提供的回调方法。

3、将Bean类添加到Spring IOC容器

将Bean类添加到Spring IOC容器有三种方式。一种方式是基于XML的配置文件;一种方式是基于注解的配置;一种方式是基于Java的配置。下面主要介绍基于XML的配置方式,基于注解和基于Java的配置放在后面进行讨论,放在后面讨论的原因是一些其它重要的Spring概念还需要掌握。

(1)XML配置文件的创建与存储

项目创建后,需要手动创建Spring配置文件,Spring配置文件默认名称是applicationContext.xml,也可以使用其它文件名称代替。在课程案例SpringProgram项目中,Spring核心配置文件被命名为dispatcher.xml,存储到src/config目录,如下图所示。

blob.png

图1 Spring配置文件在SpringProgram项目的存储目录

(2)Spring配置文件的加载

加载Spring的配置文件有多种方式,比较常用的是在web.xml加载配置文件。

① 使用ContextLoaderListener加载配置文件

如果配置文件名称采用默认的applicationContext.xml,并且存存储在WebContent/WEB-INF目录下,在web.xml添加下述代码。

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

ContextLoaderListener类在启动Web容器时,自动加载Spring applicationContext.xml的配置信息。

② 加载自命名的配置文件

Spring配置文件名称若没有采用applicationContext.xml,而是采用其它名称,如dispatcher.xml,文件依然存储到WebContent/WEB-INF目录下时,可在web.xml添加下述代码。

<context-param>
  <param-name>contextConfigLocation</param-name>  <param-value>/WEB-INF/dispatcher.xml</param-value>
</context-param>

param-name标签用于设置配置文件的存储位置,ContextLoaderListener从该存储位置读取配置文件。

③ 通过配置目录加载配置文件

企业级别的Web项目,配置文件比较多。不仅有Spring的配置文件,也包括其它框架的配置文件。将配置文件集中起来并存储到一个特定目录下进行综合管理,是开发大型项目常用的方法。课程案例SpringProgram项目中,Spring核心配置文件被命名为dispatcher.xml,存储到src/config目录。在这种情况下,需要在web.xml添加下述代码。

   <!-- 配置spring配置文件的名称和位置 -->
    <context-param>
        <param-name>configLocation</param-name>
        <param-value>classpath:/config/dispatcher.xml</param-value>
    </context-param>

<context-param>标签用来声明整个WEB项目内的上下文初始化参数。<param-name>标签指定初始化参数名称,<param-value>指定初始化参数的值。在web.xml配置的监听器类可以通过上下文环境获取指定参数名称的值。

例如课程案例代码:

public void contextInitialized(ServletContextEvent arg0) {
        // 1、获取spring配置文件的名称和位置
        ServletContext servletContext = arg0.getServletContext();
        //获取String配置文件存储位置    
        String config = servletContext.getInitParameter("configLocation");
        System.out.println("配置文件:" + config);
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
        // 3、将IOC容器放在ServletContext的一个属性中
 
    }

代码使用上下文ServletContext类调用getInitParameter获取指定参数名称的值(String配置文件的存储位置),然后使用ClassPathXmlApplicationContext类读取配置文件到ApplicationContext对象。这里的classpath是指 WEB-INF文件夹下的classes目录。

(3)在Spring配置文件中定义Bean

已创建的Bean类需要在Spring配置文件中进行定义,Spring IOC容器才能对Bean进行组配和管理。

课程案例Teacher类在Spring配置文件定义的代码如下。

<bean id="teacherZhang" class="com.milihua.springprogram.entity.Teacher">
        <property name="name" value="张老师"></property>
    </bean>

<bean>标签用于定义Bean,各属性说明如下:

① id:Bean的唯一标识,ApplicationContext对象可以通过id获取该Bean的实例。

② calss:Bean类的存储路径。

<property>标签用于从外部注入Bean的属性值, <property>标签各属性说明如下:

① name:Bean类的属性名称。

② value:name所值属性的值。

课程案例EmailNotice类在Spring配置文件定义的代码如下。

<bean id="eamilNoticeZhang" class="com.milihua.springprogram.notice.EmailNotice" p:teacher-ref="teacherZhang">
        <property name="message" value="8:45上语文课"></property>
    </bean>

EmailNotice类的<bean>标签相对Teacher类来说,多了p:teacher-ref属性,该属性用于对Bean内部的对象属性进行注入,格式为:

P: 属性名 = 注入的对象

课程小结

项目中的事务处理组件和实体类(POJO)可以作为Bean类,Bean类需要在Spring配置文件中进行定义,才能被IOC容器管理和组配。Spring IOC容器管理Bean时,需要了解Bean的类名、名称、依赖项、属性、生命周期及作用域等信息。为此,Spring IOC提供了一系列配置项,用于Bean在IOC容器中的定义。


读者留言
最新
推荐
用手机学习课程

手机、电脑同步学

用浏览器扫描二维码,即可下载APP。

郎宏林
授课老师
授课老师简介
项目经理,系统分析和架构师,从事多年中文信息处理技术。熟悉项目管理、擅长项目需求分析和设计、精通Java、C#、Python等编程语言。
  • 备案号:鲁ICP备15001146号
  • @1997-2018 潍坊米粒花网络技术有限公司版权所有