Spring 源码解析 | 核心功能

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Spring 框架是以简化 JAVA EE 应用程序的开发为目标而创建的,它为企业级开发提供了丰富的功能,但这些功能的底层都依赖于他的两个核心特性:依赖注入(DI)和面向切面编程(AOP)。

Spring 框架是以简化 JAVA EE 应用程序的开发为目标而创建的,它为企业级开发提供了丰富的功能,但这些功能的底层都依赖于他的两个核心特性:依赖注入(DI)和面向切面编程(AOP)。


本文主要是讲 Spring 在项目中 Bean 容器如何初始化。环境概述:


  • JDK 11


  • Spring 5.3.10-SNAPSHOT


简单案例


下面是一个简单的 Spring Bean 容器使用的案例:


// 创建容器
AnnotationConfigApplicationContext applicationContext =  new AnnotationConfigApplicationContext(AppConfig.class);
// 获取 Bean 对象
UserService serviceService = applicationContext.getBean(UserService.class);
// 打印 Bean 对象
System.out.println(serviceService);


在这个例子中,我们可以看到 Spring 的使用非常简单。 往往大家都会有这个问题:我们为什么要使用 Spring? Spring 能给我们提供哪些开发能力?


  1. 还有就是 Spring 本身是一个 Bean 容器,可以帮我们管理对象。例如:默认创建单实例 Bean, 也可以通过标记快速创建原型对象,解决了我们在对象引用,或者对象回收的一系列的问题。


  1. Spring 还能能够提供快速的和三方框架的整合能力比如:MyBatis,MVC,RocketMQ 等常用中间件。


下面我们将从 Bean 的创建, Aop 实现,Transaction 实现等三个方面来学习 Spring 的基本使用。


Bean 创建


Bean 的定义


Spring Bean 是 Spring 通过 Spring 容器创建的 Java 对象。它们被 Spring IOC 容器初始化、装配和管理。这些 Bean 通过容器中配置的元数据创建。


Spring 框架中定义的 Bean 默认都是单例的。可以通过 @Scope("singleton") 注解进行标记,如果需要申明为原型 Bean 那么就可以用 @Scope("prototype")


如何创建 Bean


我们可以在方法上增加 @Bean 注解进行创建 Bean ,或者在类上面增加 @Component� 如下所示:


// bean 注解
@Bean
private UserService user() {
    return new UserService();
}
@Component
public class UserService {
}


Aop 实现


申明切面


@Aspect
public class UserAspect {
  //匹配所有ServiceImpl包下面的所有类的所有方法
  @Pointcut("execution(* com.ctc.ServiceImpl.*.*(..))")
  public void addLog(){}
}


定义 Advice


Advice注解一共有五种,分别是:1.@Before前置通知前置通知在切入点运行前执行,不会影响切入点的逻辑2.@After后置通知后置通知在切入点正常运行结束后执行,如果切入点抛出异常,则在抛出异常前执行3.@AfterThrowing异常通知异常通知在切入点抛出异常前执行,如果切入点正常运行(未抛出异常),则不执行4.@AfterReturning返回通知返回通知在切入点正常运行结束后执行,如果切入点抛出异常,则不执行5.@Around环绕通知环绕通知是功能最强大的通知,可以在切入点执行前后自定义一些操作。环绕通知需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行 举个例子:


//使用 addLog 这个切入点进行增强
@Before("addLog()")
public void before() {
    System.out.println("before 前置通知......");
}


使用代理对象


申明 UserService


@Component
public class UserService {
  public void test() {
    System.out.println("orderService:" + orderService);
  }
}


调用 test 方法


public class AopTest {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext applicationContext =
        new AnnotationConfigApplicationContext(AppConfig.class);
    UserService serviceService = applicationContext.getBean(UserService.class);
    serviceService.test();
  }
}
// AppConfig.java
@Import(UserAspect.class)
@Configurable
public class AppConfig {
  @Bean
  private UserService userService() {
    return new UserService();
  }
}


