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 的生命周期,包括初始化、销毁等。
      Repository注解
      Service注解
      Controller注解

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的话就做不到了,这时候就需要另外两种扩展方式
    其他扩展方式(动态注入)
  1. 注解中导入的类如果实现了ImportSelector接口的话不会注入当前类,会导入重写的selectImports方法返回的全类路径的字符串数据注入到容器中,动态注入可以根据不同的业务逻辑注入不同的类,非常灵活
    示例
    实现ImportSelector接口方式
    实现ImportSelector接口重写selectImports方法,返回值为想要注入的类的名字或者全类路径都是可以的
    打印所有bean的名字
    结果展示
    并且ImportDemo02是不会被注入ioc容器中的

  2. 实现ImportBeanDefinitionRegistrar接口重写registerBeanDefinitions方法,获取到其中的BeanDefinitionRegistry注册器可以将指定的类注入到容器中
    示例
    实现ImportBeanDefinitionRegistrar接口
    结果展示

@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发放的返回值来看是否注入当前注解注释的类
实现Condition接口
可以注入到IOC
将matches方法改成false
不可以注入IOC
此时我们就可以根据不同的业务逻辑来决定matches方法的返回。

Spring 5.0

注解驱动的成熟时期:
@Indexed
在 Spring Framework 中用于标识一个类,以便在依赖注入时优化查找速度。
主要作用
提高性能:使用 @Indexed 注解的类会被标记为可索引,这样 Spring 在进行依赖查找时会优先考虑这些类,从而提高性能,特别是在大型应用中。
支持类型查找:在使用反射进行类型查找时,标记为 @Indexed 的类可以加快查找速度,避免重复的反射操作。
优化依赖注入:在复杂的依赖关系中,使用 @Indexed 可以帮助 Spring 更有效地解析依赖,从而提高应用程序的启动速度和运行效率。
@Component注解中就有@Indexed
在这里插入图片描述
此注解主要是解决项目中的文件越来越多的加载效率问题,在编译阶段就将带有Component注解的类放到一个文件中,这样在系统启动的时候就可以去这一个文件查找即可,只用一次io,避免了挨个扫描。索引文件名:spring.components
文件中描述了全类路径
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值