`
senton
  • 浏览: 200461 次
  • 性别: Icon_minigender_1
  • 来自: 紫禁城
社区版块
存档分类
最新评论

几个Spring的小例子

阅读更多

一 .
第一个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去做了。这个程序可谓是”代代理“了。  :)
 

分享到:
评论

相关推荐

    hibernate和spring的几个小例子

    这是根据传智播客网上视频做的关于hibernate和spring的几个小例子,为了以后用到时可以节省时间

    简单spring例子

    最近自己做的几个spring小例子(包括spring代理模式的应用)

    第一个spring IOC例子(非maven)

    第一个spring IOC例子(非maven) 方法步骤: 1、下载spring包,提取core,bean,context,expression 四大基础jar http://repo.spring.io/release/org/springframework/spring/ 2、下载common-logging jar ...

    Spring AOP完整例子

    Spring AOP 几个不同使用方法的完整例子,使用Junit4c测试, 在我的博客上有不同配置组合的说明,可以参考

    spring例子(基础)

    关于spring使用的几个小例子!!!spring例子(基础)spring例子(基础)spring例子(基础)

    spring例子.zip

    最近模拟书本写了几个spring的例子,希望对你有所帮助

    开源框架 Spring Gossip

    结合 JSTL &lt;spring:bind&gt; 标签 数据绑定的几个方法 &lt;spring:message&gt; 标签 &lt;spring:transform&gt; 标签 其它 View 层 除了 JSP View 层技术之外,您还可以使用其它的 View 层技术,或建立...

    Spring揭秘

    【目录内容全、影印版、清晰度较好(这是我把网上较好的几个版本整合出来的,应该是网上最好的了)】 没有教程似的训导,更多的是说故事般的娓娓道来,本书是作者在多年的工作中积累的第一手Spring框架使用经验的...

    Spring + Hibernate + Struts 事务配置小例子(带提示框等小技巧)

    前几天搞 Spring + Hibernate + Struts 事务配置 ,网上找了好多资料,不过好无语,大多都是 Ctrl + V,浪费俺的宝贵时间 现在我总结配出一套,给大家参考参考,可能有不足,请大家多多交流。 附:内有弹出...

    集合struts/spring/hibernate/ajax的一个案例

    一个关于ssha最基础的集合的例子,还用到了json。这个小项目用到了struts,spring,hibernate,异步刷新(ajax),json等技术。如果你刚接触这几个框架,或是想尝试结合这几个框架,那这个项目对你来说很有用。

    Spring面试题含答案.pdf

    35. 你可以在 Spring 中注入一个 null 和一个空字符串吗? 36. 什么是基于 Java 的 Spring 注解配置? 给一些注解的例子 37. 什么是基于注解的容器配置? 38. 怎样开启注解装配? 39. @Required 注解 40. @Autowired ...

    hibernate + spring 简化包

     ◆samples:该文件夹下包含Spring的几个简单例子,可作为Spring入门学习的案例。  ◆src:该文件夹下包含Spring的全部源文件,如果开发过程中有地方无法把握,可以参考该源文件,了解底层实现。  ◆test:该文件夹...

    Spring.net框架

    我们的第一个例子主要用于说明程序的基本构造,并且作为一个反面典型,引出为什么要解耦,以及如何下手。在这个例子中,我们将创建三个程序集,分别是MainApp.exe、HelloGenerator.dll以及SayHello.dll。它们之间的...

    spring hibernate执行存储过程的例子

    前几天一直在搞spring+hibernate执行存储过程的技术,在网上查了很多资料没有一个是完全的能执行的,代码简单但,几天时间比较辛苦,所以要分多了点。由于包都太大,所以删掉啦!

    精通Spring4.x企业应用开发实战

    个人印象比较深刻是在讲解IOC的时候举了一个《墨攻》例子,通过导演和演员的关系很巧妙地说明了什么是IOC,为什么要IOC。虽然Spring已经更新到5点几了,但是通过精读这本书,对于一名实习生,也够应对面试了。

    Flex+blazeDS+Spring官方Demo,环境搭建

    Flex+blazeDS+Spring官方Demo,环境搭建,内含十几个例子,从易到难,包括spring消息,spring安全,注解方式和非注解配置文件方式,十分好用。内含有tomcat,可直接启动并运行用户手册。

    spring+struts2+ibatis简单例子

    前几天因为需要,将spring2、struts2和ibatis进行了整合,整合过程涉及到很多技巧

    Spring中文开发指南

    本书介绍了spring基础语义,用几个例子,深入浅出的说明的了spring的几种依赖注入方式,并进行了对比总结。 spring MVC指南,webwork2与spring,struts与spring整合框架,hibernatr与spring的整合等

    spring boot jdbc的sql文例子

    spring boot jdbc的sql文例子,项目开发中的各种检索方法,更新,删除等写法 希望在开发中有所帮助,请参照。

    spring_MVC源码

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...

Global site tag (gtag.js) - Google Analytics