Spring简介 01

Spring简介

Spring核心:依赖注入(DI)和面向切面编程(AOP)

Spring意义

为了降低java开发的复杂性,Spring采取了以下4种关键策略:

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

依赖注入

  • 解耦。减少对其他类的依赖,面向接口编程
  • 简化测试

构造器注入

public class A {
    private B b;
    public A(B b) {
        this.b = b;
    }
}

setter注入

public class A {
    private B b;
    public void setB(B b) {
        this.b = b;
    }
}

可以看出A中的b对象由构造器注入,与B类型有关,与B的实现无关,这样B类型就是一种抽象类型。

如何将B的实现传递给A?这个组件之间协作的行为称之为装配。

<bean id="a" class="A">
    <constructor-arg ref="b" />
</bean>
<bean id="b" class="B" />

这样就可以将B的对象注入到A中了。

启动

Spring通过应用上下文(ApplicationContext)装载Bean的定义,并把它们组装起来。

ApplicationContext的实现有很多种,Spring 上下文装载实现

  • ClassPathXmlApplicationContext:从类路径下的XML装载配置文件
  • FileSystemXmlapplicationcontext:读取文件系统下的XML配置文件并加载上下文定义
  • XmlWebApplicationContext:读取web应用下的XML配置文件并装载上下文定义

面向切面编程AOP

将分布在各个地方的同一功能统一起来,形成可重用的组件。也就是找横切点的过程。

  • 日志
  • 事务
  • 安全控制

比如A做某件事之前需要打印日志,做完之后也要打印日志,打印日志和A做这件事本身并没有关系,这只是为了监控分析日志而做的事,所以可以将诸如此类的打印日志做成一个横切点,统一去做,这样的好处是,不会忘记打印日志,而且需要改动时,也无需每一处都改,改动AOP的横切点实现一改全改。

<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>

Bean的生命周期

  • Spring对Bean进行实例化
  • Spring将值和Bean的引用注入进Bean对应的属性中
  • 如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()接口方法
  • 如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()接口方法,将BeanFactory容器实例传入
  • 如果Bean实现了ApplicationContextAware接口,Spring将调用setApplicationcontext()接口方法,将应用上下文的引用传入
  • 如果Bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()接口方法
  • 如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()接口方法。类似地,如果Bean使用init-method声明了初始化方法,该方法也会被调用。
  • 如果Bean实现了BeanPostProcessor接口,Spring将调用它们的postPoressAfterInitialization()方法。
  • 此时此刻,Bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁。
  • 如果Bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果Bean使用destroy-method声明了销毁方法,该方法也会被调用。

Spring模块

Spring Portfolio

  • Spring Web Flow:基于流程的会话式Web应用
  • Spring Web Services
  • Spring Security:声明式的安全机制
  • Spring Integration:参考《Spring Integration in Action》
  • Spring Batch:批量操作
  • Spring Data:支持各种数据库,包含Mongodb等nosql
  • Spring Social:社交
  • Spring Mobile
  • Spring for Android:安卓
  • Spring Dynamic Modules:整合了Spring的声明式依赖注入和OSGi的动态组件模型
  • Spring LDAP:基于模板的LDAP访问
  • Spring Rich Client
  • Spring .NET
  • Spring-Flex
  • Spring Roo
  • Spring Extensions
  • Spring Boot:微服务

Spring2.5新特性

  • 使用@Autowired实现基于注解驱动的依赖注入和使用@Qualifier实现细粒度的自动装配控制
  • 支持JSR-250注解,包括支持命名资源依赖注入的@Resource,以及对生命周期方法支持的@PostConstruct和@ProDestroy
  • 自动扫描使用@Component注解(或其他构造型注解)所标注的Spring组件。
  • 一个全新的基于注解驱动的Spring MVC编程模型,极大简化了Spring Web开发
  • 基于Junit4和注解的一个新的集成测试框架
  • 完全支持Java6和JavaEE5,涵盖JDBC4.0、JTA1.1、JavaMail1.4和JAX-WS2.0
  • 通过Bean的名字来编织切面的新的Bean命名切入点表达式
  • 内嵌支持AspectJ的类加载器织入
  • 新的XML命名空间,包括配置应用上下文细节的context命名空间和配置消息驱动Bean的jms命名空间
  • 支持在SqlJdbcTemplate中使用命名参数

Spring 3.0新特性

  • Spring MVC全面支持Rest,Spring MVC控制器响应REST风格的URL并返回XML、JSON、RSS或者其他适宜的响应
  • 新的表达式语言把Spring的依赖注入带到了一个新的高度,允许注入各种来源,包含其他Bean和系统属性。
  • Spring MVC新的注解,包含@CookieValue和@RequestHeader,分别从Cookie和请求头中获取值。
  • 一个新的XML命名空间,用来减少Spring MVC配置
  • 支持基于JSR-302注解的声明式检验
  • 支持新的JSR-330依赖注入规范
  • 通过注解驱动声明异步和调用方法
  • 一个新的注解驱动的配置模型,几乎可以避免使用XML进行Spring配置
  • Spring Web Service项目的OXM功能已被迁移到Spring框架核心
    需要java1.5以上版本

