本文最后更新于 2 分钟前,文中所描述的信息可能已发生改变。
注解
@SpringBootApplication
@SpringBootApplication
是 Spring Boot 中一个常用的注解,通常用于主类上,以标识这是一个 Spring Boot 应用。它是一个组合注解,包含了多个其他注解,这使得 Spring Boot 应用的配置更加简单和便捷。下面是对这个注解及其包含的注解的详细解析。
@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。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
@EnableAutoConfiguration
这个注解启用 Spring Boot 的自动配置机制,根据项目中的依赖和配置自动配置 Spring 应用。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
// 排除某些自动配置类
Class<?>[] exclude() default {};
// 排除某些自动配置类的名称
String[] excludeName() default {};
}
@ComponentScan
这个注解用于组件扫描,扫描主类所在包及其子包中的组件。
@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,面向切面编程) 能够将那些与业务无关, 却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来, 便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
- 著作权归 JavaGuide(javaguide.cn)所有
- 基于 MIT 协议
- 原文链接:https://javaguide.cn/system-design/framework/spring/spring-design-patterns-summary.html
IOC
详情
答:IoC(Inversion of Control,控制反转) 是 Spring 中一个非常非常重要的概念,它不是什么技术,而是一种解耦的设计思想。 IoC 的主要目的是借助于“第三方”(Spring 中的 IoC 容器) 实现具有依赖关系的对象之间的解耦(IOC 容器管理对象,你只管使用即可),从而降低代码之间的耦合度。
- 著作权归 JavaGuide(javaguide.cn)所有
- 基于 MIT 协议
- 原文链接:https://javaguide.cn/system-design/framework/spring/spring-design-patterns-summary.html
设计模式
详情
详见 helltractor blog 中单例模式
详情
Spring 中的 BeanFactory 和 ApplicationContext 就是工厂模式的体现,它们用来创建和管理对象。
- BeanFactory:延迟注入(使用到某个 bean 的时候才会注入),相比于 ApplicationContext 来说会占用更少的内存,程序启动速度更快。
- ApplicationContext:容器启动的时候,不管你用没用到,一次性创建所有 bean 。BeanFactory 仅提供了最基本的依赖注入支持, ApplicationContext 扩展了 BeanFactory ,除了有 BeanFactory 的功能还有额外更多功能,所以一般开发人员使用 ApplicationContext 会更多。
- 著作权归 JavaGuide(javaguide.cn)所有
- 基于 MIT 协议
- 原文链接:https://javaguide.cn/system-design/framework/spring/spring-design-patterns-summary.html
详情
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 接口统一管理。
定位 Bean(Resource 定位) 启动扫描类,扫描配置文件或注解类,定位到 Bean 的定义(XML、注解、JavaConfig 都支持)。
解析 Bean(BeanDefinition 解析) 将配置转换为 BeanDefinition,存入 BeanFactory 的缓存中。
实例化 Bean(Constructor or Factory Method) 通过反射创建对象实例,但此时还未注入属性。
依赖注入
populateBean()
根据 @Autowired、@Value 等注解或 XML 设置,注入所需属性。Bean 的生命周期回调
调用 Aware 接口(如 BeanNameAware、ApplicationContextAware)
调用 BeanPostProcessor#postProcessBeforeInitialization
调用 @PostConstruct 或 InitializingBean#afterPropertiesSet
调用 BeanPostProcessor#postProcessAfterInitialization
初始化完成,放入一级缓存 可以被外部依赖使用的 Bean 才会进入一级缓存,供单例复用。
销毁阶段(可选) 如果实现了 DisposableBean 或配置了 @PreDestroy,会在销毁时调用。
:::