今天我来学习学习Spring中Bean。

  在Spring中原来还有<beans.../>标签啊,它相当于<bean.../>标签的老爸,老爸可以有很多个儿子,但是老爸只有一个哦。

  也就是说一个<beans.../>标签内可以有多个<bean...>标签,每个<bean.../>标签代表一个java实例。

  定义<bean...>时,需要注意两个属性,一个是id,一个是class。

  id是<bean.../>标签的唯一标示符,容器对其的访问、管理、注入都通过这个属性来完成,所以它也是唯一的。

  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模式。

  举个例子:<bean id="test" class="..." scope="singleton"/>

  session和request作用域的范围很相似,不同的是session指每次Http Session请求都会有效,而request则是每次Http请求都有效。

  为此,我们需要有两种配置方式:采用Listener或者Filter配置。

  当使用Servlet2.4以上规范的Web容器时,可在Web容器下的web.xml文件中增加如下配置,该Listerner负责为request作用域负责:

 <web-app>
...
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
...
</web-app>

  当使用2.4以下规范的就不能用这个配置了,只能改为Filter配置:

 <web-app>
...
<filter>
<filter-name>requestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
<filter-mapping>
<filter-name>requestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</filter>
...
</web-app>

  一旦配置上面二者之一,就可以在Spring配置文件中使用request和session作用域了。

  

  如果需要为Bean属性值是容器中另一个bean实例,需要使用<ref...>元素,使用该元素会有两个属性:

  bean:引用不在同一个XML文件中的另一个bean实例的id属性值。

  local:引用在同一个XML文件中其他bean实例的id属性值。举一个例子:

 <bean id="A" class="com.basic.test.A"/>
<bean id="B" class="com.basic.test.B">
<property name="c">
<!-- 引用容器中另一个bean-->
<ref local="A"/>
</property>
</bean>

  它还有一种简洁的写法:

 <bean id="A" class="com.basic.test.A"/>
<bean id="B" class="com.basic.test.B">
<property name="c" ref="A"/>
</bean>

  此处简洁了ref元素,将它并入了property的属性中,当然这么写也就不区分ref元素中的local和bean属性了。

  此外,如果bean的属性值是个集合的话,则需要使用集合元素,<list.../>、<set.../>、<map.../>和<props.../>分别用来设置类型为List、Set、Map和Properties的集合属性值。

  下面我们来改造一个之前写的com/sep/basic/service/impl/Lenovo类,将其中包含多个集合属性。

 package com.sep.basic.service.impl;

 import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set; import com.sep.basic.service.Computer;
import com.sep.basic.service.Key; public class Lenovo implements Computer{
//下面是集合属性
private List<String> size;
private Set price;
private Map<String , Key> key;
private Properties health;
//private Key key; //各属性的setter方法
public void setSize(List<String> size) {
this.size = size;
} public void setPrice(Set price) {
this.price = price;
} public void setKey(Map<String, Key> key) {
this.key = key;
} public void setHealth(Properties health) {
this.health = health;
} @Override
public void useKey() {
System.out.println(size);
System.out.println(price);
System.out.println(key);
System.out.println(health);
} }

  下面来看一下我们的applicationContext.xml的配置代码:

 <?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 将配置Lenovo实例 -->
<bean id="lenovo" class="com.sep.basic.service.impl.Lenovo">
<property name="size">
<!-- 为list属性配置属性值 -->
<list>
<!-- 为每个value、ref、bean配置一个List元素 -->
<value>17'</value>
<value>21'</value>
<value>30'</value>
</list>
</property>
<property name="key">
<!-- 为Set设置属性值 -->
<set>
<!-- 为每个value、ref、bean配置一个Set元素 -->
<value>普通的字符串</value>
<bean class="com.sep.basic.service.impl.LogicTech"/>
<ref local="logicTech"/>
</set>
</property>
<property name="cpu">
<!-- 为Map类型设置属性值 -->
<map>
<!-- 每个entry配置一个key-value对 -->
<entry key="cpu1" value="intel"/>
<entry key="cpu2" value="amd"/>
<entry key="cpu3" value="other"/>
</map>
</property>
<property name="keyType">
<!-- 为Map类型设置属性值 -->
<map>
<!-- 每个entry配置一个key-value对 -->
<entry key="罗技键盘" value-ref="logicTech"/>
</map>
</property>
<property name="health">
<!-- 为properties类型设置属性值 -->
<!-- 为每一个prop元素配置一个属性项,其中key指定属性名 -->
<props>
<prop key="温度">正常</prop>
<prop key="存取速度">正常</prop>
</props>
</property>
</bean>
<!-- 将配置LogicTech实例-->
<bean id="logicTech" class="com.sep.basic.service.impl.LogicTech"/> </beans>

  这样我们就成功地将所有集合属性赋值了。

