Spring 详解
概述
Spring是Java企业级开发的一站式选择,它的出现终结了重量级Java企业开发技术(EJB 2.x)的时代。Spring使用了更简单、更轻量级的编程模型,使得基于POJO开发Java企业级应用成为可能,同时也影响了Java EE技术的发展方向,今天的EJB中也提供了依赖注入和面向切面编程等理念,这些都是受Spring的启发和影响。今天的Spring框架已经涉及到移动开发、社交API集成、NoSQL、云计算、大数据等很多领域,为简化Java开发做出了极大的贡献。
Spring在降低企业级开发复杂性上做了以下工作:
1.基于POJO的轻量级和最小侵入性编程;
2.通过依赖注入和面向接口编程实现解耦合;
3.基于切面和约定(惯例)实现声明式编程;
4.通过切面和模板减少乏味的代码。
POJO
Spring不强迫你实现Spring的接口或继承Spring的类,应用中可以没有Spring的痕迹。Spring赋予POJO魔力的方式之一就是通过依赖注入来完成对象的装配。
依赖注入(DI)
通过DI,对象无需自行创建或管理它们的依赖关系,依赖关系将会被自动注入到需要它们的对象当中去。
面向切面编程(AOP)
DI能够让相互协作的软件组件保持松散耦合,而AOP允许你把遍布应用各个角落的功能分离出来形成可重用的组件。系统通常由许多不同的组件构成,每一个组件都负责一项特定的功能,但是除了核心功能外,这些组件通常还需要诸如日志、事务管理和安全这样的额外职责,这些服务通常被称为横切关注点,因为它们会跨越多个组件。如果这些关注点分散到多个组件中去,你的代码维护起来就会非常头疼,而且逻辑会变得相当混乱。
AOP通过声明的方式将服务模块应用到需要这些服务的组件中,从而保证了POJO的简单性。
风景线
- 核心容器:最核心的部分,管理Bean的创建、配置和管理。
BeanFactory
AnnotationConfigApplicationContext
AnnotationConfigWebApplicationContext
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
XmlWebApplicationContext
- AOP模块:通过AOP可以将遍布系统各个角落的横切关注功能(事务和安全)从它们所作用的对象中解耦合出来
- 数据访问和集成:直接使用JDBC访问数据库会导致大量的样板代码,Spring封装的JDBC和DAO模块抽象了这些样板代码;另外Spring提供了对ORM的支持,可以集成Hibernate、MyBatis、JDO等ORM框架并为其提供事务管理支持。
- Web模块:Spring提供了对表示层MVC框架的集成,自己也提供了非常强大的MVC框架;同时Spring对实现REST API也提供了很好的支持。
- 测试模块:对单元测试以及mock都提供了很好的支持。
- Spring Web Flow:对基于流程的会话式Web应用提供了支持。
- Spring Web Service:契约优先的Web Service模型。
- Spring Batch:开发批处理应用,如对数据进行大量操作。
- Spring Data:让Spring中使用关系型数据库和NoSQL(文档数据库、图数据库)都变得很容易,为JPA开发提供了简化。
- Spring Social:社交网络扩展模块(注意针对Facebook或Twitter)。
- Spring Mobile:支持移动Web应用开发的模块。
- Spring Boot:简化众多编程任务,消除大量样板代码,使用自动配置技术简化Spring。
4.x新功能
- 对WebSocket的支持
- 在WebSocket基础上提供了基于SockJS的面向消息的编程模型,包含了对STOMP协议的支持
- 支持Java 8的新特性
- 支持完全采用Groovy开发Spring应用程序
- 条件化创建Bean的功能
- 对多项JEE规范的支持,包括JMS 2.0、JTA 1.2、JPA 2.1和Bean Validation 1.1
IoC容器
-
Spring配置的可选方案:
1.在XML中进行显式配置
2.在Java中进行显式配置
3.隐式的Bean发现和自动装配机制 -
依赖注入方式:
1.构造器注入
2.setter注入
3.接口注入
说明:Spring中支持前两种注入方式。对于对象的必要属性建议用构造器注入;而对象的非必要属性推荐使用setter注入
使用AOP
-
什么是AOP
-
AOP的术语:
1.Advice(通知/增强)
2.JoinPoint(连接点)
3.PointCut(切点)
4.Aspect(切面)
5.Introdution(引入)
6.Weaving(织入) -
Spring对AOP的支持
1.基于代理
2.纯POJO切面
3.@AspectJ注解驱动的切面
4.注入式AspectJ切面
Spring注解
@Scope("prototype")
@EnableAspectJAutoProxy 切面需要用到代理
@Primary 首选
面向切面编程有很多种实现方案
AspectJ - Xerox - 施乐
@Aspect
网友评论