JavaEE开发之Spring中Bean的作用域、Init和Destroy方法以及Spring-EL表达式
上篇博客我们聊了《JavaEE开发之Spring中的依赖注入以及AOP》,本篇博客我们就来聊一下Spring框架中的Bean的作用域以及Bean的Init和Destroy方法,然后在聊一下Spring中的EL表达式。在Spring框架中我们可以使用@Scope注解来指定我们定义的Bean的作用域。下方会具体介绍几种参数的作用域。
在创建Bean时我们可以使用Java配置的方式,也就是@Bean注解的initMethod属性和destroyMethod属性来指定对应Bean的init()方法和destroy()方法。当然,除了Java配置的方式,我们还可以使用JSR-250的注解形式为相应的Bean来指定Init和Destroy方法。其中主要使用到了@PostContruct注解来指定构造器执行完就执行的方法,使用@PreDestroy注解来指定Bean对象销毁之前执行的方法。下方会具体给出相应的实现。
本篇博客我们还会聊一下Spring框架中的EL表达式,其实主要还是使用@Value注解。@Value注解可以给据其指定的参数以及所赋值的属性的类型来为相应的对象的属性进行赋值。我们可以使用@Value注解为属性赋常规值、URI资源、文件资源、系统属性、其他类对象的属性等。具体下方会给出相应的实现。
一、Bean的作用域
接下来我们将聊一下Bean的作用域。在使用@Repository、@Controller、@Service、@Component这些注解声明Bean时,我们可以使用@Scope来指定相关Bean的作用域。@Scope后边可以跟不同的参数,根据这些参数来设定Bean的作用域。@Scope可以跟下方的几个参数:
Singleton: 单例Bean,当我们需要将一个Bean的作用域声明为单例时,我们可以使用Singleton来将相应的类声明为单例。Bean默认的Scope就是单例形式的。
Prototype:与单例相反,每次通过上下文获取的都是一个新的对象。
Session:Web Project中使用,同一session会话中为同一个对象。
Request:Web Project中使用,每次HTTP请求都会新建一个Bean。
GlobalSession: 在portal应用中有用,给每个global http session新建一个Bean实例。
本篇博客不是基于Web Project的,所以我们只讨论Singleton和Prototype这两个作用域。首先我们创建一个Scope为Singleton的Service,如下所示。然后我们再创建一个Scope为Prototype的Service,当然只把下方的singleton换成prototype即可。
创建好相应的Bean后,接下来我们就可以在Main方法中进行测试了。下方就是我们的Main函数中的内容以及该Main函数所运行的输出结果。在Main函数中,我们分别从Spring的上下文中获取两个Singleton以及Prototype作用域对象。然后分别打印出每个对象的hashCode,从下方结果中我们可以看出,两个Singleton的对象的hashCode是相同的,这就说明这两个对象是一个对象。而Prototype的两个对象的hashCode是不同的,具体结果如下所示:
二、Bean的Init与Destroy
本节,我们要聊的是如何在Bean创建之后以及Bean销毁之前做一些事情。在Spring中,我们分别可以使用Java配置方式和注解方式来实现Bean的初始化以及销毁之前的操作。下方我们先使用@Bean的initMethod和destroyMethod来实现Bean的Init与Destroy方法。然后在使用JSR-250的@PostConstruct和@PreDestroy两个注解来实现。
1、Java配置实现Bean的Init与Destroy
该部分,我们将使用使用@Bean的initMethod和destroyMethod来实现Bean的Init与Destroy方法。首先我们创建一个BeanWayService类,然后在该类中创建一个init()方法和destroy()方法。稍后我们将在Java配置文件中对init()方法和destroy()方法指定特殊的用途。
紧接着我们就来创建相应的Java配置类,下方的Java配置类比较简单,就一个指定BeanWayService类的Bean方法。在使用@Bean注解时,我们使用了initMethod属性指定了BeanWayService的构造器执行后立即执行的方法,使用了destroyMethod属性指定了BeanWayService对象销毁之前所执行的方法。具体如下所示:
紧接着,我们就来看一下运行效果,下方就是我们的Main方法以及运行结果。从下方的输出结果我们不难看出,BeanWayService的构造器执行完毕后,就立即执行了我们在Java配置文件中指定的init()方法,而在context关闭时,也就是在BeanWayService对象销毁之前,调用了我们指定的destroy()方法。具体如下所示:
2、JSR-250的注解方式
下方就是通过JSR-250的注解方式来指定init()和destroy(),具体说使用@PostContruct注解来修饰构造器执行完后执行的init()方法,使用@PreDestroy注解来修改时对象销毁之前要调用的destroy()方法。具体代码如下所示。至于该部分的测试用例比较简单,在此就不做过多赘述了。
三、Spring的EL表达式@Value
在Spring框架中,我们可以使用Spring的EL表达式来快速的给Bean的属性设置值。下方我们将演示几种常用的Spring-EL表达式,包括给属性赋字符串、赋值系统属性、赋值其他类对象的属性、赋值文件中的文本信息、赋值网络URI中的资源等。下方会给出具体实现,其实还是主要是@Value注解的使用,@Value注解可以根据不同的参数值来进行解析,从而给不同类型的属性分配不同的值。
1、引入文件IO的工具类
首先我们在Maven的pom.xml文件中添加上common-io的依赖包,common-io可简化我们对文件的操作。在pom.xml中添加下方的依赖。
<!--简化文件操作-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.3</version>
</dependency>
2、创建提供属性值的测试Service
下方创建了一个AnotherValueService类,该类会在后面的实例中用到。我们将使用EL表达式将该类的anotherValue属性的值赋值给另一个类的属性。anotherValue的值由@Value注解提供,如下所示:
3、创建Spring-EL测试的Service
接下来我们就来看一下Spring-EL表达式的使用方式。下方创建的DemoELService类就是我们用来测试Spring-EL表达式的类。下方主要包括字符串的直接赋值、系统属性的赋值、其他对象属性值的赋值、资源文件的赋值、URI资源的赋值。具体如下所示。
4.对上述Service的测试
下方就是我们的测试Main函数,以及该测试用例的输出结果,如下所示:
本篇博客的内容也比较多了,就先到此,github源码分享链接:https://github.com/lizelu/SpringDemo
JavaEE开发之Spring中Bean的作用域、Init和Destroy方法以及Spring-EL表达式的更多相关文章
- JavaEE开发之SpringMVC中的自定义拦截器及异常处理
上篇博客我们聊了<JavaEE开发之SpringMVC中的路由配置及参数传递详解>,本篇博客我们就聊一下自定义拦截器的实现.以及使用ModelAndView对象将Controller的值加 ...
- JavaEE开发之SpringMVC中的静态资源映射及服务器推送技术
在上篇博客中,我们聊了<JavaEE开发之SpringMVC中的自定义拦截器及异常处理>.本篇博客我们继续的来聊SpringMVC的东西,下方我们将会聊到js.css这些静态文件的加载配置 ...
- JavaEE开发之SpringMVC中的自定义消息转换器与文件上传
上篇博客我们详细的聊了<JavaEE开发之SpringMVC中的静态资源映射及服务器推送技术>,本篇博客依然是JavaEE开发中的内容,我们就来聊一下SpringMVC中的自定义消息转发器 ...
- spring中bean的作用域属性singleton与prototype的区别
1.singleton 当一个bean的作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会 ...
- 详解Spring中Bean的作用域与生命周期
摘要:在利用Spring进行IOC配置时,关于bean的配置和使用一直都是比较重要的一部分,同时如何合理的使用和创建bean对象,也是小伙伴们在学习和使用Spring时需要注意的部分,所以这一篇文章我 ...
- Spring中Bean的作用域、生命周期
Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...
- Spring中bean的作用域与生命周期
在 Spring 中,那些组成应用程序的主体及由 Spring IOC 容器所管理的对象,被称之为 bean.简单地讲,bean 就是由 IOC 容器初始化.装配及管理的对象,除此之外,bean 就与 ...
- Spring核心技术(五)——Spring中Bean的作用域
前文概述了Spring的容器,Bean,以及依赖的一些信息,本文将描述一下Bean的作用域 Bean的作用域 当开发者定义Bean的时候,同时也会定义了该如何创建Bean实例.这些具体创建的过程是很重 ...
- Spring入门(五):Spring中bean的作用域
1. Spring中bean的多种作用域 在默认情况下,Spring应用上下文中所有的bean都是以单例(singleton)的形式创建的,即不管给定的一个bean被注入到其他bean多少次,每次所注 ...
随机推荐
- UI进阶 即时通讯之XMPP登录、注册
1.XMPP环境搭建 http://www.cnblogs.com/fearlessyyp/p/5506644.html 第一次打开可能会有点儿慢,图片很多,步骤很详细,祝搭建成功. 2.工程中添加X ...
- java异常的一些小知识
异常,我们软件都需要面对的一个问题.如何让你的软件更加健壮呢?这是一个值得我们考虑的问题.这里主要为大家介绍一下异常是什么,异常是如何产生的,如何将异常抛出,如何捕获异常,对于异常应该如何处理的个人一 ...
- Python学习--21 电子邮件
发送邮件 SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责 ...
- ubuntu通过虚拟域名访问不了 502 / 网络错误
##之前把虚拟机的lamp环境搭建好,但是通过自己windows在浏览器访问一直不能正常运行. 简单说明一下我的相关设置: 1.设置windows的ip映射 C:\Windows\System32\d ...
- 游戏UI框架设计(三) : 窗体的层级管理
游戏UI框架设计(三) ---窗体的层级管理 UI框架中UI窗体的"层级管理",最核心的问题是如何进行窗体的显示管理.窗体(预设)的显示我们前面定义了三种类型: 普通.隐藏其他.反 ...
- C++之priority_queue
前言 最近越来越觉得自己总结的事情越来越流水账,因此,我需要提高我总结内容的精度.所以可能会导致写博客的时间会延长一些. 之前从没用过优先队列,刷算法题目的时候才开始了解的,所以做个总结.什么情况下使 ...
- 【转】SQLState详解
根据 X/Open 和 SQL Access Group SQL CAE 规范 (1992) 所进行的定义,SQLERROR 返回 SQLSTATE 值.SQLSTATE 值是包含五个字符的字符串 . ...
- Servlet支持上传多张图片
首先前端的表单是这个形式: <form target="_self" method="post" action="fileUploadMult ...
- 简单说说NoHTTP
学习NoHttp的原因是由于公司之前做的产品使用的网络请求框架一直都是Volley(为什么使用Volley就不用多说了,最起码是谷歌开发团队自己搞的,总感觉权威一些),可是自从android6.0推出 ...
- Android HelloChart Demo
这几天,要做一个图标的统计,自己去网上查了下,现在用的比较多的有三种,AChartEngine 是Google的一个开源图表库 这种我最开始就去导demo去了解他,不过里面是是英文,不好研究.我就放弃 ...