Spring框架——IOC&DI


Spring

Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本。该框架基于 Expert One-on-One Java EE Design and Development(ISBN 0-7645-4385-7)一书中的代码,最初由 Rod Johnson 和 Juergen Hoeller等开发。Spring Framework 提供了一个简易的开发方式,这种开发方式,将避免那些可能致使底层代码变得繁杂混乱的大量的属性文件和帮助类。

Spring

轻量级框架、Java EE的今天,当前主流框架

目标:

使现有技术更加易用,推进编码最佳实践

内容:

  • 依赖注入容器
  • Web集成
  • 数据访问支持
  • 简化Hibernate编码
  • 声明式事务
  • AOP实现

Spring与web整合的原理

从操作上来讲,就是在web.xml中去配置一个监听器,然后指定Spring的配置文件即可。

每一个WEB项目,都存在一个ServletContext对象,而我们配置的监听器就是对它进行监听,监听器会加载Spring的配置文件,把创建的对象放到ServletContext域(也就是setAttribute方法),获取对象的时候直接getAttribute即可!

Spring 中包含的关键特性:

  • 强大的基于 JavaBeans 的采用控制翻转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易。
  • 一个可用于从 applet 到 Java EE 等不同运行环境的核心 Bean 工厂。
  • 数据库事务的一般化抽象层,允许宣告式(Declarative)事务管理器,简化事务的划分使之与底层无关。
  • 内建的针对 JTA 和 单个 JDBC 数据源的一般化策略,使 Spring 的事务支持不要求 Java EE 环境,这与一般的JTA 或者 EJB CMT 相反。
  • JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码), 简化了错误处理, 大大减少了程序员的编码量.
    再次利用JDBC时,你无需再写出另一个 ‘终止’ (finally) 模块. 并且面向JDBC的异常与Spring 通用数据访问对象 (Data Access Object) 异常等级相一致.
  • 以资源容器,DAO 实现和事务策略等形式与 Hibernate,JDO 和 iBATIS SQL Maps集成。利用众多的翻转控制方便特性来全面支持, 解决了许多典型的Hibernate集成问题.所有这些全部遵从Spring通用事务处理和通用数据访问对象异常等级规范.
  • 灵活的基于核心 Spring 功能的 MVC 网页应用程序框架。开发者通过策略接口将拥有对该框架的高度控制,因而该框架将适应于多种呈现(View)技术,例如 JSP,FreeMarker,Velocity,Tiles,iText 以及 POI。值得注意的是,Spring中间层可以轻易地结合于任何基于 MVC 框架的网页层,例如 Struts,WebWork,或 Tapestry。
  • 提供诸如事务管理等服务的面向方面编程框架。 在设计应用程序Model时,MVC模式(例如Struts)通常难于给出一个简洁明了的框架结构。Spring却具有能够让这部分工作变得简单的能力。程序开发员们可以使用Spring的JDBC 抽象层重新设计那些复杂的框架结构。

Spring架构图

这里写图片描述

组成Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

核心容器:核心容器提供Spring 框架的基本功能。核心容器的主要组件是BeanFactory ,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC ) 模式将应用程序的配置和依赖性规范与实际的应用程序代码 分开。

**Spring 上下文:**Spring 上下文是一个配置文件,向Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如JNDI 、EJB 、电子邮件、国际化、校验和调度功能。

Spring AOP : 通过配置管理特性,Spring AOP 模块直接将面向方面的编程 功能集成到了Spring 框架中。所以,可以很容易地使Spring 框架管理的任何对象支持AOP 。Spring AOP 模块为基于Spring 的应用程序中的对象提供了事务管理服务。通过使用Spring AOP ,不用依赖EJB 组件,就可以将声明性事务管理集成到应用程序中。

**Spring DAO :**JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库 供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写 的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向JDBC 的异常遵从通用的DAO 异常层次结构。

**Spring ORM :**Spring 框架插入了若干个ORM 框架,从而提供了ORM 的对象关系工具,其中包括JDO 、Hibernate 和iBatis SQL Map 。所有这些都遵从Spring 的通用事务和DAO 异常层次结构。


企业级框架

企业级系统

  • 大规模:用户、数据、功能书
  • 性能和安全要求高
  • 。。。。
  • 业务负责
  • 灵活应变

Java技术足以应对
EJB————>Spring


IOC&DI

IOC

http://www.cnblogs.com/linjiqin/archive/2013/11/04/3407126.html

IOC(Inversion of Control):其思想是反转资源获取的方向。传统的资源查找方式要求组件向容器发起请求查找资源。作为回应,容器适时的返回资源,而应用了IOC之后,则是容器主动地将资源推送给它所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源。这种行为也被称为查找的被动形式。

IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中new相关的对象,应用程序由IOC容器进行组装。在Spring中BeanFactory是IOC容器的实际代表者。

DI

DI可以理解为IOC的实现。

DI(Dependency Injection)——IOC的另一种表述方式,即组件以一些预先定义好的方式(例如:setter方法)接受来自如容器的资源注入。相对于IOC而言,这种表述更直接。

IOC和DI

这里写图片描述


为什么使用依赖注入(DI)

(外部的容器,Spring容器创建好对象,注入进来)

  • “过于” 复杂的软件系统
  • 组件化的思想:分离关注点
  • 依赖注入:强制将组件的构建和使用分开。

目的:解耦合。实现每个组件块时只关注组件内部的事情。

要点:明确定义组件间的接口。

这里写图片描述

面向对象使系统的实现变得更容易。当系统复杂到一定程度时,仅仅面向对象就不够了。

Spring核心思想:自身完成对象的创建、管理、维护。

IOC的前生今世

IOC的前生——分离接口与实现

IOC前生——采用工厂设计模式

需求:生成HTML或PDF格式的不同类型的报表。

这里写图片描述

IOC的今世——采用反转控制

这里写图片描述


Spring容器

在XML文件中通过bean节点来配置bean。

Spring IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化,只有在容器实例化后,才可以从IOC容器里获取Bean实例并使用。

Spring提供了两种类型的IOC容器实现:

BeanFactory:IOC容器的底层基本实现。

ApplicationConerxt:提供了更多的高级特性,是BeanFactory的子接口。

配置Bean基于XML

在XML文件中通过bean节点来配置bean。

<bean id="hello1" class="com.jredu.sping2.HelloSpring2">
            <property name="name" value="张嘎,"></property>
            <property name="content" value="三天不打小鬼子,手都痒痒!"></property>
        </bean>

id:Bean的名称 在IOC容器中必须是唯一的。 若id没有指定,Spring自动将类名作为Bean的名字。

ApplicationContext

ApplicationContext的主要实现类:

  1. ClassPathXmlApplicationContext:从类路径下加载配置文件

  2. FileSystemXmlApplicationContext:从文件系统中加载配置文件。

ConfigurableApplicationContext 扩展于ApplicationContext,新增加两个主要方法:refresh()和cloise(),让ApplicationContext具有启动、刷新和关闭上下文的能力。

ApplicationContext在初始化上下文时就实例化所有单例的Bean。

WebApplicationContext是专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化工作。

这里写图片描述


这里写图片描述


这里写图片描述

原文地址:https://www.cnblogs.com/aixing/p/13327688.html