初识Spring —— Bean的装配(一)

7,813 阅读5分钟

这篇文章来自我的博客

正文之前

终于开始学 Spring 了,接触到的第一个内容就是 Bean,所以想要用两篇文章来总结一下自己所学的

第一篇有两个内容:

  1. JavaBean 的概念
  2. Spring 装配 Bean

正文

1. JavaBean 的概念

JavaBean 是什么

这里的 Bean 当然不是直译过来的意思,关于Bean的定义,维基百科解释的很清楚了:

JavaBeans 是 Java 中一种特殊的类,可以将多个对象封装到一个对象(bean)中,特点是可序列化,提供无参构造器,提供 getter 方法和 setter 方法访问对象的属性。名称中的 "Bean" 是用于Java的可重用软件组件的惯用叫法

Bean的例子
  1. 创建Bean类
import java.io.Serializable;

public class UserBean implements Serializable {
    //变量声明为私有
    private String play;
    private Boolean isUser;

    //无参构造器
    public UserBean(){}

    //常规 set、get操作
    public void setPlay(String play) { this.play = play; }
    
    public String getPlay() { return play; }
    
    public void setUser(Boolean user) { isUser = user; }

    //布尔类型的 getter 采用了不同的名称,用 is 更加能表示类型
    public Boolean isUser() { return isUser; }
}

  1. 使用Bean类
public class UserBeanTest {
    public static void main(String[] args){
        //实例化
        UserBean userBean = new UserBean();
        userBean.setPlay("I want to play");
        userBean.setUser(true);

        //如果是用户,就打印语句
        if(userBean.isUser()){
            System.out.println(userBean.getPlay());
        }
    }
}

引用《Spring实战》(Spring in action) 中的一句话:

在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean实例化,然后该bean就可以使用了。一旦该bean不再被使用,则由Java自动进行垃圾回收

2. Spring 中的 Bean

在 Spring 中,我们对 Bean 进行配置并加以使用,来得到我们需要的结果

在上述的例子中,如果我们要创建一个 Bean,我们就要使用关键字 New,但是,在 Spring 中,Bean 的创建是由 Spring 容器进行的,也就是说,在 Spring 中使用 Bean 的时候,不是由关键字 New 来创建实例了

今天主要说说 Spring 中单个 Bean 的装配,只有一个 Bean,下一篇文章会讲述 DI(依赖注入):

  1. 自动装配
  2. 使用 XML 装配
  3. 使用 Java 装配
1. 自动装配

引用《Spring实战》中的一句话:尽管你会发现这些显示装配技术非常有用,但是在便利性方面,最强大的还是 Spring 的自动化配置

我们用一个 Demo 来做解释,首先创建两个类:Student 类和 StudentTest 类,以及一个配置文件 spring-config.xml:

我们要先编写配置文件,使其启用组件扫描,来发现带有注解 @Component 注解的类,因为我之前由写过关于 Spring MVC 的 demo,所以有关 @Component@Service@Controller 的区别做一个小小的解释(个人理解):

@Component 泛指组件类,就是在自身定位不明确的时候使用,比如我们这个Demo @Service 表明这是业务层的组件 @Controller 表明这是控制层的组件 在业务层和控制层也可以用 @Component,但是这会导致代码不易读

回到配置文件:

这一行:

<context:component-scan base-package="bean"/>

指示了 Spring 要扫描的组件所处于的位置(包名),如果不设定 base-package,则扫描配置文件所处于的包

然后我们看一下 Student 类:

这里只是为了测试,所以极大程度地简化,只需要一句控制台输出语句

由于我们之前配置了组件扫描,所以点击旁边的标志,就能够跳转到我们添加了 @Component 注解的 Student 类

万事俱备,就差测试了,我们使用 Junit 来进行测试,需要导入两个 JAR:

junit-4.12.jar hamcrest-all-1.3.jar

针对测试文件中的内容一步一步来:

  • @RunWith:这个单元测试指定的执行类(目前还不是很了解)
  • @ContextConfiguration:配置文件的位置,因为我是用 XML 文件进行配置,所以填写配置文件位置
  • @Autowired:自动装配 Bean,在这里可以看到没有使用 New 关键字,但是能够在运行时得到这个 Bean
  • @Test:运行测试的方法

能够看到控制台输出了 Student 类中的语句,证明装配成功

2. 使用 XML 装配

这一篇文章讲述的只是简单的装配,所以有很多有关依赖注入的方式都将跳过,由下一篇文章来讲

所以这里只演示在 XML 文件中创建一个 Bean 并进行装配

首先我们新建一个配置文件 spring-bean.xml:

在其中创建用元素创建一个叫做“student”的 Bean,class属性用来指定 Bean 的类型

然后我们修改测试文件中的上下文的配置信息:

我们将 @ContextConfiguration 注解的值改为了配置 Bean 的文件

输出结果:

证明装配成功

3. 使用 Java 装配

在《Spring实战》中大力推崇使用 Java 作为装配,可能是我不太习惯,之前都是把配置信息写在 XML 文件里,不过这里还是要说一下:

我们将创建一个类,作为存放配置信息的类,先加上 @Configuration,说明这是一个配置类:

接下来,我们要在配置类中使用一个注解:@Bean

我们在配置类中写一个方法,这个方法能够创建所需要的实例并将其返回,并将 @Bean 添加至这个方法,这个方法的名称是作为 Bean 默认的名称:

然后我们要修改测试类,将配置上下文的文件改为 StudentConfig.class,表明 Java 配置类的位置:

然后得出测试结果,证明装配成功:

关于刚才说到的方法的名称是作为 Bean 默认的名称,这里做个测试:

先修改配置类中的方法名,加一个字符“s”:

然后修改测试类,在这个测试中,我们没有创建实例,只是测试一下看看能不能在上下文中发现这个 Bean :

测试后,抛出 NoSuchBeanDefinitionException,表示没有发现名叫“student”的 Bean

如果我把刚才修改的方法名改回来,就会通过测试:

关于最基础的 Bean 的装配就说到这里了,下一篇文章中将会详细讲述这三种方式的细节