一、Bean的作用域

Spring在初始化一个Bean实例时,可以同时为其指定特定的作用域。作用域将会对Bean的生命周期和创建方式产生影响。

Bean的作用域类型:

Singleton作用域是Spring容器默认的作用域,当一个Bean的作用域为Singleton时,Spring容器中只会存在一个共享的Bean实例。并且对于所有的Bean请求,只要id与该bean定义的ID属性值相匹配,就会返回bean的同一个实例。单例模式对于无会话状态的Bean,如Dao、Service,是理想的选择。

spring默认就是Singleton模式。

我们查看Spring的配置文件,里面定义了bean id和对应的class实现类,同时指定了scope。

接下来在包中创建一个名为Hello的类,里面不写任何方法(默认会创建一个无参构造函数)。

接下来写一个测试类,里面两次获取bean对象并打印,如下所示:

运行测试类,查看输出结果,得到的对象名称相同,说明Spring容器只创建一个Hello类的实例。其实,不写scope=singleton,默认也只创建一个实例,这是Spring的默认配置。

对于想保持会话状态的bean,应该使用prototype作用域。在这种模式下,Spring会为每个对该Bean的请求都创建一个实例。

我们将上面实例中的scope修改成prototype,再看输出,会发现两次打印的不同,说明创建了两个不同的Bean实例。

二、Bean的生命周期

Sping对singleton和prototype的生命周期管理是不一样的。

对singleton作用域下的bean生命周期,进行全生命周期管理。

对于prototype作用域下的bean生命周期管理,只负责创建。创建后,Spring容器将不再跟踪其生命周期。

Bean的生命周期管理如下所示:

上图一共展现了12步,解释如下所示:

三、Bean的装配方式(依赖注入方式)

Bean的装配方式有三种:

  • 1.基于XML的装配

  • 2.基于Annotation方式

  • 3.自动装配

1.基于XML的装配

在XML的装配模式下,又分为:

1.1 设值注入(Setter Injection),Bean必须满足:

  • Bean类必须提供一个默认的构造方法

  • Bean类必须为需要注入的属性提供对应的setter方法。

1.2 构造注入(Constructor Injection)

在Spring的配置文件中,使用元素的子元素元素为每个属性注入值。

在真实的使用中,1.1和1.2往往结合使用。

为了方便理解,我们看一段代码。

如下图所示,我们创建了一个User类,里面包含了Username和Password的设置值和获取值的方法:

下图中,定义了一个有参构造方法,传入的参数是username和password。

下图中@Override后面的代码,作用是当测试类调用User类时,打印username和password的内容:

接下来,我们再看一下Spring的配置文件:bean5.xml。我们看到包含两部分内容:

第一部分是通过构造方式装配user实例,同时进行了赋值,bean id是user1

第二部分是使用Set方式装配user实例,这段也进行了赋值,但我们看到和第一部分内容不同,bean id是user2:

书写一个测试类。我们看到测试类先通过应用上下文加载xml文件,然后获取user1和user2的实例,并进行打印:

2.基于Annotation的装配

Spring可以使用XML实现Bean的装配工作,但如果bean太多,XML文件就会比较臃肿。JDK1.5开始,提供了annotation功能,Spring也全面支持。常见的注解如下:

接下来我们看代码:

首先创建一个接口,名为UserDao

接下来创建一个接口实现类,名为UserDaoImpl。

我们看到上图中第三行有@Repositiory(“userDao”),这是将UserDaoImpl这个类标示为Spring中的Bean,这行代码的作用,相当于在XML中这样写:

接下来,创建一个名为UserService的接口:

接下来,创建UserService的接口的实现类:UserServiceImpl。

下图中第4行相当于XML中:

<bean id="userService" class="cn.itcast.annotation.UserServiceImpl"/>

下图中第6行相当于配置文件中:

类的最后,调用了userDao中的save()方法。

接下来,创建UserAction类。

下图第四行使用@Controler注解标注UserAction类相当于XML中:

serAction" class="cn.itcast.annotation.UserAction"/

下图第六行相当于:

userService"/>。

【ref的作用是:property、contructor-arg等元素的子元素,该元素中的bean属性用于指定Bean工厂中某个Bean实例的引用】

最后调用了userService的save()方法:

接下来,创建beans6.xml.

配置文件的作用是启动compont scan,并且是在cn.itcast.annotation目录下扫描(我们之前创建的几个bean都在这个目录下):

接下来,创建测试类:

我们看到测试类会先加载beans6.xml。

第15行获取UserAction的实例:userAction。

上图第18行是输出userAction的实例;

上图第19行是调用userAction中的save()方法---->调用userservice中的save()方法--->调用userdao中的save()方法--->打印:"userdao...save..."

然后,每个类还有自己的打印内容,因此最终的打印内容是:

3.自动装配

自动装配是:将一个Bean注入到其他Bean的Property中。这需要使用到元素的autowire属性,它的五个值是:

我们基于上一小节是示例,改造配置文件:

上图中即通过autowire="byName"的字段,实现通过bean id名自动装配。

