spring中的bean
环境准备
- Eclipse上新建一个简单的maven工程,Artifact Id选择maven-archetype-quickstart;
- 添加spring-context依赖;
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.16.RELEASE</version>
</dependency>
- resources目录下添加spring的配置文件spring.xml;
- 开始编写bean及测试代码;
Bean的创建方式
默认构造方法创建bean
首先,写一个杂技师类;
package cn.edu.hdu.sia.chapter2; public class Juggler implements Performer {
private int beanBags = 3; public Juggler() {
} public Juggler(int beanBags) {
this.beanBags = beanBags;
} public void perform() throws PerformanceException {
System.out.println("JUGGLING " + beanBags + " BEANBAGS");
}
}
在spring配置文件中声明该杂技师Bean(未配置<constructor-arg>,将使用默认构造方法);
<bean id="duke" class="cn.edu.hdu.sia.chapter2.Juggler">
</bean>
在main方法中使用该杂技师bean;
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
Performer performer = (Performer) ctx.getBean("duke");
performer.perform();
}
非默认构造方法创建bean
构造方法参数为基本数据类型的情况
接着上例的例子,可以在配置bean的时候,往构造方法传入参数,如下配置,将调用public Juggler(int beanBags)构造方法创建杂技师bean;
<bean id="duke" class="cn.edu.hdu.sia.chapter2.Juggler">
<constructor-arg value="15" />
</bean>
构造方法参数为对象引用类型的情况
现在,我们将要给杂技师增加吟诗行为;
先定义一个诗歌背诵接口:
package cn.edu.hdu.sia.chapter2; public interface Poem {
public void recite();
}
再写一个吟诗实现类:
package cn.edu.hdu.sia.chapter2; public class JingYeSi implements Poem{ public void recite() {
System.out.println("床前明月光~");
} }
然后编写吟诗杂耍类:
package cn.edu.hdu.sia.chapter2; public class PoeticJuggler extends Juggler { private Poem poem; public PoeticJuggler(int beanBags, Poem poem) {
super(beanBags);
this.poem = poem;
} /**
* @see cn.edu.hdu.sia.chapter2.Juggler#perform()
* @throws PerformanceException
*/
@Override
public void perform() throws PerformanceException {
super.perform();
poem.recite();
}
}
在spring配置文件中声明该杂技师Bean,注意构造方法的第二个参数为对象引用,引用id为“jingyesi”的bean;
可以用index属性指定构造方法参数索引下标,type指定构造方法参数类型,name指定构造方法参数名,用于区分不同的参数;
<bean id="jingyesi" class="cn.edu.hdu.sia.chapter2.JingYeSi">
</bean> <bean id="poeticDuke" class="cn.edu.hdu.sia.chapter2.PoeticJuggler">
<constructor-arg value="15" />
<constructor-arg ref="jingyesi" />
</bean>
最后参考前面写的main方法测试perform的执行情况,发现该杂技师Bean不仅能杂耍,还能吟诗;
工厂方法创建bean
当构造方法为私有的时候,是不能够通过构造方法创建bean的,这时候一般通过工厂方法创建,如下为一个典型的单例类,其构造方法为私有属性:
package cn.edu.hdu.sia.chapter2; public class Stage { private Stage() {
} private static class StageSingletonHolder {
static Stage stage = new Stage();
} public static Stage getInstance() {
return StageSingletonHolder.stage;
} public void printDescription(){
System.out.println("this is a stage.");
}
}
要创建该bean,需要在spring配置文件中做如下配置:
可以用factory-bean属性设置指定的工厂bean,用<constructor-arg>标签往factory-method传入参数;
<bean id="theStage" class="cn.edu.hdu.sia.chapter2.Stage" factory-method="getInstance" />
bean的作用域
所有的bean在spring上下文范围内默认都是“单例”的,即只有一个实例,注意,这里的单例指的是spring上下文范围内的单例;要修改该配置项,只需要配置scope属性,scope默认是singleton,可配置的属性值如下列表:
作用域 |
定义 |
singleton |
在每一个Spring容器中,一个Bean定义只有一个对象实例(默认) |
prototype |
运行Bean的定义可以被实例化任意次(每次调用都创建一个实例) |
request |
在一次HTTP请求中,每个Bean定义对应一个实例,该作用域仅在基于Web的Spring上下文(例如Spring MVC)中才有效 |
session |
在一个HTTP Session中,每个Bean定义对应一个实例,该作用域仅在基于Web的Spring上下文(例如Spring MVC)中才有效 |
global-session |
在一个全局HTTP Session中,每个Bean定义对应一个实例,该作用域仅在Portlet上下文中才有效 |
bean的初始化和销毁
bean的初始化指bean对象创建后执行的一些操作,如初始化等;
bean的销毁指bean从spring上下文移除时执行的一些操作,如清理,释放资源等;
可以对bean配置init-method和destroy-method属性,指定其初始化方法和销毁方法,如下配置:
<bean id="theStage" class="cn.edu.hdu.sia.chapter2.Stage" factory-method="getInstance"
init-method="init" destroy-method="destroy"/>
其中init和destroy为该bean中自定义的方法,可在里面添加一些初始化和销毁操作;
另外,我们还可以通过实现InitializingBean和DisposableBean接口来完成bean的初始化和销毁操作,具体需要实现以下两个方法即可:
/**
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
* @throws Exception
*/
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
} /**
* @see org.springframework.beans.factory.DisposableBean#destroy()
* @throws Exception
*/
public void destroy() throws Exception {
// TODO Auto-generated method stub
}
实现这些接口的缺点是bean与spring api产生了耦合,因此还是推荐使用配置init-method和destroy-method属性实现初始化和销毁;
额外说下,在非web应用程序中,关闭spring上下文可以通过调用close方法或registerShutdownHook方法,区别如下:
close:立刻关闭spring上下文(容器);
registerShutdownHook:等到JVM关闭的时候再关闭spring上下文(容器);
如下代码段示例,bean的销毁方法不会马上执行,而是在JVM销毁后才执行:
public static void main(String[] args) {
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
Stage stage = (Stage) ctx.getBean("theStage");
stage.printDescription();
ctx.registerShutdownHook(); try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} System.out.println("start JVM desdroy.");
}
配置bean的属性
bean属性为基本数据类型情况(bean中需要有setter方法)
<bean id="peter" class="cn.edu.hdu.sia.chapter2.User">
<property name="name" value="Peter"></property>
<property name="age" value="22"></property>
</bean>
bean属性为对象引用的情况
属性bean通过外部注入
<bean id="jingyesi" class="cn.edu.hdu.sia.chapter2.JingYeSi"></bean> <bean id="peter" class="cn.edu.hdu.sia.chapter2.User">
<property name="name" value="Peter"></property>
<property name="age" value="22"></property>
<property name="poem" ref="jingyesi"></property>
</bean>
属性bean通过内部注入,同样适用于构造方法的入参<constructor-arg>,注意:外部其它bean不能引用内部bean
<bean id="peter" class="cn.edu.hdu.sia.chapter2.User">
<property name="name" value="Peter"></property>
<property name="age" value="22"></property>
<property name="poem">
<bean class="cn.edu.hdu.sia.chapter2.JingYeSi"/>
</property>
</bean>
另外,还可以使用spring的p命名空间来配置属性:
<bean id="peter" class="cn.edu.hdu.sia.chapter2.User" p:name="Peter" p:age="22" />
bean属性为集合的情况
可使用如下四种配置
集合元素 |
用途 |
对应实际数据类型 |
<list> |
装配list类型的值,允许重复 |
数组或java.util.Collection |
<set> |
装配set类型的值,不允许重复 |
|
<map> |
装配map类型的值,名称和值可以是任意类型 |
java.util.Map |
<props> |
装配properties类型的值,名称和值必须都是String型 |
java.util.Properties |
List、Set、Array
这里的list也可以用set替换,区别仅仅是允不允许重复
<bean id="jingyesi" class="cn.edu.hdu.sia.chapter2.JingYeSi"></bean>
<bean id="xinglunan" class="cn.edu.hdu.sia.chapter2.XingLuNan"></bean> <bean id="peter" class="cn.edu.hdu.sia.chapter2.User">
<property name="name" value="Peter"></property>
<property name="age" value="22"></property>
<property name="poemList">
<list>
<ref bean="jingyesi" />
<ref bean="xinglunan" />
</list>
</property>
</bean>
map
<bean id="jingyesi" class="cn.edu.hdu.sia.chapter2.JingYeSi"></bean>
<bean id="xinglunan" class="cn.edu.hdu.sia.chapter2.XingLuNan"></bean> <bean id="peter" class="cn.edu.hdu.sia.chapter2.User">
<property name="name" value="Peter"></property>
<property name="age" value="22"></property>
<property name="poemMap">
<map>
<entry key="jingyesi" value-ref="jingyesi"/>
<entry key="xinglunan" value-ref="xinglunan"/>
</map>
</property>
</bean>
Properties
<bean id="peter" class="cn.edu.hdu.sia.chapter2.User">
<property name="name" value="Peter"></property>
<property name="age" value="22"></property>
<property name="properties">
<props>
<prop key="test1">111</prop>
<prop key="test2">222</prop>
</props>
</property>
</bean>
bean属性值设为null情况
<bean id="peter" class="cn.edu.hdu.sia.chapter2.User">
<property name="name" value="Peter"></property>
<property name="age" value="22"></property>
<property name="properties">
<null/>
</property>
</bean>
demo代码下载
http://files.cnblogs.com/files/chenpi/sia.7z
spring中的bean的更多相关文章
- JSP访问Spring中的bean
JSP访问Spring中的bean <%@page import="com.sai.comment.po.TSdComment"%> <%@page import ...
- 传统javabean与spring中的bean的区别
javabean已经没人用了 springbean可以说是javabean的发展, 但已经完全不是一回事儿了 用处不同:传统javabean更多地作为值传递参数,而spring中的bean用处几乎无处 ...
- 1.2(Spring学习笔记)Spring中的Bean
一.<Bean>的属性及子元素 在1.1中我们对<Bean>有了初步的认识,了解了一些基本用法. 现在我们进一步理解<Bean>属性及子元素. 我们先来看下< ...
- spring扩展点之二:spring中关于bean初始化、销毁等使用汇总,ApplicationContextAware将ApplicationContext注入
<spring扩展点之二:spring中关于bean初始化.销毁等使用汇总,ApplicationContextAware将ApplicationContext注入> <spring ...
- 第2章 Spring中的Bean
2.1 Bean的配置 Bean本质是Java中的类.Spring可以被看做一个大型工厂,这个工厂的作用就是生产和管理Spring容器zho中的Bean.想在项目中使用这个工厂,就需要对Spring的 ...
- spring 中的 bean 是线程安全的吗?
spring 中的 bean 是线程安全的吗? Spring 不保证 bean 的线程安全. 默认 spring 容器中的 bean 是单例的.当单例中存在竞态条件,即有线程安全问题.如下面的例子 计 ...
- Spring 中的bean 是线程安全的吗?
结论: 不是线程安全的 Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体sco ...
- spring(四):spring中给bean的属性赋值
spring中给bean的属性赋值 xml文件properties标签设置 <bean id="student" class="com.enjoy.study.ca ...
- Spring中与bean有关的生命周期
前言 记得以前的时候,每次提起Spring中的bean相关的生命周期时,内心都无比的恐惧,因为好像有很多,自己又理不清楚,然后看网上的帖子,好像都是那么一套,什么beanFactory啊,aware接 ...
- 【Spring】Spring中的Bean - 5、Bean的装配方式(XML、注解(Annotation)、自动装配)
Bean的装配方式 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 文章目录 Bean的装配方式 基于XML的装配 基于注解 ...
随机推荐
- (二)NetHelper
[转]http://blog.csdn.net/dingxiaowei2013/article/details/8113454 using System; using System.Text; usi ...
- 介绍开源的.net通信框架NetworkComms框架 源码分析(五)ReservedPacketType
原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ...
- Hack语言特性之类型化
Hack最基础的特性就是类型标注.PHP5已经开始支持对象的类型化,PHP7也提供了标量类型化声明.Hack提供了全面的类型标注支持,与其typecher配合使用,还可以实现快速.前置静态类型验证. ...
- java Servlet(续)
一.web.xml配置 由于需用户需要通过URL访问架设好的Servlet,所以我们必须将servlet映射到一个URL地址上, 比如上面的配置文件我们就可以通过:http://localhost:8 ...
- <welcome-file-list>标签的控制作用以及在springmvc中此标签的的配置方式
我们在写安全性较高的网站时必然会对网站的入口进行限制, 而在这其中其关键作用的就是网站的根目录下WEB-INF中的web.xml中<welcome-file-list> <welc ...
- SDL制作拼图游戏
看完教程第三集后,好像自己能用这个来写一个简单的拼图游戏,第一次写出个带界面的游戏,好有成就感. 图片是自己慢慢截左上部分8个脸. #include <stdio.h> #include ...
- MySQL 运行环境建议规范
一.操作系统环境 操作系统版本选择 CentOS/RHRL/ORACLE Linux 5.x/6.x x86_64 发行版 建议磁盘分区规则 MySQL 运行环境建议规范 挂载点 大小 分区类型 分区 ...
- ios svn无法连接xp或者win7系统svn的解决方法
找到服务器svn的安装目录,或者直接查找httpd.conf,找到端口号,复制到ios系统的svn端口号,就ok了,如图 这是其他人的解决方法 Subversion有两种不同的配置方式,一种基于它自带 ...
- jQuery构造函数init参数分析(二)
接着上一篇随笔讨论. 如果selector是其他字符串情况就比较多了比较复杂了 // Handle HTML strings if ( typeof selector === "string ...
- 使用Reaver对WPS加密网络进行暴力破解
WPS状态探测 探测开启了WPS功能的AP,WPS Locked状态为NO的表示开启了WPS功能. wash -i wlan0mon PIN码获取 reaver -i wlan0mon -b MAC地 ...