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

这篇文章来自我的博客

正文之前

终于开始学 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:

在其中创建用<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 的装配就说到这里了,下一篇文章中将会详细讲述这三种方式的细节

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,748评论 6 342
  • 1.1 spring IoC容器和beans的简介 Spring 框架的最核心基础的功能是IoC(控制反转)容器,...
    simoscode阅读 6,701评论 2 22
  • 本章内容: 声明Bean 构造器注入和Setter方法注入 装配Bean 控制bean的创建和销毁 任何一个成功的...
    谢随安阅读 1,628评论 0 9
  • 2017年11 月24日 星期五 晴 今天偶遇老同学,接完孩子后请老同学一起吃饭。 欣美西餐厅有孩子的活动区域...
    皇城山茶业阿娟阅读 112评论 0 0