Spring 源码解析 | 核心功能

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
简介: 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();
  }
}


参考文档




相关文章
|
4天前
|
XML Java 数据格式
Spring Cloud全解析:注册中心之zookeeper注册中心
使用ZooKeeper作为Spring Cloud的注册中心无需单独部署服务器,直接利用ZooKeeper服务端功能。项目通过`spring-cloud-starter-zookeeper-discovery`依赖实现服务注册与发现。配置文件指定连接地址,如`localhost:2181`。启动应用后,服务自动注册到ZooKeeper的`/services`路径下,形成临时节点,包含服务实例信息。
|
8天前
|
开发者 Python
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
32 1
|
8天前
|
开发者 Python
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
21 1
|
15天前
|
NoSQL Redis
redis 6源码解析之 ziplist
redis 6源码解析之 ziplist
16 5
|
4天前
|
算法 安全 Java
深入解析Java多线程:源码级别的分析与实践
深入解析Java多线程:源码级别的分析与实践
|
7天前
|
JavaScript 前端开发 网络协议
WebSocket在Java Spring Boot+Vue框架中实现消息推送功能
在现代Web应用中,实时消息提醒是一项非常重要的功能,能够极大地提升用户体验。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为实现实时消息提醒提供了高效且低延迟的解决方案。本文将详细介绍如何在Java Spring Boot后端和Vue前端框架中利用WebSocket实现消息提醒功能。
20 0
|
XML NoSQL Java
Spring核心(IoC) 入门解读
Spring核心(IoC) 入门解读
152 1
Spring核心(IoC) 入门解读
|
22天前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。
|
1月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
87 0
|
19天前
|
XML Java 数据库连接
Spring Boot集成MyBatis
主要系统的讲解了 Spring Boot 集成 MyBatis 的过程,分为基于 xml 形式和基于注解的形式来讲解,通过实际配置手把手讲解了 Spring Boot 中 MyBatis 的使用方式,并针对注解方式,讲解了常见的问题已经解决方式,有很强的实战意义。在实际项目中,建议根据实际情况来确定使用哪种方式,一般 xml 和注解都在用。

推荐镜像

更多