初学Java ssh之Spring 第四篇的更多相关文章

  1. 初学Java ssh之Spring 第三篇

    在这篇中,我学习了依赖注入的两种方式:设值注入和构造注入. 在我们以前的思维中,如果调用一个类时,我们都需要将其手动实例化,当我们创建被调用的工作不需要我们完成时,这就是控制反转,当这个将被调用的实例 ...

  2. 初学Java ssh之Spring 第二篇

    上一篇我们成功搭建好了spring开发的环境,接下来一起看看spring有什么神奇的地方吧(本人也是新手,有不太对的地方希望大神给指出便于修改呢,谢谢大家). 之前听说spring是在对xml文件的应 ...

  3. 初学Java ssh之Spring 第一篇

    之前虽然毕业前实习的工作是使用的C# .NET语言,但是,毕业后还是果断应聘Java.虽然自己对Java的理解不如C#深入,只是对基础知识比较熟悉,但还是义无返顾了··· 虽然应聘经历比较坎坷,但最终 ...

  4. Spring第四篇

    在spring第三篇中介绍了bean元素属性 在第四篇中介绍spring注入的方式 1 set方法注入 建立一个User类 创建私有的属性 set  get 方法  重写toString方法 代码如下 ...

  5. SSH框架之Spring第四篇

    1.1 JdbcTemplate概述 : 它是spring框架中提供的一个对象,是对原始JdbcAPI对象的简单封装.spring框架为我们提供了很多的操作模板类. ORM持久化技术 模板类 JDBC ...

  6. Java框架之Spring(四)

    本文主要讲述在Spring中 1 注解方式装配 2 以自动扫描把组件纳入spring容器中管理 3 面象切面编程-代理的jdk 版实现 4 使用 Cglib 生成代理 5 aop编程的一些概念 6 使 ...

  7. Java学习之路 第四篇 oop和class (面向对象和类)

    本人水平有限,创作本文是为了记录学习和帮助初学者学习,欢迎指正和补充 一.面向对象编程的设计概述 很多同学都在学校学了电脑的编程,现在的书籍大部分都是oop面向对象编程,一个很抽象的的名字,比较难以理 ...

  8. Spring第四篇【Intellij idea环境下、Struts2和Spring整合】

    前言 Spring的第二和第三篇已经讲解了Spring的基本要点了[也就是Core模块]-本博文主要讲解Spring怎么与Struts2框架整合- Struts2和Spring的整合关键点: acti ...

  9. Java笔记(基础第四篇)

    Java集合类 集合类概述 Java 语言的java.util包中提供了一些集合类,这些集合类又被称为容器.常用的集合有List集合.Set集合.Map集合,其中List与Set实现了Collecti ...

随机推荐

  1. 让你分分钟学会 JS 闭包

    闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...

  2. htmlspecialchars()函数

    htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体. 预定义的字符是: & (和号) 成为 & " (双引号) 成为 " ' (单引 ...

  3. 利用google浏览器开发者工具调试网页(详)

    前端程序员或者在校大学生正在开发网页,如果想要测试或者通过测试优化网页结构,该怎么办呢?这就需要用到一款工具,chrome浏览器的开发者工具?本文写给尚不熟悉这个开发者工具的同学们或者同行们,话不多说 ...

  4. shape及其子节点详解

    shape最大的最用便是用来替代图片,释放磁盘空间.另外则是增加适应不通过屏幕的设备. 先来看看shape下面的节点以及它所起到的作用. gradient   -- 对应颜色渐变(startcolor ...

  5. UIBezierPath

    UIBezierPath 笔者在写本篇文章之前,也没有系统学习过贝塞尔曲线,只是曾经某一次的需求需要使用到,才临时百度看了一看而且使用最基本的功能.现在总算有时间停下来好好研究研究这个神奇而伟大的贝塞 ...

  6. 无递归 A星寻路算法

    整理硬盘的时候,发现我早些年写的A星寻路算法.特放上来,待有缘人拿去,无递归噢,性能那是杠杠的. 码上伺候 public class Node { public int X { get; set; } ...

  7. xx通CGI流量控制

    流量控制共分2步,首先在CGI框架对用户的ip作限制,第二限制每个CGI的流量.   一.基于IP的流量控制 用共享内存(shm)的方式保存基于ip的访问信息. 配置文件中 <variable ...

  8. Android 字体颜色变化(点击)

    在开发的过程中,经常会遇到这样的场景,点击按钮,背景颜色发生变化:在drawable中,定义xxx.xml(selector) <selector xmlns:android="htt ...

  9. MySQL更新死锁问题

    作为一个社交类的 App ,我们有很多操作都会同时发生,为了确保数据的一致性,会采用数据库的事物. 比如现在我们有一个点赞操作,点赞成功后,需要更改文章的热度.以下是 SQL 语句: INSERT I ...

  10. SGU 0438 The Glorious Karlutka River =) 动态流

    题目大意:有一条东西向流淌的河,宽为W,河中有N块石头,每块石头的坐标(Xi, Yi)和最大承受人数Ci已知.现在有M个游客在河的南岸,他们想穿越这条河流,但是每个人每次最远只能跳D米,每跳一次耗时1 ...