参考文档




相关文章
|
15天前
|
数据采集 人工智能 Java
1天消化完Spring全家桶文档!DevDocs:一键深度解析开发文档,自动发现子URL并建立图谱
DevDocs是一款基于智能爬虫技术的开源工具,支持1-5层深度网站结构解析,能将技术文档处理时间从数周缩短至几小时,并提供Markdown/JSON格式输出与AI工具无缝集成。
79 1
1天消化完Spring全家桶文档!DevDocs:一键深度解析开发文档,自动发现子URL并建立图谱
|
16天前
|
安全 Java API
深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题
本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。
79 2
|
1月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `<appender>` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `<logger>` 和 `<root>` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
155 1
|
16天前
|
前端开发 安全 Java
Spring Boot 便利店销售系统项目分包设计解析
本文深入解析了基于Spring Boot的便利店销售系统分包设计,通过清晰的分层架构(表现层、业务逻辑层、数据访问层等)和模块化设计,提升了代码的可维护性、复用性和扩展性。具体分包结构包括`controller`、`service`、`repository`、`entity`、`dto`、`config`和`util`等模块,职责分明,便于团队协作与功能迭代。该设计为复杂企业级应用开发提供了实践参考。
50 0
|
12天前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
169 70
|
24天前
|
存储 前端开发 JavaScript
调用DeepSeek API增强版纯前端实现方案,支持文件上传和内容解析功能
本方案基于DeepSeek API增强版,提供纯前端实现的文件上传与内容解析功能。通过HTML和JavaScript,用户可选择文件并调用API完成上传及解析操作。方案支持多种文件格式(如PDF、TXT、DOCX),具备简化架构、提高响应速度和增强安全性等优势。示例代码展示了文件上传、内容解析及结果展示的完整流程,适合快速构建高效Web应用。开发者可根据需求扩展功能,满足多样化场景要求。
|
16天前
|
Java 关系型数据库 MySQL
深入解析 @Transactional——Spring 事务管理的核心
本文深入解析了 Spring Boot 中 `@Transactional` 的工作机制、常见陷阱及最佳实践。作为事务管理的核心注解,`@Transactional` 确保数据库操作的原子性,避免数据不一致问题。文章通过示例讲解了其基本用法、默认回滚规则(仅未捕获的运行时异常触发回滚)、因 `try-catch` 或方法访问修饰符不当导致失效的情况,以及数据库引擎对事务的支持要求。最后总结了使用 `@Transactional` 的五大最佳实践,帮助开发者规避常见问题,提升项目稳定性与可靠性。
137 11
|
1月前
|
人工智能 API 语音技术
HarmonyOS Next~鸿蒙AI功能开发:Core Speech Kit与Core Vision Kit的技术解析与实践
本文深入解析鸿蒙操作系统(HarmonyOS)中的Core Speech Kit与Core Vision Kit,探讨其在AI功能开发中的核心能力与实践方法。Core Speech Kit聚焦语音交互,提供语音识别、合成等功能,支持多场景应用;Core Vision Kit专注视觉处理,涵盖人脸检测、OCR等技术。文章还分析了两者的协同应用及生态发展趋势,展望未来AI技术与鸿蒙系统结合带来的智能交互新阶段。
117 31
|
16天前
|
SQL 前端开发 Java
深入理解 Spring Boot 项目中的分页与排序功能
本文深入讲解了在Spring Boot项目中实现分页与排序功能的完整流程。通过实际案例,从Service层接口设计到Mapper层SQL动态生成,再到Controller层参数传递及前端页面交互,逐一剖析每个环节的核心逻辑与实现细节。重点包括分页计算、排序参数校验、动态SQL处理以及前后端联动,确保数据展示高效且安全。适合希望掌握分页排序实现原理的开发者参考学习。
41 4
|
17天前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
81 5

推荐镜像

更多
下一篇
oss创建bucket