Spring的初步认识

一、 企业级Java开发与J2EE

        不同于坐在学校寝室笔记本前编写Java课堂作业这样的小打小闹,Java企业级开发涉及到很多方面的技术,如数据库、Web应用服务、事务处理等,需要考虑性能、安全、可扩展性等一系列需求。很多公司在进行企业级开发时,为了提高应用的可扩展性和复用性,都会开发自己的通用服务模块,这些服务性的软件系列统称为中间件。中间件处于操作系统和更高一级的应用程序之间,作用是使应用程序运行环境和操作系统隔离,使开发者无需为系统问题干扰,从而把注意力集中在应用程序解决问题的能力上。

        而各公司开发的中间件没有遵循统一的规范,用户无法将各公司的中间件组装在一起使用。为了提出标准的规范,Sun公司在1998年发表了JDK1.2版本, 并使用了新名称Java 2 Platform,即“Java2平台”,修改后的JDK称为Java 2 Platform Software Develping Kit,即J2SDK。并分为标准版(Standard Edition,J2SE), 企业版(Enterprise Edition,J2EE),微型版(MicroEdition,J2ME)。


二、Spring框架

       在Java Web方面应用最广泛的框架是SSH框架,即Struts+Spring+Hibernate三个框架的集合。Spring框架已成为基于POJO的轻量级开发框架的领导者,主要特性是依赖注入(DI)和面向切面编程(AOP),背后的根本目的都是为了简化Java开发。下面分别从Spring的三种策略讲解为什么Spring能简化Java开发。

2.1   基于POJO的最小侵入性编程

        POJO( Plain Old Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。POJO可以理解为简单的实体类,只有一些属性及简单的getter和setter方法,没有业务逻辑。下面就是一个最简单的POJO对象:

public class Person {

	private String name;
	
	public void setName(String name) {
		this. name=name;
	}
	
	public String getName() {
		return name;
	}
}
        这样一个POJO有什么用呢?其实它在J2EE开发中很常见,应用Hibernate框架能能够使POJO对象与数据库中的表对应、对象属性与表中的字段对应,从而使程序员能够像操作对象一样操作数据库表单。

        如果使用EJB2货其他重量级框架,这样一个简单的JavaBean也会变得很臃肿,因为他们强迫开发中编写大量冗余代码,而且通常难以编写测试代码。而Spring不会强迫开发中实现Spring规范的接口,在类上看不出任何Spring的痕迹,因为Spring是通过依赖注入来装配类的。

2.2  通过依赖注入和面向接口实现松耦合

        依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。参考:什么是依赖注入

        当我们脱离整个程序只有一个类的课堂作业式的编码后,会发现任何一个有实际意义的应用都是由两个或更多的类组成,这些类之间相互协作,完成特定的业务逻辑。通常的习惯是每个对象负责管理与自己相互协作的对象(即它所依赖的对象)的引用,然而等程序庞大起来,往往数十个类相互协作,这样会导致程序高度耦合,不易扩展和修改,更加难以测试。示例:

public class Freshman implements Student{
	private EnglishClass oneClass;
	
	public Freshman(){
		oneClass = new EnglishClass();
	}
	
	public void goToClass(){
		oneClass.take();
	}
}

        Freshman类和EnglishClass类紧密地耦合在一起,极大地限制了大一学生的课堂范围,如果学生要上数学课,那么又得重新在构造函数里new一个数学课。       

        耦合具有两面性:紧密耦合的代码难以复用,并且典型地表现出“打地鼠”式的bug,修改完一个bug又冒出更多bug;另一方面,代码又不可能不耦合,不同的类必须以适当的方式交互。所以应该谨慎地管理耦合。

        通过面向接口编程和依赖注入,就可以使对象无需自行创建或管理它们的依赖关系——依赖关系会被自动的注入到需要他们的对象中去。依赖注入通常有两种方式:设值注入和构造注入,以下是构造注入的示例:

public class Freshman implements Student {
	private OneClass oneClass;

	public Freshman(OneClass oneClass){
		this.oneClass = conClass;
	}

	public void goToClass(){
		oneClass.take();
	}
}
        不同于之前自行创建课堂任务,在构造大一学生对象时把课堂任务的接口当做构造器参数传入,这就是构造器注入。在这里大一学生没有与具体的课堂发生耦合,对他来说,只要接受一门课就行了,具体是哪门课在构造对象时,再传入课堂接口的具体实现即可。这就是依赖注入最大的好处——松耦合。

        我们可以应用Spring来装配Bean,最常见的装配方式是采用XML配置,如下面的配置文件把具体的课堂实现传给学生类:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
	<bean id="student" class="com.springlearning.pojo.Freshman">
       		<constructor-arg ref="oneClass">
	</bean>

	<bean id="oneClass" class="com.springlearning.pojo.EngliseClass">
	</bean>
<beans>

        现在已经声明了类之间的关系,只需要装载XML配置文件就能把应用启动起来。Spring通过通过应用上下文(Application Context)来装载XML,创建和组装对象。应用上下文有很多中实现,如ClassPathXmlApplicationContext,该类能够加载位于应用系统classpath下的一个或多个XML文件。下面的示例调用该类加载student.xml,并获得Student对象的引用。

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class main {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("student.xml");
		
		Student s = (Student) context.getBean("student");
		s.goToClass();
	}
}
        我们完全不知道学生上了哪门课,而且也不知道是大一学生上课,只有student.xml文件知道大几的学生上了哪门课。这就是Spring的依赖注入。

2.2  基于切面和模板减少样板式代码

        依赖注入让相互协作的软件组件保持松散耦合,而AOP编程允许你把遍布应用各处的功能分离出来形成可重用的组件。

        写博客太耗时间了,╮(╯﹏╰)╭ , 其他方面参考书籍:《Spring 实战》。














  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值