Spring 3.1新特性

  • 为了解决从多种环境(例如开发,测试,与发布)选择独立的配置的问题,Spring 3.1引入了环境资料(profile)。资料使得一些事情成为可能,例如,依赖于应用的环境选择不同的数据源bean。
  • 建立在Spring 3.0的基于Java的配置的基础上,Spring 3.1添加了多个enable注解以允许Spring用一个注解来进行特定特性的切换。
  • 声明式缓存支持被引入了Spring,使得我们可以利用简单的注解来声明缓存边界与规则,这与我们如何声明事务边界相类似。
  • 一个新的c命名空间带来了构造器注入,与Spring 2.0的p命名空间类似(用于属性注入),简化了配置方法。
  • Spring开始支持Servlet 3.0,包括利用基于Java的配置方法声明servlet和filter,来取代原来的web.xml。
  • Spring JPA的改进使得我们可以完全的配置JPA,而不需要persistence.xml。
  • Spring 3.1还包括了多个对Spring MVC的增强:
  • path variables到model attributes的自动绑定
  • @RequestMappingproduces和consumes属性,为了匹配请求的Accept和Content-Type头
  • @RequestPart注解,允许绑定部分的multipart请求到handler 方法参数
  • flush属性支持(重定向的属性),和一个RedirectAttributes类型来在请求见传递flash属性

Spring 3.2新特性

  • Spring 3.2 controllers可以充分利用Servlet 3的异步请求,将请求的处理传给多个分离的线程,释放servlet线程以处理更多的请求。
  • 虽然Spring MVC controllers自Spring 2.5起就可以简单地作为POJO进行测试,Spring 3.2包含了一个Spring MVC测试框架,以针对controllers编写更加丰富的测试,作为controller来预警它们的行为,而不需要servler container。
  • 除了改进controller测试,Spring 3.2包含了对测试基于RestTemplate的客户端的支持,而不需要发送请求到真实的REST终端。
  • 一个@ControllerAdvice注解允许普通的@ExceptionHandler,@InitBinder,@ModelAttributes方法可以出现在单一的类中,并且运用到所有的controllers。
  • 在Spring 3.2之前,全内容协议(full content negotiation)仅仅可以通过ContentNegotiationViewResolver来支持。但是在Spring 3.2中,全内容协议在整个Spring MVC中都是可用的,甚至在一个依赖于消息转换的controller方法。
  • Spring MVC 3.2包含了一个新的@MatrixVariable注解,已绑定一个请求的矩阵变量来处理方法参数。
  • 抽象基类AbstractDispatcherServletInitializer可以用来方便的配置DispatcherServlet,而不使用web.xml。同样,它的子类AbstractAnnotationConfigDispatcherServletInitializer可以在配置基于Java的Spring配置方法时使用。
  • 添加了ResponseEntityExceptionHandler类作为DefaultHandlerExceptionResolver的备用而使用。ResponseEntityExceptionHandler方法返回ResponseEntity而不是ModelAndView。
  • RestTemplate和@RequestBody参数支持通用类型。
  • RestTemplate和@RequestMapping方法支持HTTP PATCH方法。
  • 映射拦截器支持URL模式,以排除在拦截处理之外。

虽然Spring MVC是Spring 3.2的主要部分,它还加入了一些非MVC的改进。这里是一些最有趣的新特性:

  • @Autowired,@Value和@Bean注解可以作为meta-annotations使用,以创建定制化注入和bean声明注解。
  • @DateTimeFormat注解不再依赖于JodaTime。如果出现了JodaTime,它将被使用。否则,使用SimpleDateFormat。
  • Spring的声明式缓存支持开始初始化支持JCache 0.5。
  • 你可以定义全局formats以转换和处理日期和时间。
  • 集成测试可以配置和载入WebApplicationContext。
  • 集成测试可以测试request和session范围的beans。

Spring4.0新特性

  • Spring现在包含了对WebSocket编程的支持,包括JSR-356: Java API for WebSocket。
  • 意识到WebSocket提供了一个低级的API,特别需要高级的抽象。Spring 4.0包含了一个高级的面向消息的编程模型,在WebSocket之上,基于SockJS,并且包含了STOMP子协议支持。
  • 一个来自Spring集成项目的带有多种类型的消息模块。这个消息模块支持Sprig的SockJS/STOMP支持。它还包含发布消息的基于模板的支持。
  • Spring 4.0是最早支持Java 8特性(包含 lambdas)的框架之一。这使得利用回调接口(例如使用JdbcTemplate的RowMapper)更加的干净易读。
  • 为基于Groovy开发的应用带来了更加平滑的编程体验,最重要的是让Spring应用可以完全用Groovy来轻松开发。利用来自Grails的BeanBuilder,使Spring应用能够使用Groovy来配置。
  • 为有条件的bean的创建提供了更加通用的支持,其中,bean只能在条件允许的情况下被创建。
  • Spring 4.0还包含了Spring的RestTemplate的异步实现,直接返回,但是在操作完成之后回调。
  • 添加了许多JEE规范的支持,包括JMS 2.0,JTA 1.2,JPA 2.1和Bean Validation 1.1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值