今天我来学习学习Spring中Bean。
在Spring中原来还有标签啊,它相当于标签的老爸,老爸可以有很多个儿子,但是老爸只有一个哦。
也就是说一个标签内可以有多个标签,每个标签代表一个java实例。
定义时,需要注意两个属性,一个是id,一个是class。
id是标签的唯一标示符,容器对其的访问、管理、注入都通过这个属性来完成,所以它也是唯一的。
class呢,是该bean的具体实现类,因为Spring要通过class来完成对bean的实例化,所以其必须是完整的类名,不能是接口哦!
还可以用name属性为其增加一个别名。
当Spring创建一个bean实例时,还为其指定了特定的作用域:
singleton:单例模式,使用singleton定义的bean只有一个实例。
prototype:原型模式,每次通过容器的getbean方法去调用prototype定义的bean时,都会创建一个实例。
request:每次http请求都会产生一个bean实例。
seesion:与request相似,每次http session请求时,都会产生一个bean实例。
global session:(这个不太懂啊)每个全局的http session对应一个bean实例。
不指定作用域时,默认为singleton模式。
举个例子:
session和request作用域的范围很相似,不同的是session指每次Http Session请求都会有效,而request则是每次Http请求都有效。
为此,我们需要有两种配置方式:采用Listener或者Filter配置。
当使用Servlet2.4以上规范的Web容器时,可在Web容器下的web.xml文件中增加如下配置,该Listerner负责为request作用域负责:
1
2 ...3
4 org.springframework.web.context.request.RequestContextListener
5
6 ...7
当使用2.4以下规范的就不能用这个配置了,只能改为Filter配置:
1
2 ...3
4 requestContextFilter
5 org.springframework.web.filter.RequestContextFilter
6
7 requestContextFilter
8 /*
9
10
11 ...12
一旦配置上面二者之一,就可以在Spring配置文件中使用request和session作用域了。
如果需要为Bean属性值是容器中另一个bean实例,需要使用元素,使用该元素会有两个属性:
bean:引用不在同一个XML文件中的另一个bean实例的id属性值。
local:引用在同一个XML文件中其他bean实例的id属性值。举一个例子:
1
2
3
4
5
6
7
它还有一种简洁的写法:
1
2
3
4
此处简洁了ref元素,将它并入了property的属性中,当然这么写也就不区分ref元素中的local和bean属性了。
此外,如果bean的属性值是个集合的话,则需要使用集合元素,、、和分别用来设置类型为List、Set、Map和Properties的集合属性值。
下面我们来改造一个之前写的com/sep/basic/service/impl/Lenovo类,将其中包含多个集合属性。
1 packagecom.sep.basic.service.impl;2
3 importjava.util.List;4 importjava.util.Map;5 importjava.util.Properties;6 importjava.util.Set;7
8 importcom.sep.basic.service.Computer;9 importcom.sep.basic.service.Key;10
11 public class Lenovo implementsComputer{12 //下面是集合属性
13 private Listsize;14 privateSet price;15 private Mapkey;16 privateProperties health;17 //private Key key;18
19 //各属性的setter方法
20 public void setSize(Listsize) {21 this.size =size;22 }23
24
25 public voidsetPrice(Set price) {26 this.price =price;27 }28
29
30 public void setKey(Mapkey) {31 this.key =key;32 }33
34
35 public voidsetHealth(Properties health) {36 this.health =health;37 }38
39 @Override40 public voiduseKey() {41 System.out.println(size);42 System.out.println(price);43 System.out.println(key);44 System.out.println(health);45 }46
47 }
下面来看一下我们的applicationContext.xml的配置代码:
1 <?xml version="1.0" encoding="UTF-8"?>
2
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xmlns:p="http://www.springframework.org/schema/p"
6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
7
8
9
10
11
12
13 17'
14 21'
15 30'
16
17
18
19
20
21
22 普通的字符串
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 正常
48 正常
49
50
51
52
53
54
55
这样我们就成功地将所有集合属性赋值了。