品味Spring 的魅力

2016-01-29 12:54 6 1 收藏

品味Spring 的魅力,品味Spring 的魅力

【 tulaoshi.com - Java 】


  Spring的哲学是在不影响Java对象的设计的情况下将Java对象加入到框架中。

  EJB的框架采用了一种侵略性(Invasive)的方法来设计对象,它要求你在设计中加入符合EJB规范的代码。一些轻量级的COP框架,例如Avalon,也要求对象设计时必须符合某种规范,例如Serviceable接口,这种做法是典型的Type 1做法。

  这种设计思路要求Spring采用一种动态的、灵活的方式来设计框架。所以spring大量采用了反射。首先spring要解决的一个问题就是如何管理bean。因为IOC的思想要求bean之间不能够直接调用,而应该采用一种被动的方式进行协作。所以bean的管理是spring中的核心部分。

  反射和内省在代码的层次上思考问题,有时候能够带来出人意料的灵活性。但它的使用有时候也是一个哲学问题,不论是在ORM设计还是在AOP设计上都出现了类似的问题-究竟是使用反射,还是使用代码生成。

  在Spring中,处理这个问题的核心是在org.springframework.beans包中。而其中最为核心的部分,则是BeanWrapper。BeanWrapper,顾名思义,就是bean的包装器。所以,它的主要工作,就是对任何一个bean,进行属性(包括内嵌属性)的设置和方法的调用。在BeanWrapper的默认实现类BeanWrapperImpl中,虽然代码较长,但完成的工作却是非常的集中的。

  BeanWrapper的深入研究

  我们看看这个BeanWrapper是如何发挥运作的,假设我们有两个bean:

  public class Company {
  private String name;
  private Employee managingDirector;

  public String getName() {
  return this.name;
  }
  public void setName(String name) {
  this.name = name;
  }
  public Employee getManagingDirector() {
  return this.managingDirector;
  }
  public void setManagingDirector(Employee managingDirector) {
  this.managingDirector = managingDirector;
  }
  }

  public class Employee {
  private float salary;

  public float getSalary() {
  return salary;
  }
  public void setSalary(float salary) {
  this.salary = salary;
  }
  }

  然后我们使用BeanWrapper来调用这两个bean:

  Company c = new Company();
  BeanWrapper bwComp = BeanWrapperImpl(c);
  // setting the company name...
  bwComp.setPropertyValue("name", "Some Company Inc.");
  // ... can also be done like this:
  PropertyValue v = new PropertyValue("name", "Some Company Inc.");
  bwComp.setPropertyValue(v);

  // ok, let's create the director and tie it to the company:
  Employee jim = new Employee();
  BeanWrapper bwJim = BeanWrapperImpl(jim);
  bwJim.setPropertyValue("name", "Jim Stravinsky");
  bwComp.setPropertyValue("managingDirector", jim);

  // retrieving the salary of the managingDirector through the company
  Float salary = (Float)bwComp.getPropertyValue("managingDirector.salary");

  看起来麻烦了许多,但是这样spring就可以使用统一的方式来管理bean的属性了。


  Bean的制造工厂

  有了对单个Bean的包装,还需要对多个的bean进行管理。在spring中,把bean纳入到一个核心库中进行管理。bean的生产有两种方法:一种是一个bean产生多个实例,一种是一个bean只产生一个实例。如果对设计模式熟悉的话,我们就会想到,前者可以采用Prototype,后者可以采用Singleton。

  注意到,反射技术的使用使得我们不再像原始的工厂方法模式那样创建对象。反射可以非常灵活的根据类的名称创建一个对象。所以spring只使用了Prototype和Singleton这两个基本的模式。

  spring正是这样处理的,但是我们希望用户能够维护统一的接口,而不需要关心当前的bean到底是Prototype产生的独立的bean,还是Singleton产生的共享的bean。所以,在org.springframework.beans.factory包中的BeanFactory定义了统一的getBean方法。

  JDBC再封装JDBC优雅的封装了底层的数据库,但是JDBC仍然存在诸多的不变。你需要编写大量的代码来完成CRUD操作,而且,JDBC无论是遇到什么样的问题,都抛出一个SQLException,这种做法在异常使用上被称为不完备的信息。因为问题可能是很复杂的,也许是数据库连接的问题,也许是并发控制的问题,也许只是SQL语句出错。没有理由用一个简单的SQLException就搞定全部的问题了,这种做法有些不负责任。针对这两个问题,Spring Framework提出了两种解决方法:首先,提供一个框架,把JDBC应用

来源:http://www.tulaoshi.com/n/20160129/1488031.html

延伸阅读
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构答应您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。 !-- frame contents -- !-- /frame contents -- 在这篇由三部分组成的 Spring 系列 的第 1 部分中,我将介绍 Spring 框架。我先...
职场生活变得丰富多彩,所以要想获得关注并建立自己的气场就必须有自己的Icon. 别以为Icon是时尚界的专有名词,职场也有Icon。它不是一个简单的符号,一个标示,而是在职场脱颖而出的要素和亮点,这些要素成为被接受被追随被崇拜的原因。职场Icon涵盖了风格品味态度和处世方法。 Icon 1:独特的品味 良...
标签: 养生 健康
一、两颊生津 茶叶内涵成份中,有茶单宁和某些其它成份,能刺激口腔内壁紧束收敛,形成涩感以及生津。但是并非凡是涩感都会生津,部分较劣等茶品,虽然茶汤很涩,但并不会生津,始终觉得口内部卷缩而不开,引起口干如燥,喉头也因此紧锁不顺,使有强烈的渴感,但喉头却不想饮喝。如此不但不能解除缺水干渴之苦,同时更堵断了急需补...
本文介绍如何利用Eclipse插件Spring IDE在Eclipse中的使用。 Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。 问题提出: 在采用Spring框架进行系统开发时,Bean的配置文件XML的书写、XML文件的内容校验及Bean之间的依靠关系查看等工作,假如能够采用合适的工具来完...
标签: 游戏动漫
品味《最终幻想13》的历程     2009年12月,SQUARE ENIX 旗下最具代表性的角色扮演游戏《最终幻想》系列,最新作PS3《最终幻想13》(Final Fantasy XIII)日文版顺利推出。   2010年2月,台北国际电玩展闪电又发表系列作,23年以来的首款中文版终于问世。   2010年5月27,让许多玩家期盼多年的《最终幻想13》中文版,...

经验教程

262

收藏

11
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部