search
HomeDatabaseMysql Tutorial品味Spring 的魅力_MySQL
品味Spring 的魅力_MySQLJun 01, 2016 pm 02:07 PM
beanpublicusemethodquestioncharm

Spring

  
  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应用中的获取连接、异常处理、释放等比较通用的操作全部都集中起来,用户只需要提供特定的实现就OK了。实现的具体细节采用的是模板方法。举个例子,在org.springframework.jdbc.object包中,MappingSqlQuery类实现了将SQL查询映射为具体的业务对象。JavaDoc中这样写到:Reusable query in which concrete subclasses must implement the abstract mapRow(ResultSet, int) method to convert each row of the JDBC ResultSet into an object. 用户必须实现mapRow方法,这是典型模板方法的应用。我们拿一个具体的例子来看看:

  class UserQuery extends MappingSqlQuery {

  public UserQuery(DataSource datasource) {
  super(datasource, "SELECT * FROM PUB_USER_ADDRESS WHERE USER_ID = ?");
  declareParameter(new SqlParameter(Types.NUMERIC));
  compile();
  }

  // Map a result set row to a Java object
  protected Object mapRow(ResultSet rs, int rownum) throws SQLException {
  User user = new User();
  user.setId(rs.getLong("USER_ID"));
  user.setForename(rs.getString("FORENAME"));
  return user;
  }

  public User findUser(long id) {
  // Use superclass convenience method to provide strong typing
  return (User) findObject(id);
  }
  }

  其次是第二个问题,最麻烦的地方应该说是需要截住JDBC的异常,然后判断异常的类型,并重新抛出异常。错误的问题可以通过连接来获取,所以麻烦的是如何截获异常。Spring Framework采用的方法是回调,处理回调的类在Spring Framework中被称为template

  JdbcTemplate template = new JdbcTemplate(dataSource);
  final List names = new LinkedList();
  template.query("SELECT USER.NAME FROM USER",
  new RowCallbackHandler() {
  public void processRow(ResultSet rs) throws SQLException {
  names.add(rs.getString(1));
  }
  });

  回调函数是一个匿名类,其中也使用了模板方法,异常的处理都在父类中完成了。

  层间松耦合

  在开放源码界已经出现了大量的基于MVC的Web容器,但是这些容器都仅限于Web的范围,不涉及Web层次后端的连接,spring作为一个整体性的框架,定义了一种Web层和后端业务层的连接方式, 这个思路仍然疏运图MVC的范畴,但耦合更松散,不依赖于具体的集成层次。

  public class GoogleSearchController
  implements Controller {

  private IGoogleSearchPort google;

  private String googleKey;

  public void setGoogle(IGoogleSearchPort google) {
  this.google = google;
  }

  public void setGoogleKey(String googleKey) {
  this.googleKey = googleKey;
  }

  public ModelAndView handleRequest(
  HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
   String query = request.getParameter("query");
   GoogleSearchResult result =
   // Google property definitions omitted...

   // Use google business object
   google.doGoogleSearch(this.googleKey, query,start, maxResults, filter, restrict, safeSearch, lr, ie, oe);

   return new ModelAndView("googleResults", "result", result);
  }
  }

  回调函数是一个匿名类,其中也使用了模板方法,异常的处理都在父类中完成了。



Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
如何解决 VS Code 中 IntelliSense 不起作用的问题如何解决 VS Code 中 IntelliSense 不起作用的问题Apr 21, 2023 pm 07:31 PM

最常称为VSCode的VisualStudioCode是开发人员用于编码的工具之一。Intellisense是VSCode中包含的一项功能,可让编码人员的生活变得轻松。它提供了编写代码的建议或工具提示。这是开发人员更喜欢的一种扩展。当IntelliSense不起作用时,习惯了它的人会发现很难编码。你是其中之一吗?如果是这样,请通过本文找到不同的解决方案来解决IntelliSense在VS代码中不起作用的问题。Intellisense如下所示。它在您编码时提供建议。首先检

解决C++代码中出现的“error: redefinition of class 'ClassName'”问题解决C++代码中出现的“error: redefinition of class 'ClassName'”问题Aug 25, 2023 pm 06:01 PM

