Spring基础篇:Spring的自定义“模块装配”的步骤

简介: Spring的自定义“模块装配”的步骤

使用场景

主要是 将很多Bean组合起来,就像形成了一个模块,原先使用@Bean@Component<bean>的方式向Spring容器注入bean,所有的bean之间没有明显的关联。如果说遇到某一个场景:我需要依赖大量的bean,有没有一种方式使用一个注解就将所需要的所有bean都导入呢?这就是:模块装配

模块装配的优点在于: 可以将执行特定功能的bean打包成一个整体,哪里需要时,使用一个注解即可将这个整体注入。

例子:我们定义四个动物类,并且尝试使用“模块装配”的方式实现:使用一个注解装四个bean

实现自定模块装配的步骤

定义一个注解

定义注解的意思就是说,我们是通过这个注解来做模块装配的。

定义一个EnableAnimal注解,以Enable起名是有讲究的,因为看到很多以Enable开头的注解就是使用了模块装配这个技术。

  • @Documented:注解(@EnableAnimal)被@Documented标注了,那么被@EnableAnimal修饰的类,生成doc文档时,会在文档个中显示@EnableAnimal
  • @Retention:所注解的注解保留多久,这里的RetentionPolicy.RUNTIME是保留至运行时。
  • @Target:表示该注解只能修饰在哪里,这里表示只能用在类上。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface EnableAnimal {
}

关键

除了自定义注解外 ,另外一个最重要的关键就是:@Import注解。这个注解的作用就是:要将哪些bean整合起来(打包)。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import()
public @interface EnableAnimal {
}

现在我们把目光聚焦在@Import()的括号里,也就是它有哪些方式来打包bean

方式一:直接导入类

最简单粗暴的方式,直接在括号里加入需要装配的类名.class,比如说装配Dog.class

@Import(Dog.class)
public @interface EnableAnimal {
}

方式二:导入一个配置类

这个方式其实和方式一的感觉是一样的,只是我们需要先定义一个配置类,然后将这个配置类放在括号中(和方式一一样)。

  • 定义一个配置类,在配置类中注册Pig
@Configuration
public class AssemblyConfig {
    @Bean
    public Pig pig(){
        return new Pig();
    }
}
  • 将配置类写在@Import()
@Import({Dog.class, AssemblyConfig.class})

方式三:实现ImportSelector接口

重写selectImports方法,返回需要导入类的全限定类名。这里我们再注入Cat

public class ImportSelectorImpl implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{Cat.class.getName()};
    }
}

放到注解中的@Import

@Import({Dog.class, AssemblyConfig.class, ImportSelectorImpl.class})

方法四:实现ImportBeanDefinitionRegistrar接口

重写registerBeanDefinitions方法;它导入的是BeanDefinition(这个内容高级篇见)

public class ImportBeanDefinitionRegistrarImpl implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        registry.registerBeanDefinition("tuzi",new RootBeanDefinition(Rabbit.class));
    }
}

放到注解中的@Import

@Import({Dog.class, AssemblyConfig.class, ImportSelectorImpl.class,ImportBeanDefinitionRegistrarImpl.class})

测试

OK,我们已经操作四种方式实现模块装配了,现在测试一下IOC容器中都有什么

配置类中导入注解

导入@EnableAnimal自定义注解即可,然后看IOC容器中是否有这四个动物了。

@Configuration
@EnableAnimal
public class AssemblyApplicationConfig {
}

主程序

打印所有在IOC容器中bean的id

public class AssemblyApplication {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AssemblyApplicationConfig.class);
        for (String beanDefinitionName : ctx.getBeanDefinitionNames()) {
            System.out.println(beanDefinitionName);
        }
    }
}
目录
相关文章
|
人工智能 Java Serverless
【MCP教程系列】搭建基于 Spring AI 的 SSE 模式 MCP 服务并自定义部署至阿里云百炼
本文详细介绍了如何基于Spring AI搭建支持SSE模式的MCP服务,并成功集成至阿里云百炼大模型平台。通过四个步骤实现从零到Agent的构建,包括项目创建、工具开发、服务测试与部署。文章还提供了具体代码示例和操作截图,帮助读者快速上手。最终,将自定义SSE MCP服务集成到百炼平台,完成智能体应用的创建与测试。适合希望了解SSE实时交互及大模型集成的开发者参考。
12051 60
|
2月前
|
监控 安全 Java
使用 @HealthEndpoint 在 Spring Boot 中实现自定义健康检查
Spring Boot 通过 Actuator 模块提供了强大的健康检查功能,帮助开发者快速了解应用程序的运行状态。默认健康检查可检测数据库连接、依赖服务、资源可用性等,但在实际应用中,业务需求和依赖关系各不相同,因此需要实现自定义健康检查来更精确地监控关键组件。本文介绍了如何使用 @HealthEndpoint 注解及实现 HealthIndicator 接口来扩展 Spring Boot 的健康检查功能,从而提升系统的可观测性与稳定性。
225 0
使用 @HealthEndpoint 在 Spring Boot 中实现自定义健康检查
|
6月前
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。
|
8月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——拦截自定义异常
本文介绍了在实际项目中如何拦截自定义异常。首先,通过定义异常信息枚举类 `BusinessMsgEnum`,统一管理业务异常的代码和消息。接着,创建自定义业务异常类 `BusinessErrorException`,并在其构造方法中传入枚举类以实现异常信息的封装。最后,利用 `GlobalExceptionHandler` 拦截并处理自定义异常,返回标准的 JSON 响应格式。文章还提供了示例代码和测试方法,展示了全局异常处理在 Spring Boot 项目中的应用价值。
417 0
|
11月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
11月前
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
11月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
1853 15
|
4月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
879 0
|
5月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
620 0
|
1月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
271 3

热门文章

最新文章

下一篇
oss云网关配置