这里的 Bean 当然不是直译过来的意思,关于Bean的定义,维基百科解释的很清楚了:
JavaBeans是 Java 中一种特殊的类,可以将多个对象封装到一个对象(bean)中,特点是可序列化,提供无参构造器,提供 getter 方法和 setter 方法访问对象的属性。名称中的 "Bean" 是用于Java的可重用软件组件的惯用叫法
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; } }
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自动进行垃圾回收
在 Spring 中,我们对 Bean 进行配置并加以使用,来得到我们需要的结果
在上述的例子中,如果我们要创建一个 Bean,我们就要使用关键字 New ,但是,在 Spring 中,Bean 的创建是由 Spring 容器进行的,也就是说,在 Spring 中使用 Bean 的时候,不是由关键字 New 来创建实例了
今天主要说说 Spring 中单个 Bean 的装配,只有一个 Bean,下一篇文章会讲述 DI(依赖注入):
引用《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
针对测试文件中的内容一步一步来:
能够看到控制台输出了 Student 类中的语句,证明装配成功
这一篇文章讲述的只是简单的装配,所以有很多有关依赖注入的方式都将跳过,由下一篇文章来讲
所以这里只演示在 XML 文件中创建一个 Bean 并进行装配
首先我们新建一个配置文件 spring-bean.xml:
在其中创建用元素创建一个叫做“student”的 Bean,class属性用来指定 Bean 的类型
然后我们修改测试文件中的上下文的配置信息:
我们将 @ContextConfiguration 注解的值改为了配置 Bean 的文件
输出结果:
证明装配成功
在《Spring实战》中大力推崇使用 Java 作为装配,可能是我不太习惯,之前都是把配置信息写在 XML 文件里,不过这里还是要说一下:
我们将创建一个类,作为存放配置信息的类,先加上 @Configuration ,说明这是一个配置类:
接下来,我们要在配置类中使用一个注解: @Bean :
我们在配置类中写一个方法,这个方法能够创建所需要的实例并将其返回,并将 @Bean 添加至这个方法,这个方法的名称是作为 Bean 默认的名称:
然后我们要修改测试类,将配置上下文的文件改为 StudentConfig.class ,表明 Java 配置类的位置:
然后得出测试结果,证明装配成功:
关于刚才说到的方法的名称是作为 Bean 默认的名称,这里做个测试:
先修改配置类中的方法名,加一个字符“s”:
然后修改测试类,在这个测试中,我们没有创建实例,只是测试一下看看能不能在上下文中发现这个 Bean :
测试后,抛出 NoSuchBeanDefinitionException ,表示没有发现名叫“student”的 Bean
如果我把刚才修改的方法名改回来,就会通过测试:
关于最基础的 Bean 的装配就说到这里了,下一篇文章中将会详细讲述这三种方式的细节