Spring记录之Spring的基本概念

Spring的基本概念

Spring 框架本身没有强制使用任何特别的编程模式。从设计上看,Spring有很大自由度,像个容器,可以整合其它许多框架组件。Spring的核心功能DI/IOC,AOP,适用于任何JAVA应用。学习当中的设计思想,对Java编程会有帮助。

1. Spring优势

Spring的优势主要有6点:

  • 有效组织中间层对象。能有效整合现有框架如Struts2,Hibernate,Mybatis,Shiro,Lucene等等。
  • 实现了真正的AOP面向接口编程,组件之间高度解耦(decouple),AOP是一种良好的编程习惯。
  • Spring秉承的设计思想,是让使用Spring创建的应用,都可能少地依赖Spring自己的API。Spring应用中的大多数业务对象,不依赖于Spring
  • 易于单元测试
  • 提高代码重用性,尽可能避免硬编码。Spring能将应用中的某些代码抽象出来,在其它程序中使用。
  • 为数据存取提供一个一致框架,简化数据库底层访问方式

2. Spring框架模块

2.1 核心容器 (Core Container)

先看看官方文档怎么说。

The Core Container consists of the spring-core, spring-beans, spring-context, spring-context-support, and spring-expression (Spring Expression Language) modules.

5个核心jar包,或模块。

spring-corespring-beans模块提供Spring框架核心容器的基础,包括控制反转和依赖注入,其中的BeanFactory实现了工厂模式。

spring-context模块建立在Core和Beans模块之上,它扩展(extends/inherit)了Beans模块,添加了国际化支持,事件传播(Event Propagation),资源加载、上下文信息(如Servlet容器),此外,还支持Java EE的EJB、JMX,远程访问。ApplicationContext是该模块的重点。

spring-context-support为常见的第三方类库集成到Spring提供了支持,如缓存(EhCache, Guava, JCache),mailing(JavaMail),scheduling(CommonJ,Quartz),模板(FreeMarker,JasperReports,Velocity).

spring-expression模块提供强大的Expression Language,用于运行时查询或操作对象,该模块扩展了EL表达式

2.2 AOP和Instrumentation

spring-aop模块提供了一个符合AOP联盟标准的面向切面编程的实现。这里可以定义拦截器和切点,

spring-aspects提供AspectJ的集成支持

spring-instrument模块提供class instrumentation support和类加载器实现。spring-instrument-tomcat包含针对Tomcat 的instrumentation agent

2.3 Message

Spring4包含spring-messaging模块,里面包含Message, MessageChannel, MessageHandler等核心抽象类,该模块一系列用于将消息映射到方法的注解,类似Spring MVC

2.4 Data Access/Integration

包括JDBC, ORM, OXM, JMS, 和 Transaction模块

spring-jdbc提供JDBC抽象层

spring-tx为类提供编程和声明式事务(programmatic and declarative transaction)管理,这些类需实现特定接口,对所有POJO适用.

spring-orm模块提供了主流的对象关系映射(object-relational mapping)API,包括 JPA, JDO, and Hibernate

spring-oxm模块提供了支持Object/XML mapping实现的抽象层,如JAXB, Castor, XMLBeans, JiBX and XStream

spring-jms包含生成和消费消息的特性,java messaging service

2.5 Web

Web层包含

spring-web, spring-webmvc, spring-websocket, and spring-webmvc-portlet

spring-web提供基础的web集成,如文件上传,使用servlet监听器初始化IoC容器,web上下文,当中还有HTTP client和Spring远程支持的web部分

spring-webmvc,又叫Web-Servlet module,包含 model-view-controller (MVC) ,REST Web Services实现。Spring MVC和其他Spring模块一起,将后端模型代码与Web形式表现清晰分离

spring-webmvc-portlet,又叫Web-Portlet module,提供了在Portlet环境下的MVC实现,与Spring MVC的功能一样

Spring middle-tier using a third-party web framework

Typical full-fledged Spring web application

3. Spring的核心

  • 依赖注入(DI)
  • 控制反转(IOC)
  • 面向切面编程(AOP)

一个Java实例(调用者)需要调用另外一个Java实例(被调用者),调用者需要实现这个调用过程,通常是”new 构造方法”,但这样耦合度很高。当这个调用过程的责任(代码),或者控制权,交出去,交给容器来实现,这就是控制反转;从容器角度看,就是容器向调用者注入它想要调用的那个实例,这就是依赖注入。背后,其实是用了反射机制、动态代理

一句话,你需要的实例,“你不用来找我,我会去找你”。对象的依赖关系由容器管理,实现了对象的解耦

