7 -- Spring的基本用法 -- 1...2
7.1 Spring简介和Spring4.0的变化
7.1.1 Spring 简介
当使用Spring框架时,必须使用Spring Core Container(即Spring容器),它代表了Spring框架的核心机制,Spring Core Container主要由 org.springframework.core、org.springframework.beans、org.springframework.context、org.springframework.expression四个包及其子包组成,主要提供Spring IoC容器支持。

7.1.2 Spring 4.0 的变化
7.2 Spring 入门
7.2.1 Spring 下载和安装
1.下载spring-framework-4.x.x.RELEASE-dist.zip
docs : 存放Spring的相关文档,包含开发指南、API参考文档。
libs : 该目录下的JAR包分为三类--1Spring框架class文件的JAR包;2Spring框架源文件的压缩包,文件名以-sources结尾;3Spring框架API文档的压缩包,文件名以-javadoc结尾。整个Spring框架由21个模块组成,该目录下将看到Spirng为每个模块都提供了三个压缩包。
schemas:该目录下包含了Spring各种配置文件的XML Schema文档。
readme.txt、notice.txt、license.txt等说明性文档。
2.将libs目录下所需要模块的class文件的JAR包复制添加到项目的类加载路径中。
3.Spring核心容器必须依赖于common-logging的JAR包。下载commons-logging-x.x.x.jar添加到项目的类加载路径中。
4.如果需要发布使用了Spring框架的Java Web项目,还需要将Spring框架的JAR包和commons-logging-x.x.x.jar添加到Web应用的WEB-INF路径下。
7.2.2 使用Spring管理Bean
Spring 核心容器的理论很简单: Spring 核心容器就是一个超级大工厂,所有的对象(包括数据源、Hibernate、SessionFactory等基础性资源)都会被当成Spring核心容器管理的对象------Spring把容器中的一切对象成为Bean。
Class : Axe
package edu.pri.lime.bean; //Spring 对Bean类没有任何要求,只要它是个Java类即可。
public class Axe { public String chop(){
return "使用斧头砍柴";
}
}
Class : Person
package edu.pri.lime.bean;
public class Person {
private Axe axe;
// 设置注入所需的setter方法
public void setAxe(Axe axe) {
this.axe = axe;
}
public void userAxe(){
System.out.println("我打算去砍点柴火");
// 调用axe的chop() 方法,
// 表明Person对象依赖于axe对象。
// 这种A对象需要调用B对象方法的情形,被成为依赖。
System.out.println(axe.chop());
}
}
为项目增加XML配置文件来管理容器中的Bean。Spring对XML配置文件的文件名没有任何要求。
<?xml version="1.0" encoding="UTF-8"?>
<!-- Spring 配置文件的根元素,使用Spring-beans-4.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <!-- 配置名为person的Bean。其实现类是edu.pri.lime.bean.Person类 -->
<bean id="person" class="edu.pri.lime.Person">
<!-- 控制调用setAxe()方法,将容器中的axe Bean 作为传入参数 -->
<property name="axe" ref="axe"/>
</bean> <!-- 配置名为axe的Bean,其实现类是edu.pri.lime.bean.Axe类 -->
<bean id="axe" class="edu.pri.lime.Axe"/> <!-- 配置名为win的Bean,其实现类是javax.swing.JFrame类 -->
<bean id="win" class="javax.swing.JFrame"/> <!-- 配置名为date的Bean,其实现类是java.util.Date类 -->
<bean id="date" class="java.util.Date"/> </beans>
配置文件中的<bean.../>元素默认以反射方式来调用类的无参构造函数
<bean id="person" class="edu.pri.lime.Person">
<property name="axe" ref="axe"/>
</bean>
String idStr = ...; //解析<bean.../>元素的id属性得到该字符串值为person
//解析<bean.../>元素的class属性得到该字符串为edu.pri.lime.bean.person
String classStr = ...;
Class clazz = Class.forName(classStr);
Object obj = clazz.newInstance();
//container代表Spring容器
container.put(idStr,obj);
每个<bean.../》元素默认驱动Spring调用该类无参数的构造器来创建实例,并将该实例作为Spring容器中的Bean。
在Spring配置文件中配置Bean时,class属性的值必须是Bean实现类的完整类名,不能是接口,不能是抽象类(除非有特殊配置),否则Spring无法使用反射创建该类的实例。
<property.../>子元素通常用于作为<bean.../>元素的子元素,驱动Spring在底层以反射执行一次setter方法。name属性决定执行哪个setter方法,value或ref决定执行setter方法的传入参数。
如果传入参数是基本类型及其包装类、String等类型,则使用value属性指定传入参数。
如果以容器中其他Bean作为传入参数,则使用ref属性指定传入参数。
一旦创建处理Bean,Spring会立即根据<property.../>子元素执行setter方法,即<bean.../>元素驱动Spring调用构造器创建对象,<property.../>子元素驱动Spring执行setter方法,先后执行。
String nameStr = ...; //解析<property.../>元素的name属性得到该字符串值为axe
String refStr = ...; //解析<property.../>元素的ref属性得到该字符串值为axe
String setterName = "set" + nameStr.substring(0,1).toUpperCase() + nameStr.substring(1); //生成将要调用的setter方法名
//获取Spring容器中名为refStr的Bean,该Bean将会作为传入参数。
Object paramBean = container.get(refStr);
Method setter = clazz.getMethod(setterName, paramBean.getClass());
setter.invoke(obj,paramBean);
ApplicationContext是Spring容器最常用的接口,该接口有如下两个实现类
ClassPathXmlApplicationContext : 从类加载路径系搜索配置文件,并根据配置文件来创建Spring容器。
FileSystemXmlApplicationContext : 从文件系统的相对路径或绝对路径下去搜索配置文件,并根据配置文件来创建Spring容器。
对于Java项目而言,类加载路径总是稳定的,因此通常总是使用ClassPathXmlApplicationContext创建Spring容器。
package edu.pri.lime.main; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import edu.pri.lime.bean.Person; public class BeanTest { public static void main(String[] args) throws Exception{
// 床架Spring容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
// 获取id为person的Bean
Person per = ctx.getBean("person", Person.class);
// 调用userAxe()方法
per.userAxe();
}
}
Spring 容器获取Bean对象主要有两个方法。
Object getBean(String id) : 根据容器中Bean的id来获取指定Bean,获取Bean之后需要进行强制类型转换。
T getBean(String id, Class<T> requiredType) : 根据容器中Bean的id来获取指定类型的Bean。无须强制类型转换。
7 -- Spring的基本用法 -- 1...2的更多相关文章
- SpringMVC +mybatis+spring 结合easyui用法及常见问题总结
SpringMVC +mybatis+spring 结合easyui用法及常见问题总结 1.FormatString的用法. 2.用postAjaxFillGrid实现dataGrid 把form表单 ...
- Spring中@Async用法详解及简单实例
Spring中@Async用法 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类 ...
- (转)Spring中@Async用法总结
原文:http://blog.csdn.net/blueheart20/article/details/44648667 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的: ...
- Spring中@Async用法总结
引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3. ...
- spring AOP的用法
AOP,面向切面编程,它能把与核心业务逻辑无关的散落在各处并且重复的代码给封装起来,降低了模块之间的耦合度,便于维护.具体的应用场景有:日志,权限和事务管理这些方面.可以通过一张图来理解下: Spri ...
- Spring常用注解用法总结
转自http://www.cnblogs.com/leskang/p/5445698.html 1.@Controller 在SpringMVC 中,控制器Controller 负责处理由Dispat ...
- Spring中@Value用法收集
一.配置方式 @Value需要参数,这里参数可以是两种形式: @Value("#{configProperties['t1.msgname']}") 或者 @Value(" ...
- Spring data redis-StringRedisTemplate 用法
Spring-data-redis为spring-data模块中对redis的支持部分,简称为“SDR”,提供了基于jedis客户端API的高度封装以及与spring容器的整合,事实上jedis客户端 ...
- Spring.Net简单用法
Spring.Net其实就是抽象工厂,只不过更加灵活强大,性能上并没有明显的区别. 它帮我们实现了控制反转. 其有两种依赖注入方式. 第一:属性注入 第二:构造函数注入 首先,我们去 Spring. ...
- 7 -- Spring的基本用法 -- 6...
7.6 Spring 3.0 提供的Java配置管理 Spring 允许使用Java类进行配置管理,可以不使用XML来管理Bean,以及Bean之间的依赖关系. Interface :Person p ...
随机推荐
- .NET委托和事件
.net学习之委托和事件 1.什么是委托 通俗的说:委托就是一个能够存储符合某种格式(方法签名)的方法的指针的容器 上传图片: 2.委托语法 准备一个方法:string Hello(string ...
- 推荐一篇好文:OSG OSGearth vs2010编译
链接:http://weibo.com/p/2304189447a8480102v2c2 此文作者把用到的相关代码包放在:http://pan.baidu.com/s/1qW9a4zU 按照步骤操作完 ...
- AngularJs--angular-pagination可复用的分页指令
1.angular-pagination 是基于angular 编写的可复用分页指令 安装 克隆项目到本地: git clone https://github.com/febobo/angular-p ...
- 【笔记】css hover 伪类控制其他元素
最近在模仿一个网站的项目 当中有一个效果需要利用到hover效果因为不太想写jq脚本所以百度了一下css hover的运用发现原来hover也可以控制其他元素的变化的 但是这有一个要求 就是添加hov ...
- 自己动手写ORM框架
提起ORM框架,大家都很熟悉,网上流行的ORM框架有很多,其中出名的有一些,不出名的更是数不胜数. 下面是自己实现的一个简单的ORM框架,实现了常用的增删查改功能,供大家研究ORM实现原理. 功能描述 ...
- Android first---外置内存剩余空间大小
####获取外置内存的大小#### public class MainActivity extends Activity { @SuppressWarnings("deprecation&q ...
- python画图设置坐标轴大小
在console端输入python语句,会一句输一行,而且不保留你所做的操作,但是每一句之间加一个分号就能很好的解决. import pylab as Plot Plot.xlim(-150, 150 ...
- HQL查询——聚集函数
HQL查询--聚集函数 HQL也支持在选出的属性上使用聚集函数.HQL支持的聚集函数与SQL的完全相同: (1)avg:计算属性平均值: (2)count:统计选择对象的数量: (3)max:统计属性 ...
- Unity手撸2048小游戏——模块拆分
最近惹女票生气了,想起撸个游戏来哄哄她,加之以前在小恩爱App上,玩过那情侣版的2048,加之她喜欢玩这类益智类的游戏,打算撸一个3D的情侣版2048.不过之前没怎么独立做过游戏,就从2D的开始吧. ...
- 修改shell提示符的显示格式
默认的提示符显示方式如下: [root@localhost foldername]# 由于太长,希望能缩短到: [foldername]# 修改方式: # vim /etc/bashrc 找到第41行 ...