`
ygsilence
  • 浏览: 336266 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring入门示例及相关概念介绍(转)

    博客分类:
  • java
阅读更多

Spring入门示例及相关概念介绍

作者:http://blog.csdn.net/fenglibing,转载请保留。

    相对于Hibernate(冬眠),Spring(春天),具有更多的诗意与希望的感觉,是为了解决传统J2EE开发效率过低、开发商之间不统一、没有真正实现写一次到处使用,它的优点有如下:

1、低侵入式设计,代码污染极低。

2、独立于各种应用服务,真正实现写一次到处都可以使用。

3、用户可选择的自由度高,用户可以选择部分或者是全部SPRING的功能,它并不是设计来取代其它框架,可以和其它的框架(如STRUTSHIBERNATE)等结合极好。

4、面向接口的编程方式,使得代码的偶合度降到最低。

5、所有的BEAN默认都被会单态化,相同的BEAN只会被初使化一次,因而节省了BEAN初使化的时间及减少垃圾回收,增加了应用效率。

...

有以上的优点的结合,因而它是被广大程序员所欢迎的,因为它可以给我们带来高效、稳定的开发,很大程度的减少了程序的开发、维护周期,也就自然的减少了软件开发的费用。下面简单的介绍两个应用示例,这些示例都来自于书本,都简单易懂,我也会详细的加以说明,另外需要使用下面的示例,需要引用SpringJAR包:Spring.jar,该JAR包包括了大部份的应用,如果暂时不需要SPRINT的其它功能,该JAR足以。

以下的程序,全部都是调试通过的。

示例一、不同的人说不同的话

1、建立接口

工厂模式SRPING中是随处体现,且提倡面向接口,因此首先建立接口:人

package test;
public interface Person {
 public void sayHello();
 public void sayBye();
}

2、建立两种具体的人:中国人、美国人

//中国人

package test;

public class Chinese implements Person {
 public void sayBye() {
  System.out.println("
再见");
 }
 public void sayHello() {
  System.out.println("
你好");
 }
}

//美国人

package test;

public class American implements Person {
 public void sayBye() {
  System.out.println("Bye");
 }
 public void sayHello() {
  System.out.println("hello");
 }
}

3、建立bean映射配置文件,bean.xml(这个文件名是什么没有关系,在初使化的时候指定给初使化程序就可以)

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.sprintframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="chinese" class="test.Chinese"/>
<bean id="american" class="test.American"/>
</beans>

4、建立JAVA测试类:

public void doIt(){

  /*获取bean映射配置文件,配置文件放于与当前测试类在同一个目录下*/
  ApplicationContext ctx=new FileSystemXmlApplicationContext(getClass().getResource("bean.xml").toString());
  Person person=null;
  person=(Person)ctx.getBean("chinese");
  person.sayHello();
  person.sayBye();
  
  person=(Person)ctx.getBean("american");
  person.sayHello();
  person.sayBye();
 }

5、对以上示例调用的说明:

A)、对接口Person和具体实现类ChineseAmerican就没有什么需要说明的了,和其它的编程方式,都是先定义接口,实现类再通过继承接口实现其方法。

B)、映射类中将类的路径定义为一个id的名称,到时系统根据传到的id名称,到配置文件中去找到该类的绝对路径,再通过反射原理加载该类,并返回其对象,这个是通过getBean这个动作完成的。

C)、根据里氏代换原则,能够接收父类的地方,都可以接收子类,所以这个时候通过getBean返回的对象(如Chinese或者American),都可以赋给接口Person,这个时候接口类调用其中的方法的时候,因为这个时候父类实际上接受的是子类的对象,因而这个时候调用的就是指定子类的方法。这个时候Spring就帮我们完成了如下工作:

Person person=new Chinese();

只是子类不是通过显示给出来的,而是通过Spring工厂通过映射配置生成的。

 

示例二、设值注入

设值注入是依赖注入的一种,依赖注入早期叫控制反转,也可以称反射,他们的意义都相同。当某个 Java 实例(调用者)需要另一个Java 实例(被调用者)时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。而在依赖注入的模式下,创建被调用者的工作不再由调用者来完成,通常由 Spring 容器来完成,然后注入调用者,因此称为控制反转,也称为依赖注入。

1、建立接口:人与斧头

人,定义一个动作:

package test2;
public interface Person {
 public void useAxe();
}

斧头,定义一个动作:

package test2;

public interface Axe {
 public void chop();
}

2、建立接口的实现类:中国人与石斧

中国人

package test2;

public class Chinese implements Person{
 /*
默认无参构造方法不管为私的还是公有的,都可以访问,并且要保证bean中存在可以被外界访问的无参构造函数*/
 private Chinese(){};
 /*
定义需要被使用的斧头接口,具体使用什么斧头这里不管*/
 private Axe axe;
 /*
定义被注入斧头的set方法,该方法一定要符合JAVABEAN的标准。在运行时候,
  *Sping
就会根据配置的<ref local=""/>,找到需要注入的实现类*/
 public void setAxe(Axe axe){
  this.axe=axe;
 }

 /*
这个时候使用的axe,就不再是接口Axe本身,而是被注入的子类实例,所以这里的chop()动作就是具体子类的chop动作*/
 public void useAxe() {
  axe.chop();
 }
}

石斧

package test2;

public class StoneAxe implements Axe {
 public void chop() {
  System.out.println("
石斧慢慢砍");
 }
}
3
、建立映射配置文件bean.xml

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.sprintframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="chinese" class="test2.Chinese">
 <!-- 
声明实现类test2.Chinese中的属性 -->
 <property name="axe">
  <!-- 
指定其中声明的属性,需要用本地的那个id对应的class
    
这里local的值为"stoneAxe",表示axe的属性值在注入的时候,
    
将会用test2.StoneAxe实例注入,到时在实例类Chinese中使用
    axe
的时候,实际上调用的时候StoneAxe的实例
   -->
  <ref local="stoneAxe"/>
 </property>

</bean>
<bean id="stoneAxe" class="test2.StoneAxe"/>
</beans>

4、测试用例:

package test2;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Caller {
 public static void main(String[] args) {
  Caller caller=new Caller();
  caller.doIt();  
 }
 public  void doIt(){
  String bean=getClass().getResource("bean.xml").toString();
  ApplicationContext ctx=new FileSystemXmlApplicationContext(bean);
  Person person=(Person)ctx.getBean("chinese");
  person.useAxe();
 }
}

5、对以上示例调用的说明:

程序及XML文件中都有详细说明,这里就不说明了。

 

三、构造注入:

构造注入即是通过构造函数进行注入,到目前为止,SPRINT支持设值注入与构造注入两种方式,它们可以同时存在。

现在采用的实例为了和设值注入进行对比,因此使用的程序都是设值注入的程序,其中的接口和测试实例都不需要修改,修改的只是需要被注入的实现类Chinese,以及配置文件,不同之处用加粗体表示。

1、修改实现类Chinese如下;

package test2;
public class Chinese implements Person{
 /*
默认无参构造方法不管为私的还是公有的,都可以访问,并且要保证bean中存在可以被外界访问的无参构造函数*/
 private Chinese(){}; 
 /*
定义需要被使用的斧头接口,具体使用什么斧头这里不管*/
 private Axe axe;
 public Chinese(Axe axe){
  this.axe=axe;
 }

 /*
这个时候使用的axe,就不再是接口Axe本身,而是被注入的子类实例,所以这里的chop()动作就是具体子类的chop动作*/
 public void useAxe() {
  axe.chop();
 }
}
2
、修改配置文件bean.xml

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.sprintframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="chinese" class="test2.Chinese">
 <!-- 
定义需要被构造注入的实现类,同设值注入的结果一样,都是注入接口的实现类 -->
 <constructor-arg><ref bean="stoneAxe"/></constructor-arg>
</bean>
<bean id="stoneAxe" class="test2.StoneAxe"/>
</beans>

 

3、设值注入与构造注入实现的结果是一样的,都在将需要被调用的实现类注入到调用的实现类。

设值注入与传统JAVABEAN的写法一样,比较容易接受;而构造注入在应用程序加载的时候就已经完成了注入,可以控制加载顺序。各有优缺点,根据不同的情况选用了。

 

四、后记

编程中理解与使用SPRING就像是人从学走路到跑步的过程,如果没有理解什么是单态模式、工厂模式、反射、JAVABEANXML基础、接口及其实现等等,理解SPRING就会比较困难,就算是可以使用通,也不一定知道为什么,看看网上的一些信息,动不动要求说会不会SPRINGHIBERNATE等等,很少提到基础知识是否扎实。我在面试别人的过程中,往往更注意面试人员的程序基础、编程风格、动手能力、文档编写能力等,当然对当前一些流行的框架也会有提问,毕竟好的东西也是需要借签的。

分享到:
评论

相关推荐

    spring 入门示例代码

    由于没有具体的readme内容,我们只能基于一般的Spring入门示例来推测可能涉及的知识点。 1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一,通过DI,Spring可以帮助管理对象之间的依赖关系,减少...

    spring 入门 示例 简单实现

    创建一个Spring入门示例,首先你需要创建一个简单的Java类,比如`ExampleService`,然后使用注解标记它,并定义一个依赖。接着,创建一个`Spring配置类`,使用`@Configuration`注解,声明bean。最后,通过`...

    spring mvc入门示例

    学习Spring MVC时,你需要掌握以下关键概念和技术: 1. **配置**:包括web.xml的配置以及Spring的context配置,用于声明DispatcherServlet、HandlerMapping、HandlerAdapter等组件。 2. **控制器(Controller)**:...

    spring的入门程序示例

    以上就是Spring入门程序的基本结构和主要知识点。通过这个例子,你可以了解到Spring如何管理对象、处理依赖以及构建Web应用程序。随着对Spring的深入学习,你将掌握更多的高级特性,如AOP、事务管理、数据访问、缓存...

    spring入门经典源代码

    "Spring入门经典源代码"中的每个章节都配有示例代码,这些示例涵盖了上述各种概念,包括简单的Hello World程序、DI的实例、AOP的使用、Spring MVC的Web应用开发以及数据访问的实现。通过实际运行和调试这些代码,你...

    《Spring入门经典》书中示例代码

    《Spring入门经典》是一本深度剖析Spring框架的入门书籍,旨在帮助初学者快速掌握Spring的核心概念和使用方法。书中的示例代码是理论知识的实践体现,通过这些代码,读者可以直观地理解Spring如何工作,如何配置,...

    spring与maven简单入门示例2018年11月22日博客资源

    在这个"2018年11月22日博客资源"中,你将找到关于如何使用 Maven 来管理 Spring 入门程序的示例。下面我们将深入探讨这两个工具的使用和相互配合。 1. **Maven 的基本概念** - `pom.xml`:Maven 的核心配置文件,...

    《Spring入门经典》源代码

    《Spring入门经典》是一本由Mert Caliskan和Kenan Sevindik共同撰写的书籍,主要面向希望深入理解并掌握Spring框架的初学者。Spring是Java领域中最为广泛使用的开源框架,它提供了一个全面的编程和配置模型,旨在...

    spring2.5.6注解以及xml简单ioc入门示例

    这个入门示例项目旨在帮助初学者了解和掌握Spring 2.5.6版本中的注解使用和基于XML的IoC配置。 首先,让我们来探讨一下Spring的IoC概念。IoC是一种设计模式,它将对象的创建和管理权交给了容器,而不是由对象自身...

    Spring-mvc入门示例

    在本入门示例中,我们将深入理解 Spring MVC 的核心概念和关键组件,以便初学者能够快速上手。 1. **MVC 模式** MVC 模式是一种软件设计模式,用于分离应用程序的数据模型、用户界面和业务逻辑。Model(模型)处理...

    Spring MVC入门(登录示例)

    在这个入门教程中,我们将通过一个简单的登录示例来学习 Spring MVC 的基本概念和工作流程。 ### 1. Spring MVC 架构 Spring MVC 包含了以下组件: - **DispatcherServlet**:它是整个流程的入口,负责接收请求并...

    Spring MVC 入门实例

    首先, 我需要在你心里建立起 Spring MVC 的基本概念. 基于 Spring 的 Web 应用程序接收到 http://localhost:8080/hello.do(事实上请求路径是 /hello.do) 的请求后, Spring 将这个请求交给一个名为 helloController ...

    myeclipse+spring+struts2 入门示例

    本入门示例将帮助初学者了解如何使用MyEclipse结合Spring和Struts2来构建一个完整的Web应用程序。下面我们将深入探讨这三个技术的核心概念及其整合过程。 首先,Spring框架是一个全面的Java应用开发框架,它提供了...

    spring 入门基础

    - `Spring入门.pdf`:这份PDF文档可能包含了Spring的基本概念、术语解释,以及步骤指南,是你学习Spring的辅助材料。 - `Spring.txt`:这可能是一个文本文件,里面可能包含了一些关键概念的笔记或者代码示例,可以...

    Spring从入门到精通 源码

    本书由浅入深,循序渐进地介绍了Spring的体系结构和相关知识点,目的是帮助初学者快速掌握Spring,并能使用Spring进行应用程序的开发。本书最大的特色在于每章都是由浅入深,从一个简单的示例入手,让读者快速了解本...

    Spring从入门到精通(珍藏版)

    本书由浅入深,循序渐进地介绍了Spring的体系结构和相关知识点,目的是帮助初学者快速掌握Spring,并能使用Spring进行应用程序的开发。本书最大的特色在于每章都是由浅入深,从一个简单的示例入手,让读者快速了解本...

    spring3.0Mvc简单示例

    这个“spring3.0Mvc简单示例”旨在帮助开发者快速理解并入门Spring MVC的基本概念和操作流程。让我们深入探讨一下Spring MVC的核心特性以及如何在项目中设置和使用它。 首先,Spring MVC是Spring框架的一部分,它...

    spring入门实例

    在这个"spring入门实例"中,我们将探索如何利用Spring和Spring JDBC构建一个简单的登录模块。 首先,我们需要理解Spring框架的基础概念。Spring框架的核心在于IoC(Inversion of Control,控制反转)和DI...

    Spring入门经典源代码

    这个"Spring入门经典源代码"压缩包很可能是为了帮助初学者理解并学习Spring的基本概念和用法而准备的。 首先,Spring的核心是IoC(Inversion of Control)容器,它负责管理对象的生命周期和对象间的依赖关系。在...

Global site tag (gtag.js) - Google Analytics