`

Spring框架学习总结01----Spring简述

阅读更多
学习Spring之前,首先要了解的是Spring存在的意义及它的使命。

Spring最根本的使命----简化Java开发。

什么是spring框架
spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。

Spring存在原因即它简化和java开发,为了降低Java开发的复杂性,Spring采取了以下4种关键策略:

     1、基于POJO的轻量级和最小侵入性编程。
      2、通过依赖注入和面向接口实现松耦合。
      3、基于切面和惯例进行声明式编程。
      4、通过切面和模板减少样板式代码。


1、轻量级和最小侵入性的POJO
   很多框架通过强迫应用继承它们的类工实现它们的接口从而让应用跟框架绑死。在Spring普及之前,常用的框架有EJB。典型的例子即,EJB2的无状态会话Bean,Java bean实现SessionBean接口,它强迫你参与EJB的生命周期。使得JavaBean很大一部分多余代码为使用EJB而编写。
   使用Spring,JavaBean不需要实现、继承或者导入与Spring API相关的任何东西。Spring通过依赖注入来装配POJO,使应用对象彼此之间保持松散耦合。

2、通过依赖注入和面向接口实现松耦合
   任何一个有实现意义的应用都是由两个或者更多的类组成,这些类相互之间进行协作来完成特定的业务逻辑。通常,每个对象负责管理与自己相互协作的对象的引用,这将会导致
高度耦合和难以测试的代码
我们以骑士(Knight)执行探险任务(Quest)为例,如拯救少女,击杀恶龙.....等。
依照通常方式进行开发,代码将为如下:
/*
 * 拯救少女
 */
public class DamselRescuingKinght {
	private RescuingDamselQuest quest ;  //拯救少女任务
	public DamselRescuingKinght() {
		this.quest = new RescuingDamselQuest();
	}
	
	public void embarkOnQuest(){
		quest.embark();
	}
	
}
class RescuingDamselQuest{
	public void embark(){
		System.out.println("执行任务!");
	}
}


如上所见,DamselRescuingKinght在它的构造函数中自行创建了RescuingDamselQuest。这使得RescuingDamselQuest和DamselRescuingKinght紧密的耦合到了一起,因此极大的限制了骑士执行探险的能力。使得该骑士只能执行救援少女任务,如果要执行击杀恶龙,该骑士将无法执行。另一方面DamselRescuingKinght该类的单元测试的代码将难以编写,并且该代码将难以复用
使用Spring依赖注入以及面向接口使用应用对象之间依赖关系实现松耦合。对象的依赖关系将由负责协调系统中各个对象的第三方组件在创建对象时设定。无需自行创建或管理它们的依赖关系即----依赖关系将被自动注入到需要它们的对象中去

使用Spring的构造器注入

所必须包:
spring-beans-3.2.0.RELEASE
spring-context-3.2.0.RELEASE.jar
spring-core-3.2.0.RELEASE.jar
spring-expression-3.2.0.RELEASE.jar
commons-logging-1.1.1.jar

knight.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.0.xsd
	   ">
	<bean id="knight" class="com.demo.BraveKnight">
		<constructor-arg ref="quest1"></constructor-arg>
	</bean>
	
	<bean id="quest1" class="com.demo.RescuingDamselQuest" />

</beans>


public interface Knight {
	public void embarkOnQuest();
}

public interface Quest {
	public void embark();
}

/*
 * 执行各种任务的骑士
 */
public class BraveKnight implements Knight{
	private Quest quest ;
	
 	public BraveKnight(Quest quest){
		this.quest = quest;
	} 
	
	public void embarkOnQuest(){
		quest.embark();
	}
	
}

/*
 * 拯救少女任务
 */
public class RescuingDamselQuest implements Quest{
	public void embark(){
		System.out.println("RescuingDamsel Go....");
	}
}


/*
测试
*/
public class KnightMain {
	public static void main(String[] args) {
		ApplicationContext apx = new ClassPathXmlApplicationContext("knight.xml"); //加载spring上下文
		Knight knight1 = (Knight) apx.getBean("knight"); //获取bean
		knight1.embarkOnQuest(); //使用bean
	}
}



根据以上代码:Spring通过应用上下文装载Bean的定义并把它们组装起来。Spring应用上下文全权负责对象的创建和组装。

使用成员注入及注解方式实现另一种探险任务
<?xml version="1.0" encoding="UTF-8"?>
<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.0.xsd
	   " default-autowire="byName">
	<bean id="knight" class="com.demo.BraveKnight" />
	<bean id="quest" class="com.demo.SlayDragonQuest"/>
</beans>

/*
 * 执行各种任务的骑士
 */
public class BraveKnight implements Knight{
	@Autowired
	private Quest quest ;
 
	public void embarkOnQuest(){
		quest.embark();
	}

	public void setQuest(Quest quest) {
		this.quest = quest;
	}
}

/*
 * 击杀恶龙任务
 */
public class SlayDragonQuest implements Quest{

	public void embark() {
		System.out.println("SlayDragon Go....");
	}

}




3、基于切面和惯例进行声明式编程。
AOP编程允许把遍布应用各处的功能分离出来形成可重用的组件。
面向切面编程往往被定义为促使应用程序分离关注点的一项技术。系统由许多不同组件组成,每一个组件各负责一块特定功能,除了实现自身核心的功能之外,这些组件还经常承担着额外的职责。诸如日志、事务管理、安全此类的系统服务经常融入到有自身核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为它们总是跨越系统的多个组件。

如果将这些关注点分散到多个组件中去,代码将会:
  (1)实现关注点代码将会重复出现在多个组件中。
  (2)使得组件本身的核心业务因无关代码而变得混乱。
AOP使用得这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。结果使用这些组件具有高内聚以及更加关注自身业务,总之,AOP确保POJO保持简单。

继承以骑士执行探险任务为例,添加一个吟游诗人歌唱骑士的事迹
/*
吟游诗人
*/
public class Minstrel {
	public void singBeforeQuest(){
		System.out.println("before ---knight is so brave!");  //探险任务之前执行
	}
	
	public void singAfterQuest(){
		System.out.println("after ----knight did embark on a quest!"); //探险任务之后执行
	}
}


如上所示,Minstrel有两个方法一个在执行任务之前执行,一个在执行任务之后执行。
将它加入骑士类中:
<?xml version="1.0" encoding="UTF-8"?>
<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.0.xsd
	   " default-autowire="byName">
	<bean id="knight" class="com.demo.BraveKnight" />
	<bean id="quest" class="com.demo.SlayDragonQuest"/>
	<bean id="minstrel" class="com.demo.Minstrel" />
</beans>


/*
 * 执行各种任务的骑士
 */
public class BraveKnight implements Knight{
	@Autowired
	private Quest quest ;
	@Autowired
	private Minstrel minstrel;
 
	public void embarkOnQuest(){
		minstrel.singBeforeQuest();
		quest.embark();
		minstrel.singAfterQuest();
	}

	public void setQuest(Quest quest) {
		this.quest = quest;
	}
	public void setMinstrel(Minstrel minstrel){
		this.minstrel = minstrel;
	}
}


如上代码可以实现需要的效果,但是管理他的吟游诗人是骑士的职责吗?这应该是吟游诗人自己的事,不应该要骑士提醒吟游诗人去做他的事
另外这样使得骑士必须知道吟游诗人,使得骑士BraveKnight 的代码复杂化了。

使用AOP实现声明编程
将Minstrel抽象为一个切面,你所做的事情只是在一个Spring配置文件中声明它。
aop必须包
aopalliance-1.0.jar
aspectjweaver-1.8.7.jar
spring-aop-3.2.0.RELEASE.jar
spring-aspects-3.2.0.RELEASE.jar

spring-beans-3.2.0.RELEASE
spring-context-3.2.0.RELEASE.jar
spring-core-3.2.0.RELEASE.jar
spring-expression-3.2.0.RELEASE.jar
commons-logging-1.1.1.jar

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:aop="http://www.springframework.org/schema/aop"
	   xsi:schemaLocation="
	   	 http://www.springframework.org/schema/beans
	   	 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	   	 http://www.springframework.org/schema/aop
	   	 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
	   " default-autowire="byName">
	<bean id="knight" class="com.demo.BraveKnight" />
	<bean id="quest" class="com.demo.SlayDragonQuest"/>
	<bean id="minstrel" class="com.demo.Minstrel" />	<!-- 声明 -->
	<aop:config>
		<aop:aspect ref="minstrel">		
			<aop:pointcut id="embark"  expression="execution(* *.embarkOnQuest(..))" /> <!-- 定义切面 -->
			<aop:before pointcut-ref="embark" method="singBeforeQuest"/> <!-- 声明前置通知 -->
			<aop:after  pointcut-ref="embark" method="singAfterQuest"/>  <!-- 声明后置通知 -->
		</aop:aspect>
	</aop:config>
</beans>

import org.springframework.beans.factory.annotation.Autowired;

/*
 * 执行各种任务的骑士
 */
public class BraveKnight implements Knight{
	@Autowired
	private Quest quest ;
 
	public void embarkOnQuest(){
		quest.embark();
	}

	public void setQuest(Quest quest) {
		this.quest = quest;
	}
}

//...其它不变


4、通过切面和模板减少样板式代码
如常见的样板式代码范例JDBC访问数据库查询,再如JMS、JNDI、使用REST服务通常也会涉及大量重复代码。
Spring旨在通过模板封装来消除样板式代码。

分享到:
评论

相关推荐

    spring框架教学课件

    这个"spring框架教学课件"旨在为初学者提供一个系统化的学习路径,帮助理解并掌握Spring的基本概念和实际应用。 Spring框架的核心特性包括依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented ...

    Spring学习笔记&源码

    本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...

    spring frame work 1.2.7包含commons-logging.jar

    解压这个文件,开发者可以找到所有必要的类库、文档和示例,以便于学习、理解和使用Spring框架。这个版本可能不包含最新的特性和改进,但对于理解Spring的基本原理和设计思想仍然很有帮助。 在1.2.7版本中,Spring...

    spring-boot-中文参考指南

    ### Spring Boot 中文参考指南知识点概述 #### 一、Spring Boot 概览 ...通过本文档的学习,开发者可以更深入地理解Spring Boot的工作原理,并掌握其核心功能,从而能够更加高效地开发高质量的Spring应用。

    struts spring hibernate ssh 三大框架集成详细步骤 手把手教你搭框架

    **Spring框架**: Spring是一个全面的后端应用程序框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能。在SSH集成中,Spring作为核心容器,管理着应用的bean,包括Struts的Action类和Hibernate的SessionFactory...

    跟我学spring3(8-13)

    Spring 3 是一个流行的 Java 应用开发框架,它为应用程序提供了全面的基础设施支持,包括依赖...以上是Spring 3框架的核心知识点,通过学习这些内容,开发者可以深入了解Spring的特性并有效地将其应用于实际项目中。

    Spring Framework 开发手册-中英两版

    通过深入学习这本手册,开发者可以全面了解Spring框架,提升自己的开发技能,为构建高效、可扩展的企业级应用打下坚实基础。无论是个人项目还是团队协作,Spring Framework都是Java开发者的强大工具。

    分库分表实战Spring Boot2+Sharding-JDBC视频教程-课课家教育.docx

    本课程主要针对已经有一定Spring Boot基础的学习者,旨在通过实战演练,教授如何在Spring Boot项目中使用Sharding-JDBC实现分库分表、读写分离等数据库扩展技术。Sharding-JDBC是一个轻量级的Java框架,可以在不修改...

    Spring.NET框架参考文档.

    Spring.NET框架是一个面向.NET平台的企业级应用开发框架,它借鉴了Java界的Spring框架设计理念,旨在简化.NET应用程序的复杂性,提供一种松耦合、模块化的开发方式。此框架的核心特性包括依赖注入(Dependency ...

    spring-framework doc文档

    Spring 框架是Java开发中...在阅读这些文档时,开发者可以逐步学习并实践Spring框架的各个组件,从而提升自己的开发技能和效率。通过深入理解并应用这些知识,开发者能够构建出更加健壮、可维护且易于扩展的Java应用。

    《Java EE企业级应用开发教程Spring+Spring MVC+MyBatis》_源代码.zip

    2. **Chapter 03** - Spring框架:讲解Spring的核心特性,如依赖注入(DI)和面向切面编程(AOP)。通过示例展示如何配置Spring容器,以及如何使用Bean定义、自动装配和作用域。 3. **Chapter 05** - Spring MVC:...

    spring面试题宝典

    《Spring面试题宝典》是针对Java开发者...通过学习和掌握这些知识点,不仅能提升个人技能,也能在面试中展现出扎实的Spring框架知识,增加成功获得理想职位的机会。这份《Spring面试题宝典》将是你面试路上的强大助手。

    Spring Professional Certification Study Guide

    通过阅读《Spring Professional Certification Study Guide》并结合提供的PDF资源,学习者可以系统地学习Spring框架,提升自己的技术水平,并有效地应对Spring专业认证考试。书中详尽的解释、实例和练习题将使读者在...

    JavaEE框架总结

    - **特点**:SpringMVC继承了Spring框架的优势,同时提供了更简洁的MVC实现方式。它利用Spring的依赖注入特性简化了控制器的开发,并提供了强大的数据绑定和验证机制。 - **工作流程**:用户发送请求到前端控制器...

    spring-boot中文文档1.4.X.pdf

    - 指引读者如何继续深入学习Spring Boot的相关知识。 #### 三、使用Spring Boot **13. 构建系统** - **13.1. Maven**: - **13.1.1. 继承starter parent**:介绍了如何继承Spring Boot的默认Maven父POM。 - **...

    spring特点和原理.学习笔记

    本文将深入探讨Spring的核心特点——控制反转(IoC)和面向方面编程(AOP),以及它们在Spring框架中的实现原理。 **一、控制反转(IoC)** 控制反转(Inversion of Control,简称IoC)是Spring的核心概念之一,它...

    spring入门教程书籍

    Spring框架是Java开发中的核心组件,它为构建可维护、模块化、松耦合的应用程序提供了全面的解决方案。本入门教程书籍旨在帮助新手快速掌握Spring的基本概念和实践应用。 《Spring 3.x企业应用开发实战》这本书可能...

    spring,boot,模板.docx

    下面将简述如何在IntelliJ IDEA中创建一个Spring Boot项目。 #### 步骤一:选择项目类型 - 打开IntelliJ IDEA,点击“Create New Project”。 - 在弹出的窗口中选择“Spring Initializr”。 #### 步骤二:设置...

Global site tag (gtag.js) - Google Analytics