Spring底层核心原理解析

简介: Spring底层核心原理解析

一、前言

在之前我们使用文字分析过Spring的几个核心原理(IOC, DI. AOP),本章会把Spring中的Bean生命周期进行较为详细的讲解

Spring相关文章汇总(Ps:有部分还未完成):

二、Bean的创建生命周期

  • 通过推断构造方法来实例化一个对象
  • 对该对象进行依赖注入(属性赋值)
  • 依赖注入后,Spring会判断该对象是否实现了BeanNameAware接口、BeanClassLoaderAware接口、BeanFactoryAware接口,如果实现了,就表示当前对象必须实现该接口中所定义的setBeanName()、setBeanClassLoader()、setBeanFactory()方法,那Spring就会调用这些方法并传入相应的参数(Aware回调
  • 初始化前(@PostConstruct)
  • 初始化(继承InitializingBean类)
  • 初始化后(AOP)
  • 获取到代理对象

三、Spring中是通过什么方式创建对象的

在java语言中肯定是通过某个类去创建对象的, 下面是实例代码

public static void main(String[] args) {
    // 创建一个Spring对象
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    // 创建对象
    NingxuanService ningxuanService = (NingxuanService)context.getBean("ningxuanService");
    // 执行方法
    ningxuanService.test();
}
复制代码

一共分为三步走:

  • 解析Appconfig类, 获取扫描路径, 获取Bean对象
  • 扫描包下的所有类文件的注解, 如果发现 @Component, @Service, @Bean等注解的时候就会将这些注解给记录下来, 存到一个Map中
  • Spring会根据相应的规则生成对应的BeanName作为map的key, value是当前类

这个时候调用 context.getBean("BeanName")的时候就会获取到对应的实体类, 从而去创建对象

三、Bean生命周期详解

首先, 我们新建一个Config类, 设定好包扫描路径同时开启AOP

@ComponentScan("com.ningxuan")
@EnableAspectJAutoProxy
public class AppConfig {
    @Bean
    public NingxuanService ningxuanService(){
        return new NingxuanService();
    }
}
复制代码

推断构造方法

Spring在基于某个类生成Bean的时候, 会通过该类的构造方法去实例化一个对象, 但是如果这个类拥有多个构造方法的时候就会进入以下的判断

  • 只有一个构造方法, 那么不管这个构造犯法是有参的还是无参的都会使用这个构造方法
  • 如果存在多个构造方法
  • 在多个构造犯法中, 若存在无参构造方法, 则默认使用无参构造犯法
  • 若该有参构造方法上有使用 @Autowired注解, 则使用有参构造
  • 若多个构造方法皆为有参构造
  • 若构造方法上都没有加 @Autowired注解, 则报错
  • 若有某一个构造方法上加了 @Autowired注解, 则使用该构造方法
  • 若存在多个构造方法上交了 @Autowired注解, 则报错

Spring会根据入参的类型和名字去Spring中找Bean对象:

  • 先根据入参类型找, 若只找到一个, 那就直接用来作为入参
  • 如果根据类型找到多个, 则在根据入参名字来确定唯一的一个
  • 最终如果没有找到, 则报错

确定用哪个构造方法, 确定入参的Bean对象, 这个古城就叫做推断构造方法

依赖注入

通过推断构造方法得到一个对象后, Spring会判断该对象中是否存在被 @Autowired 注解了的属性, 把这些属性找出来并由Spring进行赋值

初始化前

被 @PostConstruct 注解标注的方法, 是为该bean初始化前执行的方法, 具体如下

@Component()
public class NingxuanService{
    // 初始化前执行
    @PostConstruct
    public void after(){
        System.out.println("初始化前");
    }
    public void test(){
        System.out.println("执行方法: 宁轩");
    }
}
复制代码

初始化

想要一个方法在被Spring创建对象初始化时执行, 则要将这个类继承 InitializingBean 类, 并实现 afterPropertiesSet 方法, 且要抛出异常, 具体如下

@Component()
public class NingxuanService implements InitializingBean {
    // 初始化前执行
    @PostConstruct
    public void after(){
        System.out.println("初始化前");
    }
    public void test(){
        System.out.println("执行方法: 宁轩");
    }
    // 初始化执行
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("初始化");
    }
}
复制代码

AOP

想要执行AOP, 老规矩, 在扫描类上使用注解 @EnableAspectJAutoProxy 进行标注, , 并且新建一个aop类, 使用 @Aspect和@Component 注解标注, 本次测试采用了 AOP 中的前置执行和后置执行, 具体如下:

@Aspect
@Component
public class TestAop {
    @After("execution(public void com.ningxuan.demo.service.NingxuanService.test())")
    public void TestAfter(JoinPoint joinPoint){
        System.out.println("方法执行后");
    }
    @Before("execution(public void com.ningxuan.demo.service.NingxuanService.test())")
    public void TestVefore(JoinPoint joinPoint){
        System.out.println("方法执行前");
    }
}
复制代码

执行测试

根据以上的代码, 我们执行 main 方法, 可以得到以下测试结果

网络异常,图片无法展示
|


目录
相关文章
|
6月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
6月前
|
缓存 Java 开发者
【Spring】原理:Bean的作用域与生命周期
本文将围绕 Spring Bean 的作用域与生命周期展开深度剖析,系统梳理作用域的类型与应用场景、生命周期的关键阶段与扩展点,并结合实际案例揭示其底层实现原理,为开发者提供从理论到实践的完整指导。
725 22
|
6月前
|
缓存 安全 Java
Spring Security通用权限管理模型解析
Spring Security作为Spring生态的核心安全框架,结合RBAC与ACL权限模型,基于IoC与AOP构建灵活、可扩展的企业级权限控制体系,涵盖认证、授权流程及数据库设计、性能优化等实现策略。
432 0
|
6月前
|
缓存 安全 Java
Spring Security权限管理解析
Spring Security是Spring生态中的核心安全框架,采用认证与授权分离架构,提供高度可定制的权限管理方案。其基于过滤器链实现认证流程,通过SecurityContextHolder管理用户状态,并结合RBAC模型与动态权限决策,支持细粒度访问控制。通过扩展点如自定义投票器、注解式校验与前端标签,可灵活适配多租户、API网关等复杂场景。结合缓存优化与无状态设计,适用于高并发与前后端分离架构。
448 0
|
6月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
2114 0
|
6月前
|
SQL Java 数据库连接
Spring Data JPA 技术深度解析与应用指南
本文档全面介绍 Spring Data JPA 的核心概念、技术原理和实际应用。作为 Spring 生态系统中数据访问层的关键组件,Spring Data JPA 极大简化了 Java 持久层开发。本文将深入探讨其架构设计、核心接口、查询派生机制、事务管理以及与 Spring 框架的集成方式,并通过实际示例展示如何高效地使用这一技术。本文档约1500字,适合有一定 Spring 和 JPA 基础的开发者阅读。
612 0
|
5月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
5月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
5月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。

推荐镜像

更多
  • DNS