spring是什么

来源:互联网 发布:阿姆斯特丹大学 知乎 编辑:程序博客网 时间:2024/06/05 00:13
    简单来说,Spring就是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。下面从整体上认识一下Spring的主要特征:轻量:从大小与开销两方面而言Spring都是轻量的。此外,Spring是非侵入式的:使用Spring,我们的类还是pojo类,完全不用继承和实现Spring的类和接口等。也就是说,使用Spring的应用中的对象不依赖于Spring的特定类。IoC:Spring通过控制反转技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。可以认为IoC与JNDI相反——不是我们自己控制对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它,这就是DI--依赖注入。基本上就是对象不用自己动手管理和创建。完全由容器管理,我们只管用就行。AOP:Spring提供了面向切面的编程支持,AOP将与程序业务无关的内容分离提取,应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。AOP将与业务无关的逻辑横切进真正的逻辑中。框架:Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),而用户就有更多的时间和精力去开发应用逻辑。所有Spring的这些特征都能帮助我们够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。
  • 利用AOP思想,集中处理业务逻辑,减少重复代码,构建优雅的解决方案。
  • 借助Spring的IoC依赖注入,AOP应用,面向接口编程,来降低业务组件之间的耦合度,增强系统的扩展性。
  • 让已有的技术和框架更加易用。
  • 利用其对hibernate/Mybatis的SessionFactory、事务管理的封装,更简洁的应用hibernate/Mybatis。
  • Spring并不完全依赖于Spring.jar,开发者可自由选用Spring框架的部分或全部。
  • 低侵入式设计,代码污染极低。
Spring致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以说Spring是企业应用开发的“一站式"选择,并贯穿表现层、业务层及持久层。虽然Spring可以一站式解决整个项目问题,但是Spring并不想取代那些已有的框架,而是与它们无缝地整合。Spring可以降低 各种框架的使用难度,他提供了对各种优秀框架(如Struts、Hibernate、Mybatis、Quartz等)的直接支持。 使用Spring的主要目的是使J2EE易用和促进好的编程习惯,Spring的目标就是让已有的技术更加易用。所以Spring的一个重要思想就是整合和兼容。

spring(基于注解)
使用spring前,需要在web.xml中配置如下监听器:
<listener>
  <description>spring监听器</description>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

spring的相关jar包说明:
http://www.hongyanliren.com/2015m02/31561.html

Spring框架有两大核心:IOC和AOP。

Spring IOC
大家在网上搜IOC,一定会找到DI的概念,其实IOC与DI讲的是一个意思,他们只是从两个角度描述了Spring IOC容器管理对象依赖关系。
IOC控制反转:说的是创建对象实例的控制权从代码空值剥离到IOC容器控制,实际就是你的xml文件控制,侧重于原理;
DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其它对象实例,侧重实现。
IOC的作用:
  • 大量减少了Factory和Singleton的数量,使代码层次更加清晰,主要原因是我们不再查找、定位、创建和管理对象之间的依赖关系了,都交给IOC容器管理了。
  • Spring的IOC容器是一个轻量级的容器,没有侵入性,不需要依赖容器的API,也不需要实现一些特殊接口;
  • 更好的管理java对象,更好的面向接口编程;
  • 解耦合,将耦合推迟到配置文件中,发生变化也更加容器控制。
    总之,就是一句话:类之间的依赖关系,不再由类自己去负责,而是由容器根据配置文件去创建实例,并维护各个实例之间的依赖关系。
    DI依赖注入是一个很大的概念,它有两种类型依赖注入(Dependency Injection)和依赖查找(Dependency Lookup)。Spring就是采用依赖注入。组件不做定位查询,只是提供普通的Java方法,让容器去读取配置文件,决定依赖关系。容器全全负责组件的装配,它把符合依赖关系的对象通过JavaBean属性或者构造子传递给需要的对象。通过JavaBean属性注入依赖关系的做法叫做设置方法注入(Setter Inection);将依赖关系作为构造子参数传入的做法叫做构造子注入(Constructor Inection)。所说的也就是Spring中的两种依赖注入的方式:setter方法注入、构造方法注入。我们主要使用setter方法注入。
    Spring是怎样实现控制反转、依赖注入的:工厂模式+反射的综合运用。

Spring AOP
  • 切面:通知和切入点共同定义了关于切面的全部内容——它是什么,在何时何处完成其功能(what、when和where)。
  • 切入点:一组符合某种规则的连接点,通俗的讲是所有调用某方法的位置。(where)
  • 连接点:狭义上通俗的讲指的是某个方法。
  • 通知:在某个连接点上的某种操作,该操作并非连接点中的操作,而是外来的操作。 (what、when)






Spring使用注解方式,需要了解一下<context annotation-config />标签意义: 
该标签隐式的向Spring容器注册了:
AutowiredAnnotationBeanPostProcessor   CommondAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor   RequiredAnnotationBeanPostProcessor这四个BeanPostProcessor.
  • AutowiredAnnotationBeanPostProcessor:主要是使用@AutoWired注解时,必须提前向Spring容器注册这个BeanPostprocessor。传统配置方式:<bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/>
  • CommondAnnotationBeanPostprocessor:主要是使用@Resource、@PostConstruct、@Predestory等注解时,必须提前向Spring容器注册。传统配置方式:<bean class="org.springframework.beans.factory.annotation.CommondAnnotationBeanPostprocessor"/>
  • PersistenceAnnotationBeanPostProcessor :主要是使用@PersistenceContext注解时,必须提前向Spring容器注册。传统配置方式:<bean class="org.springframework.beans.factory.annotation.PersistenceAnnotationBeanPostProcessor"/>
  • RequiredAnnotationBeanPostProcessor:主要是使用@Required注解时,必须提前向Spring容器注册。传统配置方式:<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>
    一般来说,@Autowired、@Resource注解比较常用,传统配置方式有点繁琐,而这种隐式配置方式就可以帮我们很容易的搞定。
    不过使用注解,我们一般都会配置扫描包路径:<context: component-scan base-package=com.xxx.xxx />
其实,给配置已经包含了自动注入上述Processor的功能,所以,配置了包扫描之后,<context annotation-config />就可以移除了。
0 0
原创粉丝点击