解决C++代码中出现的“error:redefinitionofclass'ClassName'”问题在C++编程中,我们经常会遇到各种各样的编译错误。其中一个常见的错误是“error:redefinitionofclass'ClassName'”(类‘ClassName’的重定义错误)。这个错误通常出现在同一个类被定义了多次的情况下。本文将

iOS的developer版和public版有什么区别?iOS的developer版和public版有什么区别?Mar 01, 2024 pm 12:55 PM

每年Apple发布新的iOS和macOS大版本之前,用户都可以提前几个月下载测试版抢先体验一番。由于公众和开发人员都使用该软件,所以苹果公司为两者推出了developer和public版即开发者测试版的公共测试版。iOS的developer版和public版有什么区别呢?从字面上的意思来说,developer版是开发者测试版,public版是公共测试版。developer版和public版面向的对象不同。developer版是苹果公司给开发者测试使用的,需要苹果开发者帐号才可以收到下载并升级,是

SpringBoot怎么删除引用jar包中的无用beanSpringBoot怎么删除引用jar包中的无用beanMay 14, 2023 pm 08:07 PM

前言公司有个项目,时间比较赶,而且项目的部分需求,和之前做的项目部分功能一样,为了赶速度和直接将之前多模块的maven项目中的部分模块,直接以jar包的形式引入到新项目中了,虽然省去了不少开发时间,但是造成项目需要导入引入项目jar的相关依赖,导致项目臃肿,启动很慢。有没有办法让项目只加载自己需要的bean呢?当然我们可以直接修改源代码重新打包引入去解决,但是这个办法太多麻烦。通过百度的手段,查询可以在springboot启动类上用@ComponentScan注解去实现代码示例@Componen

解决PHP报错:继承父类时遇到的问题解决PHP报错:继承父类时遇到的问题Aug 17, 2023 pm 01:33 PM

解决PHP报错:继承父类时遇到的问题在PHP中,继承是一种重要的面向对象编程的特性。通过继承,我们能够重用已有的代码,并且能够在不修改原有代码的情况下,对其进行扩展和改进。尽管继承在开发中应用广泛,但有时候在继承父类时可能会遇到一些报错问题,本文将围绕解决继承父类时遇到的常见问题进行讨论,并提供相应的代码示例。问题一:未找到父类在继承父类的过程中,如果系统无

win10下载不了steam怎么办win10下载不了steam怎么办Jul 07, 2023 pm 01:37 PM

Steam是十分受欢迎的一个平台游戏,拥有众多优质游戏,可是有些win10用户体现自己下载不了steam,这是怎么回事呢?极有可能是用户的ipv4服务器地址没有设置好。要想解决这个问题的话,你可以试着在兼容模式下安装Steam,随后手动修改一下DNS服务器,将其改成114.114.114.114,以后应当就能下载了。win10下载不了steam怎么办:WIn10下能够试着兼容模式下安装,更新后必须关掉兼容模式,不然网页将无法加载。点击程序安装的属性,以兼容模式运作运行这个程序。重启以增加内存,电

Java Spring框架创建项目与Bean的存储与读取实例分析Java Spring框架创建项目与Bean的存储与读取实例分析May 12, 2023 am 08:40 AM

1.Spring项目的创建1.1创建Maven项目第一步,创建Maven项目,Spring也是基于Maven的。1.2添加spring依赖第二步,在Maven项目中添加Spring的支持(spring-context,spring-beans)在pom.xml文件添加依赖项。org.springframeworkspring-context5.2.3.RELEASEorg.springframeworkspring-beans5.2.3.RELEASE刷新等待加载完成。1.3创建启动类第三步,创

Spring Boot获取bean的方式有哪些Spring Boot获取bean的方式有哪些May 12, 2023 pm 03:22 PM

在使用spring框架中我们都知道,某个类如果使用了@Service、@Autowire这种依赖注入的方式引用了其他对象,在另外一个类中,只有通过spring的IOC容重中获取这个类的实例时,那些被依赖的对象才能正确被初始化,否则那些被依赖的对象都是null。所以就有一个问题,在普通类中如何获取springioc容器中的bean(spring托管的bean)。我们都知道,在spring中ApplicationContext这个上下文对象是获取bean的基础。在springboot中,我们可以通过

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Hot Tools

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use