4. SpringIOC容器

SpringIoC容器是一个提供IoC支持的轻量级容器。Spring提供了两种容器:BeanFactoryApplicationContext。此外,Spring提供了这两个类的几种实现类,它们也都称为Spring的容器。

4.1 BeanFactory

org.springframework.beans.factory.BeanFactory接口定义,属于基础类型的IOC容器。该接口定义了IOC容器的功能规范,下面的源码不是最新的4.2.6的

 public interface BeanFactory {
        //标志返回工厂,而非实例
        String FACTORY_BEAN_PREFIX = "&";
        //返回xml文件中,id为name的bean
        Object getBean(String name) throws BeansException;
        //返回xml文件中,id为name,类型为requiredType的bean
        <T> T getBean(String name, Class<T> requiredType) throws BeansException;
        //返回xml文件中,类型为requiredType的bean
        <T> T getBean(Class<T> requiredType) throws BeansException;
        //返回xml文件中,id为name,可变参数args
        Object getBean(String name, Object... args) throws BeansException;
        //xml文件中是否存在id为name的bean
        boolean containsBean(String name);
        //作用域,xml文件中scope属性;是否单例
        boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
        //是否原型模式,每调用一次,创建一个新实例
        boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
        //名称为name的类与目标类targetType是否匹配
        boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
        Class<?> getType(String name) throws NoSuchBeanDefinitionException;
        //返回别名
        String[] getAliases(String name);
    }

BeanFactory负责初始化各种Bean,并调用其生命周期方法。

Spring提供了BeanFactory的许多实现方法,常用的是XmlBeanFactory,3.1版本后,推荐使用 DefaultListableBeanFactoryXmlBeanDefinitionReader,根据XML配置文件的定义来装配bean

4.2 ApplicationContext

org.springframework.context.ApplicationContext定义接口,以BeanFactory为基础构建,继承了ListableBeanFactory, HierarchicalBeanFactory两个BeanFactory的子类。

与BeanFactory相比,ApplicationContext出了创建、管理、配置bean外,还提供附加功能,如国际化。

此外,ApplicationContext初始化後,容器中的所有singleton Bean也都被实例化了。所以,大部分系统都选择用ApplicationContext**,只在系统资源少的情况下,考虑使用BeanFactory**

ApplicationContext的常用实现类有

  • AnnotationConfigApplicationContext
  • ClassPathXmlApplicationContext
  • FileSystemXmlApplicationContext
  • XmlWebApplicationContext

第一个显然是注解解析用,后面几个则根据xml配置文件解析了。

5. 依赖注入的3种实现方式

5.1.设置注入,setter方法

Service实现层,需要实例化的对象,设置setter方法,关键是set方法,将xml文件里读取的内容,转换成相应实例,再透过set方法注入调用的类

applicationContext.xml文件,注册bean,设置

优点:

  • 直观自然灵活
  • 若依赖关系复杂,构造方法注入则显得臃肿,setter则更为简洁

缺点:

  • 尽管灵活,但容易破坏类的状态和行为。因此需要知道哪些组合是有效的,哪些是无效的,顺序也要注意。

5.2.构造方法注入

构造方法里传入需要注入的类

applicationContext.xml文件,注册bean,设置

优点:

  • 符合设计原则,“构造期间即创建一个完整、合法的对象”
  • 避免繁琐的setter方法,所有依赖关系集中在构造方法,更加易读
  • 关联关系仅在构造方法中表达,只有组件创建者,需要关心组件内部的依赖关系。 依赖关系对调用者透明。对上层屏蔽不必要的信息,系统层次清晰。

缺点

- 构造方法出现的错误有时,难以排除

- 继承中,构造方法不会自动继承,需手动

- 如果应对的是可选属性,循环依赖关系,构造方法注入就有点力不从心了

5.3.接口注入

接口注入需要类,实现特定的接口或继承特定的类,如此一来,依赖关系没有多大改善,是侵入性的,基本被遗弃了。Avalon,EJB容器属于这类。Spring不支持这种类型的注入。

平常开发时,setter为主,构造方法为辅,便可以达到很好的效率。如今还有注解Autowired,那就更简便了。

时间: 2024-10-09 05:39:30

Spring记录之Spring的基本概念的相关文章

项目记录:spring+springmvc 项目中 @Transactional 失效的解决方法

第一步,修改spring的配置文件和springmvc的配置文件 --------------------------------applicationContext.xml <context:annotation-config/>  <context:component-scan base-package="com.xxx"> <context:exclude-filter type="annotation" expression=&