使用这种方式后,实际上面UserServiceImpl、UserAction两个类中的源码中,实现ref部分的代码就可以删除了,如:

参考文献:

《SSH框架整合实战教程》-清华大学出版社

spring bean作用域_Srping中Bean的三种装配方式:大魏Java记10相关推荐

  1. java定义数组_java中数组的三种定义方式_java中数组的定义及使用方法(推荐)...

    java中数组的三种定义方式 java中,数组是一种很常用的工具,今天我们来说说数组怎么定义 [java] view plain copy /** * 数组的三种定义方法 * 1.数组类型[] 数组名 ...

  2. Spring Boot 启动执行某个方法的三种实现方式

    Spring Boot 启动执行某个方法的三种实现方式 Spring Boot 启动执行某个方法的三种实现方式 第一种方式 @PostConstruct 注解解释 具体实现 第二种方式 Applica ...

  3. java中map的遍历方法_Java中Map的三种遍历方式

    集合中的三种遍历方式,如下代码: import java.util.Collection; import java.util.HashMap; import java.util.Iterator; i ...

  4. verilog中状态机的三种编码方式的比较(二进制码、独热码、格雷码)

    最近做了一个小项目,是关于状态机中三种编码方式的比较,总结了一下三种编码方式的不同,可以会在以后IC笔试面试过程中用到,简单记录一下三种编码方式的优缺点. 三种编码方式如下图所示:其中独热码只有一位为 ...

  5. selenium中三大切换 三种等待方式

    前言 ui自动化测试,就是通过代码模拟手工操作,通过点击.拖拽.输入等方式,进行浏览器页面的操作,我们常用的web自动化测试工具,是selenium:同时在我们日常操作中,由于需要创建链接,加载页面, ...

  6. groupadd r mysql_MySQL三种安装方式大揭秘

    此文章主要向大家讲述的是MySQL三种安装方式,及RPM 二进制包与源代码,我们本次安装的相关系统平台为redhat 5,以下就是文章的主要内容的详细描述,望大家在浏览之后会对其有更深的了解. MyS ...

  7. spring的@Scheduled 定时任务没反应(三种配置方式)

    第一种,很麻烦 配置文件 <!--扫描所在包--><context:component-scan base-package="com.xxx.schedule"/ ...

  8. Android中Video的三种播放方式的实现

     在Android中,我们有三种方式来实现视频的播放. 1.使用其自带的播放器.指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型. 2.使用VideoView来 ...

  9. 学习笔记 --- 编码过程中常见的三种异步方式

    实际的编码过程中, 凡是涉及到网络通信的代码, 异步都是决不可缺少的. 那么什么是异步呢? 异步就是子线程, 异步通过开辟子线程来实现, 所以一提到异步就应该想到子线程. 即使不涉及网络通信, 异步也 ...

最新文章

  1. win7完美兼容DynamipsGUI(小凡模拟器)攻略
  2. 人工智能实战_第七次作业_杨佳宁(2)
  3. 牛客16654 谁拿了最多奖学金
  4. SQLAlchemy基本使用(Flask中)
  5. 快慢指针算法及其应用
  6. 错误码应该如何设计?
  7. IT基础知识(精华版二)
  8. 用计算机软件绘制思维导图,电脑软件绘制思维导图操作教程分享
  9. 5个免费、优质视频素材网站,可商用
  10. 华硕x450jn拆机_自己动手丨 轻松搞定华硕X450JN笔记本 内存扩展
  11. wifi破解神器殃及池鱼后
  12. 爪哇国新游记之三十二----邮件发送
  13. 4、编写程序,根据用户输入的数字转换成相应的中文的大写数字。例如,1.23转换为“壹点贰叁”。
  14. srs linux开机启动,SRS之安装与使用
  15. 基于ADC电压采集的锂电池电量显示方法
  16. Photoshop插件-保存-8位通道-16位通道-脚本开发-PS插件
  17. 《扫黑风暴》全网爆火!用Python具体分析一下它怎么火起来的?
  18. 看《奇迹.笨小孩》有感
  19. SQL Server DATEADD()实例讲解
  20. 【Java-IO】File、搜索删除剪切、字符集、字符编码、字节流、将内存中的数据写入文件、字符流、缓冲流、Scanner、格式化输出、数据流、对象流、序列化与反序列化、Files工具类

热门文章

  1. Struts2+Spring2框架开发的菜鸟绝对能看得懂的用户登录程序 (2)
  2. SDK用DIAPI连接SBO的实现
  3. 51CTO,什么情况?
  4. 6种编写程序代码的方法
  5. Linux set命令参数及与env, export的区别
  6. 无法连接共享打印机处理办法
  7. php socket非阻塞,php stream_set_blocking设置非阻塞模式,php stream_set_blocking影响函数fgets()和fread()...
  8. 后端根据百度地图真实路径距离_远场语音识别错误率降低30%,百度提基于复数CNN网络的新技术...
  9. 协方差矩阵的概念,算法以及自己的一些理解
  10. Linux下LCD自动关闭解决方法,一般就自动十分钟黑屏的原因