Spring注解竟然如此简单
Spring注解驱动演进
Spring注解发展
Spring 1.0
注解驱动的启蒙阶段:
主要是配置文件驱动,bean需要在配置文件中进行配置声明才可以被容器管理,只存在@Transaction注解,在开发过程中如果是不同业务需要配置很多的xml文件,并且使用import标签进行指定
Spring 2.0
注解驱动的过渡时期:
依然只能使用配置文件,但相较于1.0做了简化bean的管理,出现了component-scan以及@Component注解
@Component的作用
- 定义:是 Spring 框架中的一个重要注解,用于标识一个类为 Spring 的组件,使其能够被 Spring 容器自动扫描和管理。
- 作用
- 自动扫描和注册:通过类路径扫描,Spring 可以自动发现并注册带有 @Component 注解的类,从而将其作为 Spring 上下文中的一个 Bean。
- 简化配置:使用注解减少了XML配置,使得代码清晰方便管理
- 便于依赖注入:标记为 @Component 的类可以通过 @Autowired 注解轻松实现依赖注入,Spring 会自动处理 Bean 的生命周期和依赖关系。
- 可扩展性:@Component 可以与其他注解组合使用(如 @Service, @Repository, @Controller这些注解的内部其实就是@Component注解 ),这些注解也会被 Spring 识别为组件,但语义上更明确,便于团队协作和代码维护。
- 管理 Bean 的生命周期:Spring 可以管理被标记为 @Component 的 Bean 的生命周期,包括初始化、销毁等。
Spring 3.0
注解驱动的黄金时期:
@Configuration 注解是 Spring 框架中的一个重要注解,用于标识一个类为配置类。它的主要作用包括:
- 定义 Bean:使用 @Configuration 注解的类可以包含一个或多个被 @Bean 注解标记的方法,这些方法会被 Spring 容器调用,以创建和配置 Bean。
- 替代 XML 配置:通过使用 @Configuration 注解,开发者可以用 Java 代码替代传统的 XML 配置文件,提供了更强的类型安全和更好的可读性。
- 支持依赖注入:在 @Configuration 类中定义的 Bean 可以直接通过 @Autowired 注解进行依赖注入,Spring 会自动处理 Bean 的生命周期和依赖关系。
- 环境配置:可以根据不同的环境(如开发、测试、生产)来定义不同的配置类,通过 Spring 的条件注解(如 @Profile)实现动态配置。
但是这个时候还是需要配合XML配置文件中的component-scan使用,此时就既要使用xml又要使用 配置类,此时使用@ImportResource做关联
为了进一步的完善注解功能在3.1版本出现了@ComponentScan注解,帮助我们摆脱配置文件
@ComponentScan
Spring Framework 中用于配置组件扫描的一个重要注解。它的主要作用是自动扫描指定包及其子包中的组件(例如带有 @Component、@Service、@Repository、@Controller 等注解的类),并将它们注册为 Spring 容器中的 Bean,默认情况下是会扫描当前包及其子包中所有带有@Component的类,可以通过basePackages指定扫描路径
主要作用
自动发现和注册 Bean:通过指定包路径,Spring 可以自动发现和注册这些包中的组件,简化了手动配置的工作。
减少配置复杂性:使用注解方式代替 XML 配置,可以让配置更加简洁明了,易于维护。
灵活的包路径配置:可以通过 basePackages 属性指定扫描的包路径,支持多包路径的配置。
结合其他注解使用:常与 @Configuration 一起使用,方便进行组件的集中管理和配置。
@Import
是 Spring Framework 中用于导入其他配置类或注册额外的组件的工具。它的主要作用是实现模块化配置,将一个或多个配置类引入到当前的 Spring 应用上下文中,导入第三方配置类,例如导入redis、mybatis的配置,是自动装配的核心,可以将添加的类型直接注入到IOC容器中。
主要作用
模块化配置:允许将多个配置类拆分到不同的文件中,以便于维护和组织代码。例如,可以将不同模块的 Bean 配置放在独立的类中。
导入其他配置类:通过 @Import 可以轻松将一个配置类引入到另一个配置类中,使得应用程序的配置更加清晰。
导入组件:除了配置类,@Import 还可以导入实现 ImportSelector 或 ImportBeanDefinitionRegistrar 接口的类,以实现更复杂的 Bean 注册逻辑
基础使用方式就是将要导入的类直接写入Import中
基础使用方式简单易用,但是如果此时需要导入很多,或者需要结合不同的业务逻辑来加载不同的bean的话就做不到了,这时候就需要另外两种扩展方式
其他扩展方式(动态注入)
-
注解中导入的类如果实现了ImportSelector接口的话不会注入当前类,会导入重写的selectImports方法返回的全类路径的字符串数据注入到容器中,动态注入可以根据不同的业务逻辑注入不同的类,非常灵活
示例
实现ImportSelector接口重写selectImports方法,返回值为想要注入的类的名字或者全类路径都是可以的
并且ImportDemo02是不会被注入ioc容器中的 -
实现ImportBeanDefinitionRegistrar接口重写registerBeanDefinitions方法,获取到其中的BeanDefinitionRegistry注册器可以将指定的类注入到容器中
示例
@Enable***开头的注解在 Spring Framework 中主要用于启用特定的功能或特性。这些注解通常结合其他 Spring 特性一起使用,以便快速配置和启动相关功能。
主要作用
启用特性:@Enable 注解可以激活与该注解相关联的功能,比如自动配置、特定模块或库的集成。
简化配置:使用 @Enable 注解可以减少显式配置的需要,通过简单的注解使得相关的配置自动生效。
集中管理:这些注解通常会将相关的 Bean 定义和配置集中到一个地方,便于维护和理解。
此类注解的内部其实就是@Import注解
示例
- EnableAutoConfiguration
- @EnableWebMvc
- @EnableAspectJAutoProxy
Spring 4.0
注解驱动的完善时期:
没有太多新注解的加入了,基本已经完善
@EventListener 监听事件
@AliasFor 别名
@CrossOrigin 跨域
@Conditional 重点条件注解,是 Spring Framework 中用于条件化 Bean 注册的重要工具。它允许根据特定条件决定是否注册一个 Bean。这在配置复杂或需要根据环境进行调整的应用程序中非常有用。可以控制对象是否注入到容器中,可以根据具体的业务需求来看是否注入bean对象,可以放到bean修饰的方法对象类上面,存在某一个对象,加载,存在一个条件做另外的加载操作
主要作用
动态 Bean 注册:通过条件注解,开发者可以根据不同的环境或配置条件动态决定某个 Bean 是否应该被注册到 Spring 容器中。
支持多种条件:可以使用不同的条件类来实现复杂的条件逻辑。例如,@ConditionalOnProperty、@ConditionalOnClass 和 @ConditionalOnMissingBean 等,这些是 Spring Boot 提供的条件注解,允许基于特定的条件注册 Bean。
增强模块化和可配置性:通过条件化配置,开发者可以创建更加灵活的应用程序,使其在不同环境或条件下表现出不同的行为
示例
自定义一个条件注解实现,首先条件注解如下图
value值是实现了Condition接口的类,实现Condition接口并且重写matches方法根据matches发放的返回值来看是否注入当前注解注释的类
将matches方法改成false
此时我们就可以根据不同的业务逻辑来决定matches方法的返回。
Spring 5.0
注解驱动的成熟时期:
@Indexed
在 Spring Framework 中用于标识一个类,以便在依赖注入时优化查找速度。
主要作用
提高性能:使用 @Indexed 注解的类会被标记为可索引,这样 Spring 在进行依赖查找时会优先考虑这些类,从而提高性能,特别是在大型应用中。
支持类型查找:在使用反射进行类型查找时,标记为 @Indexed 的类可以加快查找速度,避免重复的反射操作。
优化依赖注入:在复杂的依赖关系中,使用 @Indexed 可以帮助 Spring 更有效地解析依赖,从而提高应用程序的启动速度和运行效率。
@Component注解中就有@Indexed
此注解主要是解决项目中的文件越来越多的加载效率问题,在编译阶段就将带有Component注解的类放到一个文件中,这样在系统启动的时候就可以去这一个文件查找即可,只用一次io,避免了挨个扫描。索引文件名:spring.components
文件中描述了全类路径