Spring学习笔记一:基础概念

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6774310.html    一:Spring是什么 Spring的主要作用是作为对象的容器. 传统编程中,我们需要调用其他类的方法时,都是需要new一个对象,然后通过 对象.fun() 调用方法的.这样的话,一个类中又引用其他类,耦合度非常高.如果日后需要调整.修改时,比如:更换一个成员对象.则需要重新修改源代码.还有,某些对象会被重复创建,十分消耗内存,比如:Service层调用DAO层方法时重复创建.即

spring+cxf 开发webService(主要是记录遇到spring bean注入不进来的解决方法)

这里不介绍原理,只是记录自己spring+cxf的开发过程和遇到的问题 场景:第三方公司需要调用我们的业务系统,以xml报文的形式传递数据,之后我们解析报文存储到我们数据库生成业务单据: WebService的框架由多种,这里选cxf,与Spring的集成比较好: 直接看代码 1 项目用的maven,首先添加依赖(这个依赖啊  ,教程引用几个的都有,这个看需要吧,我是用了四个) <dependency> <groupId>org.apache.cxf</groupId>

自学Spring框架的几个基本概念

第一部分:基本概念 首先我们应该了解这三个框架分别是做什么的,在Java开发中具有什么样的作用,对于理清楚框架中具体的知识点是大有裨益的. 1. Spring:DI/AOP Spring对应的关键词是DI(依赖注入)与AOP(面向切面编程),可以认为是一个以DI和AOP为核心Java Web一站式的集成(粘合)框架. 其中DI也称为IoC(控制发转)用于管理Java对象之间的依赖关系(一定要说DI是IoC实现方式的童鞋们见评论区),AOP用于解耦业务代码和公共服务代码(如日志,安全,事务等).D

Spring MVC 和 Spring 总结

1. 为什么使用Spring ? 1). 方便解耦,简化开发 通过Spring提供的IoC容器,可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合. 2). AOP编程的支持 通过Spring提供的AOP功能,方便进行面向切面的编程,如性能监测.事务管理.日志记录等. 3). 声明式事务的支持 4). 方便集成各种优秀框架 5). 降低Java EE API的使用难度 如对JDBC,JavaMail,远程调用等提供了简便封装 2. 什么是IoC,为什使用IoC ?

Spring MVC 和 Spring 总结 (转载自留)

Spring MVC 和 Spring 总结 1. 为什么使用Spring ? 1). 方便解耦,简化开发 通过Spring提供的IoC容器,可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合. 2). AOP编程的支持 通过Spring提供的AOP功能,方便进行面向切面的编程,如性能监测.事务管理.日志记录等. 3). 声明式事务的支持 4). 方便集成各种优秀框架 5). 降低Java EE API的使用难度 如对JDBC,JavaMail,远程调用等提供了简便

spring(5)构建 spring web 应用程序

[0]README 1)本文部分文字描述转自:"Spring In Action(中/英文版)",旨在review  "spring(5)构建 spring web 应用程序" 的相关知识: [1]spring mvc 起步 [1.1]跟踪spring mvc的请求 1)请求时一个十分繁忙的家伙,下图展示了请求使用spring mvc所经历的 站点: 对以上调用过程的分析(Analysis):(不能再干货--请求使用spring mvc 所经历的调用过程) step

浅析Spring MVC和Spring BOOT之间的简化小秘密

从Servlet技术到Spring和Spring MVC,开发Web应用变得越来越简捷.但是Spring和Spring MVC的众多配置有时却让人望而却步,相信有过Spring MVC开发经验的朋友能深刻体会到这一痛苦.因为即使是开发一个Hello-World的Web应用,都需要我们在pom文件中导入各种依赖,编写web.xml.spring.xml.springmvc.xml配置文件等.特别是需要导入大量的jar包依赖时,我们需要在网上查找各种jar包资源,各个jar间可能存在着各种依赖关系,

从Spring MVC 到 Spring BOOT的简化道路

背景 从Servlet技术到Spring和Spring MVC,开发Web应用变得越来越简捷.但是Spring和Spring MVC的众多配置有时却让人望而却步,相信有过Spring MVC开发经验的朋友能深刻体会到这一痛苦.因为即使是开发一个Hello-World的Web应用,都需要我们在pom文件中导入各种依赖,编写web.xml.spring.xml.springmvc.xml配置文件等. 特别是需要导入大量的jar包依赖时,我们需要在网上查找各种jar包资源,各个jar间可能存在着各种依