一、介绍 Spring
Spring 框架由 Rod Johnson 于 2003 年发布,旨在简化 Java 企业级应用开发。其核心思想是通过控制反转(IoC)和面向切面编程(AOP)实现松耦合和横切关注点分离。Spring 采用轻量级容器,不依赖于完整的 Java EE 应用服务器,可在普通的 Servlet 容器或独立应用中运行。
1. 控制反转(IoC)
-
概念:将对象的创建和依赖关系交给容器管理,应用只需声明依赖。
-
实现:通过
BeanFactory
或ApplicationContext
加载BeanDefinition
,并在容器启动或按需创建时完成依赖注入。
2. 面向切面编程(AOP)
-
概念:将日志、安全、事务等横切关注点从业务逻辑中抽离出来,定义为切面(Aspect)。
-
实现:基于动态代理(JDK 或 CGLIB)或编译时/加载时织入(AspectJ),在运行时对目标对象进行增强。
二、为什么要用 Spring?
-
松耦合:IoC 容器统一管理对象生命周期和依赖,模块之间不直接 new 对象,便于替换与测试。
-
关注点分离:AOP 将事务、日志、安全等功能模块化,无需在业务代码中硬编码。
-
丰富的模块生态:涵盖核心容器、数据访问、Web、消息、测试等,按需引入,避免臃肿。
-
一致的编程模型:统一的异常层次、事务抽象、资源访问接口,降低学习成本。
-
与主流技术集成:无缝支持 Hibernate、JPA、MyBatis、JMS、RabbitMQ、Kafka、Quartz、JMX 等。
-
活跃的社区与文档:大量开源项目基于 Spring,官方文档详实,社区资源丰富。
三、Spring 模块和层次结构
Spring 按功能划分为以下模块:
Spring Framework
├─ Core Container
│ ├─ spring-core
│ ├─ spring-beans
│ ├─ spring-context
│ ├─ spring-context-support
│ └─ spring-expression
├─ Data Access/Integration
│ ├─ spring-jdbc
│ ├─ spring-orm
│ ├─ spring-oxm
│ ├─ spring-jms
│ └─ spring-tx
├─ Web
│ ├─ spring-web
│ ├─ spring-webmvc
│ ├─ spring-websocket
│ └─ spring-webmvc-portlet
├─ AOP
│ └─ spring-aop
├─ Aspects
│ └─ spring-aspects
├─ Instrumentation
│ └─ spring-instrument
├─ Messaging
│ └─ spring-messaging
└─ Test
└─ spring-test
四、Core Container 核心容器
1. spring-core
-
核心类:
DefaultSingletonBeanRegistry
、ResourceLoader
、OrderComparator
等。 -
功能:提供基础工具类、IoC 容器最低层的 SPI 接口。
2. spring-beans
-
BeanDefinition:封装 bean 的配置信息,包括类名、作用域、属性、构造函数参数等。
-
BeanDefinitionReader:如
XmlBeanDefinitionReader
、AnnotatedBeanDefinitionReader
,负责将配置信息加载到BeanDefinitionRegistry
。 -
BeanFactory:最基本的容器接口,提供
getBean()
、containsBean()
等方法。 -
BeanPostProcessor &
BeanFactoryPostProcessor
:允许在 bean 实例化前后或定义加载后对其进行修改。 -
作用域:singleton、prototype、request、session 等。
3. spring-context
-
ApplicationContext:继承自
BeanFactory
,并增加国际化(i18n)、事件发布、资源访问等功能。 -
常用实现:
ClassPathXmlApplicationContext
、FileSystemXmlApplicationContext
、AnnotationConfigApplicationContext
、GenericApplicationContext
、WebApplicationContext
。 -
事件模型:
ApplicationEvent
、ApplicationListener
,支持发布与监听容器事件。 -
资源访问:统一访问 classpath、文件系统、URL 等资源。
4. spring-context-support
-
缓存:
EhCacheCacheManager
、ConcurrentMapCacheManager
等。 -
邮件:
JavaMailSenderImpl
。 -
定时任务:
TaskScheduler
、ThreadPoolTaskScheduler
。 -
JMX:
MBeanExporter
。 -
其他:
Quartz
集成、Velocity
模板支持等。
5. spring-expression (SpEL)
-
表达式语法:支持字面量、属性访问、方法调用、运算符、集合投影/选择。
-
核心类:
SpelExpressionParser
、StandardEvaluationContext
。 -
应用场景:
@Value("#{systemProperties['user.name']}")
、XML 属性替换、Spring EL 模板。
五、数据访问/集成(Data Access/Integration)
1. spring-jdbc
-
JdbcTemplate:简化 JDBC 操作,自动释放资源,抛出 Spring 统一的
DataAccessException
。 -
NamedParameterJdbcTemplate:支持命名参数,增强 SQL 可读性。
-
简化事务:通过
DataSourceTransactionManager
支持声明式和编程式事务。
2. spring-orm
-
Hibernate:
LocalSessionFactoryBean
、HibernateTemplate
、HibernateTransactionManager
。 -
JPA:
LocalContainerEntityManagerFactoryBean
、JpaTransactionManager
、JpaTemplate
。 -
MyBatis:
SqlSessionFactoryBean
、SqlSessionTemplate
,与 Spring 事务管理集成。
3. spring-oxm
-
Marshaller/Unmarshaller:
Jaxb2Marshaller
、CastorMarshaller
、XStreamMarshaller
。 -
用途:在 Spring-WS、消息转换等场景中将 Java 对象与 XML 互转。
4. spring-jms
-
JmsTemplate:简化发送/接收消息,支持转换器。
-
消息监听:
DefaultMessageListenerContainer
、SimpleMessageListenerContainer
,支持并发消费、事务。
5. spring-tx
-
PlatformTransactionManager:统一事务接口。
-
事务属性:
PROPAGATION_REQUIRED
、PROPAGATION_REQUIRES_NEW
、隔离级别、超时、只读标志。 -
声明式事务:
@Transactional
注解、TransactionInterceptor
、ProxyTransactionManagementConfiguration
。
六、Web 模块
1. spring-web
-
核心:
DispatcherServlet
、WebApplicationContext
、MultipartResolver
、HandlerMapping
、HandlerAdapter
。 -
功能:请求分发、文件上传、异常解析、拦截器。
2. spring-webmvc
-
MVC 核心:基于注解的控制器(
@Controller
、@RestController
)、@RequestMapping
、@GetMapping
等。 -
视图解析:
ViewResolver
、InternalResourceViewResolver
、ThymeleafViewResolver
、JsonView
。 -
参数绑定:
HandlerMethodArgumentResolver
,支持@RequestParam
、@PathVariable
、@RequestBody
。 -
拦截器:
HandlerInterceptor
,可在请求前后执行逻辑。 -
异常处理:
@ControllerAdvice
、@ExceptionHandler
。
3. spring-websocket
-
协议:支持原生 WebSocket 与 STOMP 协议。
-
配置:实现
WebSocketMessageBrokerConfigurer
,注册端点、消息代理。 -
模板:
SimpMessagingTemplate
,用于发送消息。
4. spring-webmvc-portlet
-
Portlet MVC:基于 JSR-168/286 规范的 Portlet 应用开发,类比于 Servlet 模型。
七、AOP 模块
-
核心类:
ProxyFactoryBean
、AdvisedSupport
、DefaultAdvisorAutoProxyCreator
。 -
通知类型:前置(Before)、后置(AfterReturning)、异常(AfterThrowing)、最终(After)、环绕(Around)。
-
切入点:
Pointcut
接口,常用实现AspectJExpressionPointcut
。 -
代理策略:默认优先使用 JDK 动态代理,接口缺失时使用 CGLIB。
八、Aspects 模块
-
集成 AspectJ:提供
@Aspect
注解支持,利用@EnableAspectJAutoProxy
激活。 -
编织方式:编译时(ajc)、类加载时(LTW)、运行时(代理)。
-
高级功能:引入共享切面、注解匹配、args、this/target 表达式。
九、Instrumentation 模块
-
目的:在运行时修改字节码,支持类加载时织入和性能监控。
-
关键接口:
LoadTimeWeaver
、InstrumentationLoadTimeWeaver
、ClassFileTransformer
。 -
应用:Spring InstrumentationAgent、JPA 运行时增强。
十、Messaging 模块
-
核心概念:消息通道(MessageChannel)、消息(Message)、消息处理器(MessageHandler)。
-
Spring Integration:企业集成模式实现,组件包括通道、网关、路由、转换器、适配器。
-
Spring for RabbitMQ/Kafka:
RabbitTemplate
、KafkaTemplate
、监听容器、事务支持。
十一、Test 模块
-
TestContext Framework:
@RunWith(SpringRunner.class)
、@ContextConfiguration
、@SpringBootTest
。 -
Web 测试:
MockMvc
、@WebMvcTest
、TestRestTemplate
。 -
事务测试:
@Transactional
在测试方法上回滚事务,保证数据隔离。 -
模拟与断言:
MockBean
、Mockito
集成、TestPropertySource
、@Sql
数据准备。
以上内容涵盖 Spring 各模块的核心类、主要功能、实现原理及典型应用场景。如需更深入的源码分析、生命周期流程或调试流程示例,请告知具体模块,我可继续补充。