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 ...
随机推荐
- ASP.NET 前后台调用方法
Asp.Net中几种相似的标记符号: <%=...%>< %#...%>< %%>< %@ %>解释及用法 答: < %#... %>:是在 ...
- Java中的回调函数
本例拿apache commons dbutils举例 回调函数: 回调是指在执行时,具体的封装处理工用由第三方的类来实现. 回调一般由两部分组成 1:调用类 - QueryRunner.实例类 2: ...
- TCP/IP协议与UDP协议的区别
TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接.一个TCP连接必须要经过三次“对话”才能建立起来, ...
- jeesz源码下载
大型分布式企业架构 jeesz,百度去搜索jeesz
- System.Configuration引用后ConfigurationManager方法用不了
System.Configuration引用后ConfigurationManager方法却用不了,提示没有引用 需手动添加引用 项目-引用-右击-添加引用-找到System.Configuratio ...
- knockoutjs(二)
Observables(监控属性)Knockout是在下面三个核心功能是建立起来的: 1监控属性(Observables)和依赖跟踪(Dependency tracking) 2声明式绑定(Decla ...
- Audio播放音效
AudioToolbox.framework是一套基于C语言的框架,使用它来播放音效其本质是将短音频注册到系统声音服务(System Sound Service).System Sound Servi ...
- jdbc连接mysql
package june25jdbcTest; import java.sql.Connection;import java.sql.DriverManager;import java.sql.Res ...
- 税收基础知识 > 三税(营业税, 增值税, 所得税) + 关税
三税:营业税 ▪ 增值税 ▪ 所得税 主要关注:一般纳税人, 起征点不详细描述. 营业税(Business tax) 营业税(Business tax),是对在中国境内提供应税劳务.转让无形资产或销售 ...
- Android Fragment 真正的完全解析(下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...