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。