Spring原理之概述spring

一、介绍 Spring

Spring 框架由 Rod Johnson 于 2003 年发布,旨在简化 Java 企业级应用开发。其核心思想是通过控制反转(IoC)和面向切面编程(AOP)实现松耦合和横切关注点分离。Spring 采用轻量级容器,不依赖于完整的 Java EE 应用服务器,可在普通的 Servlet 容器或独立应用中运行。

1. 控制反转(IoC)

  • 概念:将对象的创建和依赖关系交给容器管理,应用只需声明依赖。

  • 实现:通过 BeanFactoryApplicationContext 加载 BeanDefinition,并在容器启动或按需创建时完成依赖注入。

2. 面向切面编程(AOP)

  • 概念:将日志、安全、事务等横切关注点从业务逻辑中抽离出来,定义为切面(Aspect)。

  • 实现:基于动态代理(JDK 或 CGLIB)或编译时/加载时织入(AspectJ),在运行时对目标对象进行增强。

二、为什么要用 Spring?

  1. 松耦合:IoC 容器统一管理对象生命周期和依赖,模块之间不直接 new 对象,便于替换与测试。

  2. 关注点分离:AOP 将事务、日志、安全等功能模块化,无需在业务代码中硬编码。

  3. 丰富的模块生态:涵盖核心容器、数据访问、Web、消息、测试等,按需引入,避免臃肿。

  4. 一致的编程模型:统一的异常层次、事务抽象、资源访问接口,降低学习成本。

  5. 与主流技术集成:无缝支持 Hibernate、JPA、MyBatis、JMS、RabbitMQ、Kafka、Quartz、JMX 等。

  6. 活跃的社区与文档:大量开源项目基于 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

  • 核心类DefaultSingletonBeanRegistryResourceLoaderOrderComparator 等。

  • 功能:提供基础工具类、IoC 容器最低层的 SPI 接口。

2. spring-beans

  • BeanDefinition:封装 bean 的配置信息,包括类名、作用域、属性、构造函数参数等。

  • BeanDefinitionReader:如 XmlBeanDefinitionReaderAnnotatedBeanDefinitionReader,负责将配置信息加载到 BeanDefinitionRegistry

  • BeanFactory:最基本的容器接口,提供 getBean()containsBean() 等方法。

  • BeanPostProcessor & BeanFactoryPostProcessor:允许在 bean 实例化前后或定义加载后对其进行修改。

  • 作用域:singleton、prototype、request、session 等。

3. spring-context

  • ApplicationContext:继承自 BeanFactory,并增加国际化(i18n)、事件发布、资源访问等功能。

  • 常用实现ClassPathXmlApplicationContextFileSystemXmlApplicationContextAnnotationConfigApplicationContextGenericApplicationContextWebApplicationContext

  • 事件模型ApplicationEventApplicationListener,支持发布与监听容器事件。

  • 资源访问:统一访问 classpath、文件系统、URL 等资源。

4. spring-context-support

  • 缓存EhCacheCacheManagerConcurrentMapCacheManager 等。

  • 邮件JavaMailSenderImpl

  • 定时任务TaskSchedulerThreadPoolTaskScheduler

  • JMXMBeanExporter

  • 其他Quartz 集成、Velocity 模板支持等。

5. spring-expression (SpEL)

  • 表达式语法:支持字面量、属性访问、方法调用、运算符、集合投影/选择。

  • 核心类SpelExpressionParserStandardEvaluationContext

  • 应用场景@Value("#{systemProperties['user.name']}")、XML 属性替换、Spring EL 模板。

五、数据访问/集成(Data Access/Integration)

1. spring-jdbc

  • JdbcTemplate:简化 JDBC 操作,自动释放资源,抛出 Spring 统一的 DataAccessException

  • NamedParameterJdbcTemplate:支持命名参数,增强 SQL 可读性。

  • 简化事务:通过 DataSourceTransactionManager 支持声明式和编程式事务。

2. spring-orm

  • HibernateLocalSessionFactoryBeanHibernateTemplateHibernateTransactionManager

  • JPALocalContainerEntityManagerFactoryBeanJpaTransactionManagerJpaTemplate

  • MyBatisSqlSessionFactoryBeanSqlSessionTemplate,与 Spring 事务管理集成。

3. spring-oxm

  • Marshaller/UnmarshallerJaxb2MarshallerCastorMarshallerXStreamMarshaller

  • 用途:在 Spring-WS、消息转换等场景中将 Java 对象与 XML 互转。

4. spring-jms

  • JmsTemplate:简化发送/接收消息,支持转换器。

  • 消息监听DefaultMessageListenerContainerSimpleMessageListenerContainer,支持并发消费、事务。

5. spring-tx

  • PlatformTransactionManager:统一事务接口。

  • 事务属性PROPAGATION_REQUIREDPROPAGATION_REQUIRES_NEW、隔离级别、超时、只读标志。

  • 声明式事务@Transactional 注解、TransactionInterceptorProxyTransactionManagementConfiguration

六、Web 模块

1. spring-web

  • 核心DispatcherServletWebApplicationContextMultipartResolverHandlerMappingHandlerAdapter

  • 功能:请求分发、文件上传、异常解析、拦截器。

2. spring-webmvc

  • MVC 核心:基于注解的控制器(@Controller@RestController)、@RequestMapping@GetMapping 等。

  • 视图解析ViewResolverInternalResourceViewResolverThymeleafViewResolverJsonView

  • 参数绑定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 模块

  • 核心类ProxyFactoryBeanAdvisedSupportDefaultAdvisorAutoProxyCreator

  • 通知类型:前置(Before)、后置(AfterReturning)、异常(AfterThrowing)、最终(After)、环绕(Around)。

  • 切入点Pointcut 接口,常用实现 AspectJExpressionPointcut

  • 代理策略:默认优先使用 JDK 动态代理,接口缺失时使用 CGLIB。

八、Aspects 模块

  • 集成 AspectJ:提供 @Aspect 注解支持,利用 @EnableAspectJAutoProxy 激活。

  • 编织方式:编译时(ajc)、类加载时(LTW)、运行时(代理)。

  • 高级功能:引入共享切面、注解匹配、args、this/target 表达式。

九、Instrumentation 模块

  • 目的:在运行时修改字节码,支持类加载时织入和性能监控。

  • 关键接口LoadTimeWeaverInstrumentationLoadTimeWeaverClassFileTransformer

  • 应用:Spring InstrumentationAgent、JPA 运行时增强。

十、Messaging 模块

  • 核心概念:消息通道(MessageChannel)、消息(Message)、消息处理器(MessageHandler)。

  • Spring Integration:企业集成模式实现,组件包括通道、网关、路由、转换器、适配器。

  • Spring for RabbitMQ/KafkaRabbitTemplateKafkaTemplate、监听容器、事务支持。

十一、Test 模块

  • TestContext Framework@RunWith(SpringRunner.class)@ContextConfiguration@SpringBootTest

  • Web 测试MockMvc@WebMvcTestTestRestTemplate

  • 事务测试@Transactional 在测试方法上回滚事务,保证数据隔离。

  • 模拟与断言MockBeanMockito 集成、TestPropertySource@Sql 数据准备。


以上内容涵盖 Spring 各模块的核心类、主要功能、实现原理及典型应用场景。如需更深入的源码分析、生命周期流程或调试流程示例,请告知具体模块,我可继续补充。