- 浏览: 205810 次
- 性别:
- 来自: 紫禁城
文章分类
最新评论
-
a1439226817:
<!doctype html><html l ...
发布一个支持N级下拉列表联动的控件 -
a1439226817:
也不高个测试的demo,别人怎么用啊
发布一个支持N级下拉列表联动的控件 -
davaidgao:
不全啊,这是
Spring3.x权威开发指南 -
caizi12:
对于map绑定很是不方便,现在的做法,需要创建一User类,再 ...
浅谈 SpringMVC 数据绑定 -
joeyhuang:
不全啊..
Spring3.x权威开发指南
一 .
第一个Spring程序:
首先创建一个接口:
package cn.itcast;
public interface GreetingService {
public void sayGreeting();
}
创建一个实现上面接口的JavaBean,用get,set方法获取和设置变量greeting的值
package cn.itcast;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class GreetingServiceImp1 implements GreetingService {
private String greeting;
private Log log = LogFactory.getLog(GreetingServiceImp1.class);
public void sayGreeting() {//实现接口中方法
log.info("Hello ! " + greeting);
}
public String getGreeting() {
return greeting;
}
public void setGreeting(String greeting) {
this.greeting = greeting;
}
}
接下来写一个XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans><!--所有的Spring的xml配置文件都是以beans为根元素-->
<!--bean元素的id属性为对象取一个名字,class属性则为完整的类名-->
<bean id="greetingService" class="cn.itcast.GreetingServiceImp1">
<property name="greeting"><!--用property元素为name为greeting赋值,-->
<value>张三</value>
</property>
</bean>
</beans>
这个xml文件等价于下面这样的java代码:
cn.itcast.GreetingServiceImp1 greetingService = new cn.itcast.GreetingServiceImp1();
greetingService.setGreeting("张三");
下面这个类用于载入Spring容器获得一个GreetingService对象并调用此对象的方法打印出信息。
package cn.itcast;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
public class FirstSpring {
public static void main(String[] args) {
try {
BeanFactory factory = new XmlBeanFactory(new FileSystemResource(
"classes/cn/itcast/hello.xml"));
GreetingService greetingService = (GreetingService) factory.getBean("greetingService");
greetingService.sayGreeting();
} catch (BeansException e) {
e.printStackTrace();
}
}
}
因为我们这里用到了Log4j,所以最好加上一个log4j的xml配置文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="false" xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="systemout" class="org.apache.log4j.ConsoleAppender"><!--指定输出到控制台-->
<layout class="org.apache.log4j.SimpleLayout"></layout><!--指定layout-->
</appender>
<root>
<level value="info" />
<appender-ref ref="systemout" />
</root>
</log4j:configuration>
好了。一个世界上最简单的Spring程序编写完了。运行的结果毫无悬念的说一定是打印出下面这样的消息:
Hello ! 张三
二.
一个读取属性文件的小程序
首先建一个简单的property文件:collectionfile.property
class=java.util.ArrayList
elements=aaa,bbb,ccc
此类中有一个读取属性文件的方法。
package cn.itcast;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Properties;
public class PropertyReader {
public static String KEY_CLASS = "class";
public static String KEY_ELEMENTS = "elements";
public static Collection getCollection() {
InputStream ips = null;
try {
ips = SpringClass.class.getResourceAsStream(
"/cn/itcast/collectionfile.property");//用getResourceAsStream获取给定名称的资源
} catch (Exception e1){
e1.printStackTrace();
}
if (ips == null) {
throw new IllegalArgumentException("File not exists!");
}
Properties props = new Properties();
try {
props.load(ips);//从给定的输入流中读取属性列表(键和元素对)。
} catch (IOException e) {
e.printStackTrace();
}
String className = props.getProperty(KEY_CLASS);
Collection collection = null;
try {
Class classCollection = Class.forName(className);
collection = (Collection) classCollection.newInstance();
String strElements = props.getProperty(KEY_ELEMENTS);
String[] elements = strElements.split(",");
for (String element : elements) {
collection.add(element);
}
} catch (Exception e) {
e.printStackTrace();
}
return collection;
}
}
最后来测试一下上面的getCollection方法。
package cn.itcast;
import java.util.Collection;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.BasicConfigurator;
public class MainClass {
public static void main(String[] args) {
Log log = LogFactory.getLog(MainClass.class);
BasicConfigurator.configure();
Collection collection = PropertyReader.getCollection();
for (Object obj : collection) {
log.info(obj);
}
}
}
运行!打印出来了:
aaa
bbb
ccc
OK,把属性文件的内容改一下,加些中文:
class=java.util.ArrayList
elements=张三,李四
再运行,会看到下面的信息:
???
???
奇怪吧?这时就要用到一个native2ascii命令把属性文件转换才行了,用法如下:
native2ascii -encoding gb2312 collectionfile.property collectionfile1.property
然后会看到多了一个collectionfile1.property的文件,删掉collectionfile.property再把
collectionfile1.property改为collectionfile.property再运行就能看到正确的结果了:
张三
李四
三.
下面这个程序不用set方法复制,而只用构造方法的方式
先创建一个简单的JavaBean:
package cn.itcast;
public class HelloBean {
private String helloWord = "hello";
private String user = "NoBody";
public HelloBean(String helloWord, String user) {
this.helloWord = helloWord;
this.user = user;
}
public String sayHelloToUser(){
return helloWord + "!" + user + "!";
}
}
再建一个xml配置文件:bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--初始化三个HelloBean,并用constructor-arg元素为构造方法传入值-->
<bean id="helloBean1" class="cn.itcast.HelloBean">
<constructor-arg index="0">
<value>Hello</value>
</constructor-arg>
<constructor-arg index="1">
<value>张三</value>
</constructor-arg>
</bean>
<bean id="helloBean2" class="cn.itcast.HelloBean">
<constructor-arg index="0">
<value>Hello</value>
</constructor-arg>
<constructor-arg index="1">
<value>李四</value>
</constructor-arg>
</bean>
<bean id="helloBean3" class="cn.itcast.HelloBean">
<constructor-arg index="0">
<value>Hello</value>
</constructor-arg>
<constructor-arg index="1">
<value>王五</value>
</constructor-arg>
</bean>
</beans>
下面的类读取属性文件的内容
package cn.itcast;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class MainClass {
static final Logger log = Logger.getLogger(MainClass.class);
public static void main(String[] args) {
Resource resource = new ClassPathResource("bean.xml");
ListableBeanFactory factory = new XmlBeanFactory(resource);
//ListableBeanFactory接口用于接收多个bean
Map map = factory.getBeansOfType(HelloBean.class);
//取出类型为HelloBean的bean集合,返回结果为一个键值对,键为对象名,也就是xml文件的bean元素的
//id属性的值,值为class属性的值。
Set set = map.keySet();//Map的键是一个Set集合
Iterator it = set.iterator();
while (it.hasNext()) {//循环取出键和值
Object obj = it.next();
HelloBean hello = (HelloBean) factory.getBean(obj.toString());
log.info(hello.sayHelloToUser());
}
}
}
运行结果:
Hello!张三!
Hello!李四!
Hello!王五!
四.
为属性设置值:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="someBean" class="cn.itcast.SomeBean">
<property name="list"><!--属性类型为List的-->
<list>
<value>张三</value>
<value>李四</value>
<value>王五</value>
</list>
</property>
<property name="map"><!--属性类型为Map的-->
<map>
<entry key="1">
<value>aaaa</value>
</entry>
<entry key="2">
<value>bbbb</value>
</entry>
<entry key="3">
<value>cccc</value>
</entry>
<entry key="4">
<value>dddd</value>
</entry>
</map>
</property>
<property name="strings"><!--属性类型为数组的-->
<list>
<value>11111111</value>
<value>22222222</value>
<value>33333333</value>
<value>44444444</value>
</list>
</property>
<property name="props"><!--属性类型为Properties的-->
<props>
<prop key="1">001</prop>
<prop key="2">002</prop>
<prop key="3">003</prop>
<prop key="4">004</prop>
</props>
</property>
<property name="set"><!--属性类型为Set的-->
<set>
<value>11111111</value>
<value>22222222</value>
<value>33333333</value>
<value>44444444</value>
</set>
</property>
</bean>
</beans>
五.
当配置文件为properties文件时,比如文件名为hello.properties:
helloBean.class=cn.itcast.HelloBean
helloBean.helloWord=Hello,World
helloBean.user=zhangsan
JavaBean:
package cn.itcast;
public class HelloBean {
private String helloWord = "hello";
private String user = "NoBody";
public String getHelloWord() {
return helloWord;
}
public void setHelloWord(String helloWord) {
this.helloWord = helloWord;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String sayHelloToUser(){
return helloWord + "!" + user + "!";
}
}
来写个主函数看看效果
package cn.itcast;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.PropertiesBeanDefinitionReader;
import org.springframework.core.io.ClassPathResource;
public class MainClass {
public static void main(String[] args) {
BeanDefinitionRegistry reg = new DefaultListableBeanFactory();
PropertiesBeanDefinitionReader reader = new PropertiesBeanDefinitionReader(reg);
reader.loadBeanDefinitions(new ClassPathResource("hello.properties"));
BeanFactory factory = (BeanFactory)reg;
HelloBean hello = (HelloBean)factory.getBean("helloBean");
Logger log = Logger.getLogger(MainClass.class);
log.info(hello.sayHelloToUser());
}
}
运行结果:
Hello,World!zhangsan!
六.
下面是一个代理的spring程序
首先来创建一个实现了FactoryBean接口的Bean:
package cn.itcast;
import java.lang.reflect.Proxy;
import org.springframework.beans.factory.FactoryBean;
public class MyFactoryBean implements FactoryBean {
private String target = null;
private String myInterface = null;
public Object getObject() throws Exception {
Class[] clazzes = new Class[] { Class.forName(myInterface) };
Class clazz = Class.forName(target);
Object objTarget = clazz.newInstance();
Object objProxy = Proxy.newProxyInstance(this.getClass()
.getClassLoader(), clazzes, new MyInvocationHandler(objTarget));
return objProxy;
}
public Class getObjectType() {
return null;
}
public boolean isSingleton() {
return false;
}
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
public String getMyInterface() {
return myInterface;
}
public void setMyInterface(String myInterface) {
this.myInterface = myInterface;
}
}
再建一个xml文件为上面的Bean里面的属性赋值:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="myfactorybean" class="cn.itcast.MyFactoryBean">
<property name="target">
<value>java.util.Vector</value>
</property>
<property name="myInterface">
<value>java.util.Collection</value>
</property>
</bean>
</beans>
再来创建一个代理类:
package cn.itcast;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import org.apache.commons.logging.LogFactory;
public class MyInvocationHandler implements InvocationHandler {
private Object objTarget = null;
public MyInvocationHandler(Object objTarget) {
super();
this.objTarget = objTarget;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
LogFactory.getLog(this.getClass()).info(method.getName() + " is calling!");
//在外面每次调用method方法时都会记录日志信息,这就是代理的好处,当然你还可以加入其他的一些
//业务逻辑的代码。
Object objValue = method.invoke(objTarget,args);
return objValue;
//千万要注意:
//这里objValue的类型可谓是关系重大,在后面调用objTarget的method方法时返回值的类型会和
//这个objValue的类型相比较,如果不一样就会跑出空指针异常,
}
}
//下面来测试一下
package cn.itcast;
import java.util.Collection;
import org.apache.log4j.BasicConfigurator;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class MainClass {
public static void main(String[] args) {
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("/applicationContext.xml"));
Object obj = factory.getBean("myfactorybean");
BasicConfigurator.configure();
((Collection)obj).add(new String("abc"));
}
}
运行结果:
cn.itcast.MyInvocationHandler - add is calling!
从结果我们可以发现,MyFactoryBean里面没有任何打印或者记录日志的代码,但是运行时输出的信息从哪来的呢,就是从代理类那边打印出来的。是这样的,如果一个javaBean没有实现FactoryBean接口时,我们调用
getBean方法返回的就是这个javaBean本身的一个对象了,否则就是返回这个javaBean重写FactoryBean的
getObject()时返回的那个Object,在这里,我们在这个方法里面就是把业务交给另一个代理类
MyInvocationHandler去做了。这个程序可谓是”代代理“了。 :)
发表评论
-
浅谈 SpringMVC 数据绑定
2011-03-24 13:41 4651查看spring源码可以看出spring支持转换的数据类型: ... -
使用 Spring 2.5 基于注解驱动的 Spring MVC
2010-08-23 16:39 836基于注解的配置有越来越流行的趋势,Spring 2 ... -
Spring3.x权威开发指南
2010-08-23 11:30 3115Spring3.x权威开发指南 -
Spring中创建切面
2006-09-11 15:39 1136一。创建切面:Spring中的通知类型有四种:Around:拦 ... -
对Bean和Bean工厂进行后处理
2006-09-19 09:23 7971.对Bean进行后处理,必须实现BeanPostProces ... -
使用数据库连接池和jdbc中调用存储过程
2006-09-22 15:21 1025数据库连接池:数据库连接不仅仅是在应用服务器与数据库之间建立一 ... -
一个使用JdbcTemplate增加一组数据的完整例子
2006-09-23 12:44 1552一个使用JdbcTemplate增加 ... -
Hibernate学习笔记
2006-10-12 20:43 647J2EE体系结构分为三层:1.表示层(JSP/Servlet) ... -
一个使用ibatis对数据库增删改查的例子
2006-10-28 22:29 1326一个使用ibatis对数据库增删改查的例子:这里用的开发环境是 ... -
ibatis和Spring整合的详细例子
2006-10-28 22:30 1020ibatis和Spring整合的详细例子,数据库用的是mysq ... -
Spring XML配置十二个最佳实践
2006-11-01 13:28 644Spring XML配置十二个最佳 ... -
Servlet的生命周期
2006-11-10 00:27 1153Servlet的生命周期 当 ... -
JSP Struts之HTML标签库详解
2006-11-28 21:50 859JSP Struts之HTML标签库详解 Struts提供 ... -
WebWork 入门示例
2006-12-07 00:12 719准备工作: Eclipse3.2 MyEclip ...
相关推荐
在这个入门级的例子中,你可能会接触到以下几个关键知识点: 1. **Spring IoC容器**:它是Spring框架的心脏,负责管理所有bean的生命周期和依赖关系。你可以通过XML配置文件或Java配置类来定义bean及其依赖。 2. *...
总结一下,这个"第一个spring例子"涵盖了以下几个关键知识点: 1. **Spring框架**:依赖注入和面向切面编程的核心概念。 2. **Spring MVC**:处理HTTP请求和响应,分发到控制器进行业务逻辑处理。 3. **数据库集成*...
在这个"spring boot小例子"中,我们看到项目被构建为一个 WAR 包,这表明它是为在外部应用服务器(如 Apache Tomcat)上运行而设计的。通常,Spring Boot 提供两种打包方式:jar 和 war。jar 包适合独立运行,内嵌了...
在这个“spring代码例子--精选”中,我们很可能会看到一个简单的Spring MVC应用程序,包括以下几个关键部分: - **配置文件**:可能是一个名为`applicationContext.xml`的文件,用于定义Bean的配置,如Bean的类名、...
本篇文章将深入探讨这两个框架,并通过几个实际的小例子来帮助理解它们的使用方式。 首先,Hibernate是一个对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。在传统的Java应用中,开发者需要编写大量...
在"Spring入门小例子"中,你可能会接触到以下几个关键点: 1. **配置文件**:通常使用`applicationContext.xml`作为Spring的主配置文件,这里会定义Bean的实例化、依赖注入等信息。 2. **Bean的定义与注入**:在...
首先,我们从“demo”这个压缩包文件名出发,可以推测这是一个包含基础示例代码的压缩包,它可能包含了SpringCloud的几个核心组件的简单应用。 1. **Eureka服务注册与发现**:在SpringCloud中,Eureka是一个关键...
第一个spring IOC例子(非maven) 方法步骤: 1、下载spring包,提取core,bean,context,expression 四大基础jar http://repo.spring.io/release/org/springframework/spring/ 2、下载common-logging jar ...
在学习Spring Core时,我们需要理解以下几个关键概念: 1. **Spring容器**:Spring框架的核心是IoC(Inversion of Control)容器,也称为依赖注入容器。它负责创建对象、管理对象之间的关系,并在需要时提供这些...
要创建一个Spring AOP的例子,我们首先需要定义一个切面类,它可能包含一个或多个通知方法。然后,我们需要定义切入点表达式,这可以使用`@Pointcut`注解完成。接下来,我们可以使用`@Before`, `@After`, `@Around`,...
这个"spring oauth2.0 例子"是一个在MyEclipse集成开发环境中创建的示例项目,用于演示如何在Spring框架中实现OAuth2.0认证和授权流程。 首先,OAuth2.0的核心概念包括客户端、资源所有者(用户)、授权服务器和...
在"Spring flow Demo例子"中,我们可以深入学习以下几个关键知识点: 1. **Spring Web Flow的基本概念**: - **Flow**:是Spring Web Flow中的核心概念,代表了一组页面、事件和状态的集合,描述了用户会话的一个...
综合以上信息,我们可以学习到以下几个Spring相关的知识点: 1. **依赖注入**:Spring的核心特性之一,通过XML配置或注解实现对象之间的依赖关系,使得代码更加松耦合,易于测试和维护。 2. **Spring MVC**:...
通过“spring入门小例子.rar”这个压缩包,我们可以预期其中包含了几个基本的Spring示例项目,可能包括简单的Bean配置、依赖注入的演示、以及Spring MVC或Spring Boot的应用实例。学习这些例子可以帮助初学者快速...
整合过程通常包括以下几个步骤: 1. **引入依赖**:首先,需要在项目中添加Spring和Hibernate的相关库。这通常通过Maven或Gradle的依赖管理来完成,确保引入了Spring的核心库、Spring JDBC、Spring ORM以及...
在这个例子中,我们可能会涉及到以下几个关键知识点: 1. **AOP核心概念**:AOP允许开发者定义“横切关注点”(cross-cutting concerns),即那些跨越多个对象的方法,如日志、安全性或缓存。这些关注点通常被封装...
SSM整合的过程主要包括以下几个步骤: 1. 引入依赖:在项目的pom.xml文件中添加Spring、SpringMVC和Mybatis的依赖库。 2. 配置Spring:创建Spring的配置文件,如applicationContext.xml,配置Bean、DataSource、...
在"CartApp3"项目中,我们可以推测其主要组成部分可能包括以下几个方面: 1. **流程定义**:项目中会有`.xml`文件,比如`cart-flow.xml`,这些文件定义了购物车应用的各个流程,如添加商品、查看购物车、结算等。每...
Spring与MongoDB的整合主要涉及以下几个关键组件: 1. **MongoTemplate**:这是Spring Data MongoDB提供的核心模板类,用于执行MongoDB的各种操作,如查询、更新、插入等。MongoTemplate提供了对数据库操作的抽象,...
在"官方mybatis整合spring例子"中,我们将探讨以下几个关键知识点: 1. **集成方式**:MyBatis与Spring的整合主要有两种方式:XML配置和注解配置。XML配置需要在Spring的配置文件中声明SqlSessionFactoryBean,并...