发帖  主题  评论  推荐  标签 用户 查搜   用户 密码 自动 注册  
 
面向对象 设计模式 领域驱动设计 云架构 框架 开发教程 SOA 大数据 扩展性 并发编程 EDA 分布式 函数编程

Java企业软件教程系列

Spring专题

  Spring主要是业务层框架,现在已经发展成为一个完整JavaEE开发框架,它的主要特点是IoC DI和AOP等概念的融合,强项在面向切面AOP。推出之初因为Ioc/AOP等新设计理念值得框架设计者学习,现在已经成为Java世界主流框架,从其2.0引入auto-wired自动配对以后,开发效率大大提高,SpringMVC以简化和REST风格著称。

  Struts + Spring + Hibernate 号称SSH框架是JavaEE经典开发组合。

  Spring是于2003 年兴起的一个轻量级的Java 开源框架框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。Rod Johnson 对Java EE正统框架臃肿、低效、脱离现实的种种现状提出了质疑,并积极寻求探索革新之道。Spring相比EJB,重新重视和定义了POJO.

  平时,我们需要生成一个对象,使用new语法,如一个类为A
public class A{
  public void myMethod(){
    System.out.println("hello");
  }
}
如果我们在 B中调用A,那么如下代码:
public class B{
  public void invoke(){
    A a = new A();
    a.myMethod();
  }
}
每次执行invoke方法时,都要生成一个A对象,如果A对象代码较长,这是费时的事
情。于是有如下写法:
public class B{
  A a = new A();
  public void invoke(){
    a.myMethod();
  }
}
将A对象变成B的类属性。 如果我们不想在B中实现A的实例,也就是不想立即new A(),而是想通过外界传入, 注意,如果你想知道为什么,这里涉及到设计模式以及解耦等因素,进一步感兴趣者可学习 本站的GoF 23 种设计模式。


如果想让A的实例从外界传入,有两种写法:
public class B{
  A a;
  public void setA(A a){
    this.a = a;
  }
  public A getA(){
    return a;
  }
  public void invoke(){
    a.myMethod();
  }
}
这种写法,A并没有被实例化,需要通过外界调用setA方法,将A的对象实例赋入B中. 或者通过B的构造函数传入,如下:
public class B{
  A a;
  public B(A a){
    this.a = a;
  }
  public void invoke(){
    a.myMethod();
  }
}
上述两种写法在编程中是经常发生的,B作为调用者,A是被调用者,A的实例化不在 调用者B内部中完成,而是通过构造函数或setXXX方法赋值进来,这种方式我们称为依赖 性注射(IoC 模式),B 和A 的依赖联系是通过构造函数或setXXX 方法赋值进来,这样, 最大程度解耦了调用者B和被调用者A之间的耦合联系。


Spring如何实现依赖注射?
上文提到:A的实例化不在调用者B内部中完成,而是通过构造函数或setXXX 方法赋 值进来,Spring实际就是完成这个赋值的过程。 为了让Spring自动完成B代码中的A的实例化,需要通过配置文件告诉Spring有关A 的类的属性,这个配置是applicationContext.xml文件。 在 applicationContext.xml中,我们先定义JavaBeans为B的配置:
<beans>
  <bean id="b" class="springsimple.B"/>
</beans>
这是最常用的JavaBeans的定义,id相当于对象名,当前文件应该是唯一,如果你有Jsp 编程经验,这非常类似于Jsp里调用JavaBeans语句:
<jsp:userBeans id="b" class="springsimple.B"/>

再在applicationContext.xml定义A的配置如下:
<beans>
  <bean id="b" class="springsimple.B"/>
  <bean id="a" class="springsimple.A"/>
</beans>
这样我们告诉Spring我们有两个JavaBeans,现在解决关键问题,B代码中还调用了A, 那么如何让Spring将A的实例注射到B中?使用Spring配置的property语法。具体配置如 下:
<beans>
  <bean id="b" class="springsimple.B">
  <property name="a"><ref local="a" /></property> <!— 增加这一行-->
</bean>
  <bean id="a" class="springsimple.A" />
</beans>
增加一行说明:B 的属性a 指向了a,这样,Spring 会知道B 中属性a 的实例就是 springsimple.A,在B实例化时将会将B中的a 实现实例化,这是通过setA方法注射进入。 注意,property name="a"中的a 是setA字符中去掉set 后的字符串,这个字符串第一个 必须是小写,例如,如果B中有setOneA方法,那么,配置文件应该是property name="oneA"。

在程序中调用 Spring 前面我们写了两个程序: B类和A类,并且写了配置文件applicationContext.xml,下面
我们就可以运行B类的invoke方法。
1. 首先,将Spring配置到Web容器中。
Spring框架是运行在Web 容器中,所以,我们需要配置Web容器的配置文件web.xml,
告诉Web 容器有关Spring 的配置文件名,这里取为applicationContext.xml,当然可以取其
他名称,如下:
<web-app>
<display-name>WebModule1</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>


除了配置/WEB-INF/applicationContext.xml 文件, 还需要加入一个 ContextLoaderListener,用于加载Spring配置文件,并实现初始化工作。将Spring注册(寄 存)到Web 容器,这样,在一个Web 容器中,只有一个Spring 应用框架,我们可以借助 Spring框架实现Singleton全局。


2. 在 Web 层应用程序中使用Spring。
前面已经配置成功后,就可以在Web 层的Servlet或Jsp中调用访问Spring了,如果你 编制的是一个Servlet/Jsp 程序,那么在你的Servlet/Jsp 使用下面的代码通过Spring 创建B 的实例:
ServletContext servletContext =this.getServletContext();
WebApplicationContext appContext =
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
B b = (B) appContext.getBean("b");


上面基本是两句,首先获得WebApplicationContext实例,然后从WebApplicationContext
实例中获得B的实例。 如果你使用的是Web 层应用框架,如Struts或Tapestry,除了Spring说明提供特殊方便 的调用方式,你需要从这个框架中获得当前Servlet容器ServletContext实例,再调用上面代 码即可。

 

Spring各种教程源码项目下载(几十篇)

JHipster简介

MinuteProject快速生成Spring源码

Spring教程

Spring面试问题和答案

Spring Java配置要点

Spring的AOP实现

使用Spring-boot快速启动Spring应用

Dropwizard与Spring Boot比较

Spring Web 应用的最大败笔

Spring 和 AspectJ实现领域驱动设计

Spring security安全机制深入使用

在Spring中使用异步事件实现同步事务

Spring Data是什么?

Spring Integration集成框架与企业应用整合EAI

使用gradle生成Spring Boot应用的Docker Image

SPRING Annotation元注解手册

使用Spring Cloud和Reactor在微服务中实现EventSourcing

使用JSON Web Tokens和Spring实现微服务

定制Spring和Hibernate系统的审计Audit日志

 

相关文章

Spring框架4.0 GA发布

Spring Reactor介绍

Spring 3.1 终于加入了Cache支持

Reactor: Spring发布基于JVM的异步事件驱动框架

Jive论坛与Spring框架

探讨Spring框架使用真相

关于SPING与EJB的胡言乱语--重和轻永恒的话题

怎样在一个spring+hibernate的框架下,使他能支持分布式服务器集群

 

相关讨论专题

Spring专题

Spring2专题

Spring3专题

SpringMVC专题

POJO专题

Ioc专题

AOP专题

Hibernate专题

Struts专题

JavaEE教程

解道移动版 | 关注解道 | 联系解道 | 关于解道 | 广告联系 | 网站地图 | 设为首页

沪ICP证12033263 如有意见请与我们联系 Powered by JdonFramework
返回顶部