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 MVC3 无法打开项目文件“E:\我们的项目\Project\HeatingMIS.Web\HeatingMIS.Web.csproj”。此安装不支持该项目类型。
在vs中打开mvc3项目,虽然装了mvc3,但是还是会遇到莫名其妙的错误,这是我在做开发的时候遇到的一个问题,附带解决方案,和大家分享一下 问题描述:无法打开项目文件“E:\我们的项目\Project ...
- UEFI Bootable USB Flash Drive - Create in Windows(WIN7 WIN8)
How to Create a Bootable UEFI USB Flash Drive for Installing Windows 7, Windows 8, or Windows 8.1 In ...
- oracle的IMU和ora-01555
IMU: 01555: 按照上图找啊找,已经提交事物的undo块找不到了,就产生01555错误,解决这样问题:1. 确保undo表空间数据的保留时间至少大于最长sql语句的时间 2. 增大undo表空 ...
- 缓存Cache
转载自 博客futan 这篇文章将全面介绍有关 缓存 ( 互动百科 | 维基百科 )cache以及利用PHP写缓存caching的技术. 什么是缓存Cache? 为什么人们要使用它? 缓存 Cach ...
- Azure Web Site 之 利用Azure Web site 发布网站
由于经常混迹于MSDN Azure论坛,少不了和一些外国朋友打交道.有的时候觉得还是有一些东西可以写出来与外国友人们分享下的, 所以就用一个开源项目建了一个英文blog项目. 在发布的时候,首选的就是 ...
- treeview所有节点递归解法(转+说明)或者说递归的实际应用
public void PrintTreeViewNode(TreeNodeCollection node) { foreach (TreeNode n in node) { Response.Wri ...
- ajax 跨域请求
1. $.ajax({ type: "get", async: false, url: "http://61.160.194.208:8383/Api/login?acc ...
- wf(七)(手把手包会)
这个demo中我们将用If/Else逻辑加到工作流用来展示不同的message通过自定义的条件. 如果name的字符数是奇数,第一个单词就输出“Greeting”否则输出“Hello”. 1. 在Sa ...
- 一个ubuntu phper的自我修养(杂记)
ubuntu使用杂记 1.flatabulous安装使用. flatabulous是一个ubuntu图标主题. 使用它,必须得安装tweak插件. sudo add-apt-repository pp ...
- async和await
总结下博客园中看到的async和await public static class TaskAsyncHelper { /// <summary> /// 将一个方法function异步运 ...