Spring Boot Knowledge

本文最后更新于 2 分钟前,文中所描述的信息可能已发生改变。

注解

@SpringBootApplication

@SpringBootApplication 是 Spring Boot 中一个常用的注解,通常用于主类上,以标识这是一个 Spring Boot 应用。它是一个组合注解,包含了多个其他注解,这使得 Spring Boot 应用的配置更加简单和便捷。下面是对这个注解及其包含的注解的详细解析。

java
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
        type = FilterType.CUSTOM,
        classes = {TypeExcludeFilter.class}
    ), @Filter(
        type = FilterType.CUSTOM,
        classes = {AutoConfigurationExcludeFilter.class}
    )}
)
public @interface SpringBootApplication {
    // 指定要排除的自动配置类
    @AliasFor(annotation = EnableAutoConfiguration.class)
    Class<?>[] exclude() default {};

    // 指定要排除的自动配置类名称
    @AliasFor(annotation = EnableAutoConfiguration.class)
    String[] excludeName() default {};

    // 指定要扫描的基础包
    @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
    String[] scanBasePackages() default {};

    // 指定要扫描的基础包类
    @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
    Class<?>[] scanBasePackageClasses() default {};

    // 指定用于生成bean名称的生成器
    @AliasFor(annotation = ComponentScan.class, attribute = "nameGenerator")
    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

    // 指定配置类是否代理其bean方法
    @AliasFor(annotation = Configuration.class)
    boolean proxyBeanMethods() default true;
}

@SpringBootConfiguration

这个注解是 @Configuration 的特化版本,主要用于 Spring Boot 项目中,表明该类是一个配置类,可以用来定义 bean。

java
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}

@EnableAutoConfiguration

这个注解启用 Spring Boot 的自动配置机制,根据项目中的依赖和配置自动配置 Spring 应用。

java
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    // 排除某些自动配置类
    Class<?>[] exclude() default {};

    // 排除某些自动配置类的名称
    String[] excludeName() default {};
}

@ComponentScan

这个注解用于组件扫描,扫描主类所在包及其子包中的组件。

java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
    // 要扫描的基础包
    @AliasFor("basePackages")
    String[] value() default {};

    // 要扫描的基础包
    @AliasFor("value")
    String[] basePackages() default {};

    // 要扫描的基础包类
    Class<?>[] basePackageClasses() default {};

    // 指定用于生成bean名称的生成器
    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

    // 其他属性省略...
}

AOP

详情

答:AOP(Aspect-Oriented Programming,面向切面编程) 能够将那些与业务无关, 却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来, 便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。


IOC

详情

答:IoC(Inversion of Control,控制反转) 是 Spring 中一个非常非常重要的概念,它不是什么技术,而是一种解耦的设计思想。 IoC 的主要目的是借助于“第三方”(Spring 中的 IoC 容器) 实现具有依赖关系的对象之间的解耦(IOC 容器管理对象,你只管使用即可),从而降低代码之间的耦合度。


设计模式

详情

详见 helltractor blog 中单例模式

详情

Spring 中的 BeanFactory 和 ApplicationContext 就是工厂模式的体现,它们用来创建和管理对象。

  • BeanFactory:延迟注入(使用到某个 bean 的时候才会注入),相比于 ApplicationContext 来说会占用更少的内存,程序启动速度更快。
  • ApplicationContext:容器启动的时候,不管你用没用到,一次性创建所有 bean 。BeanFactory 仅提供了最基本的依赖注入支持, ApplicationContext 扩展了 BeanFactory ,除了有 BeanFactory 的功能还有额外更多功能,所以一般开发人员使用 ApplicationContext 会更多。

详情

TODO

详情

TODO

详情

如 python 中的装饰器@cache,@lru_cache 等,可以在不改变原有代码的情况下,增加新的功能

详情

TODO

详情

如 jdbcTemplate,hibernateTemplate 之类,使用时只需要继承模板类,实现部分方法即可

参见问题

详情
详情

答:@RestController 是 Spring4 之后加入的注解,是@ResponseBody 和@Controller 的组合注解,用于返回 json 数据。 @Controller 是 SpringMVC 的注解,用于标识控制器类。

详情

@Autowired 是 Spring 的注解,按类型注入,@Resource 是 J2EE 的注解,按名称注入。


@AutoWired 执行注入逻辑:

  • 核心由 AutowiredAnnotationBeanPostProcessor 实现,它是一个 BeanPostProcessor。

  • 通过反射获取字段或方法参数的类型,然后从容器中按类型获取对应的 Bean。

  • 如果存在多个类型匹配,还会继续看 @Qualifier 注解或字段名来辅助选择。

  • 如果找不到依赖但字段不是 required=false,就会抛出异常。

详情

Spring 启动时会先解析配置或注解,生成 BeanDefinition 并注册。之后通过反射创建实例,执行依赖注入,再调用生命周期回调,比如 BeanPostProcessor、InitializingBean、@PostConstruct 等。初始化完成后放入一级缓存用于单例复用,整个过程由 BeanFactory 或 ApplicationContext 接口统一管理。


  1. 定位 Bean(Resource 定位) 启动扫描类,扫描配置文件或注解类,定位到 Bean 的定义(XML、注解、JavaConfig 都支持)。

  2. 解析 Bean(BeanDefinition 解析) 将配置转换为 BeanDefinition,存入 BeanFactory 的缓存中。

  3. 实例化 Bean(Constructor or Factory Method) 通过反射创建对象实例,但此时还未注入属性。

  4. 依赖注入 populateBean() 根据 @Autowired、@Value 等注解或 XML 设置,注入所需属性。

  5. Bean 的生命周期回调

  • 调用 Aware 接口(如 BeanNameAware、ApplicationContextAware)

  • 调用 BeanPostProcessor#postProcessBeforeInitialization

  • 调用 @PostConstruct 或 InitializingBean#afterPropertiesSet

  • 调用 BeanPostProcessor#postProcessAfterInitialization

  1. 初始化完成,放入一级缓存 可以被外部依赖使用的 Bean 才会进入一级缓存,供单例复用。

  2. 销毁阶段(可选) 如果实现了 DisposableBean 或配置了 @PreDestroy,会在销毁时调用。

:::

参考

Common Resources for Materials Calculation