这篇文章来自我的博客
正文之前
终于开始学 Spring 了,接触到的第一个内容就是 Bean,所以想要用两篇文章来总结一下自己所学的
第一篇有两个内容:
- JavaBean 的概念
- Spring 装配 Bean
正文
1. JavaBean 的概念
JavaBean 是什么
这里的 Bean 当然不是直译过来的意思,关于Bean的定义,维基百科解释的很清楚了:
JavaBeans 是 Java 中一种特殊的类,可以将多个对象封装到一个对象(bean)中,特点是可序列化,提供无参构造器,提供 getter 方法和 setter 方法访问对象的属性。名称中的 "Bean" 是用于Java的可重用软件组件的惯用叫法
Bean的例子
- 创建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; }
}
- 使用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(依赖注入):
- 自动装配
- 使用 XML 装配
- 使用 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:
在其中创建用<bean></bean>元素创建一个叫做“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 的装配就说到这里了,下一篇文章中将会详细讲述这三种方式的细节