SpringBoot自动配置之@Import

SpringBoot @Import详解
本文详细介绍了SpringBoot中@Import注解的四种使用方法,包括直接导入Bean、导入配置类、导入ImportSelector实现类及ImportBeanDefinitionRegistrar实现类。

SpringBoot自动配置之@Import

前言

@Enable*底层依赖于@Import注解导入一些类,使用@Import导入的类会被Spring加载到IOC容器中。而@Import提供4种用法。

@import的4种用法

1.直接导入Bean,即直接导入实体类的class文件:@Import(User.class)

@Import(User.class)
@SpringBootApplication
public class SpringbootEnableApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);

        User user = context.getBean(User.class);
        System.out.println(user);
    }
}

2.导入配置类
我的配置类文件:

package cs.yangtze.springboot_enable_other.config;

import cs.yangtze.springboot_enable_other.entity.Role;
import cs.yangtze.springboot_enable_other.entity.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Version 1.0
 * @Author:cyl
 * @Date:2022/8/10
 * @Content:
 */
//@Configuration
public class UserConfig {

    @Bean
    public User user(){
        return new User();
    }

    @Bean
    public Role role(){
        return new Role();
    }
}
@Import(UserConfig.class)
@SpringBootApplication
public class SpringbootEnableApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);

        User user = context.getBean(User.class);
        System.out.println(user);

        Role role =context.getBean(Role.class);
        System.out.println(role);
    }
}

3.导入ImportSelector实现类,一般用于加载配置文件中的类。
我的ImportSelector实现类:

package cs.yangtze.springboot_enable_other.config;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @Version 1.0
 * @Author:cyl
 * @Date:2022/8/12
 * @Content:
 */
public class MyImportSelect implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"cs.yangtze.springboot_enable_other.entity.Role",
                "cs.yangtze.springboot_enable_other.entity.User"};
    }
}


@Import(MyImportSelect.class)
@SpringBootApplication
public class SpringbootEnableApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);
        User user = context.getBean(User.class);
        System.out.println(user);

        Role role =context.getBean(Role.class);
        System.out.println(role);

    }
}

4.导入ImportBeanDefinitionRegistrar实现类。
我的实现类:

package cs.yangtze.springboot_enable_other.config;

import cs.yangtze.springboot_enable_other.entity.Role;
import cs.yangtze.springboot_enable_other.entity.User;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @Version 1.0
 * @Author:cyl
 * @Date:2022/8/12
 * @Content:
 */
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {

        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
        registry.registerBeanDefinition("user",beanDefinition);

        AbstractBeanDefinition beanDefinition2 = BeanDefinitionBuilder.rootBeanDefinition(Role.class).getBeanDefinition();
        registry.registerBeanDefinition("role",beanDefinition2);

    }
}
@Import(MyImportBeanDefinitionRegistrar.class)
@SpringBootApplication
public class SpringbootEnableApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);
        Object user = context.getBean("user");
        System.out.println(user);

        Object role =context.getBean("role");
        System.out.println(role);
    }
}

总结

以上就是Import的四种用法,我个人是用的两个模块,其中一个模块导入另一个模块中的文件,下面是我的目录结构:
在这里插入图片描述我都是用的该模块下的启动类,注意还要在此模块中的pom文件里导入另一个模块的依赖
在这里插入图片描述
在这里插入图片描述

### Spring Boot 中 YML 配置的 `@env@` 占位符用法 在 Spring Boot 的 YML 配置文件中,可以使用占位符来动态注入环境变量或系统属性。虽然问题中提到的 `@env@` 并非标准语法[^3],但 Spring Boot 支持 `${}` 语法作为占位符,用于引用环境变量、系统属性或其他配置值。 #### 使用 `${}` 占位符 Spring Boot 的 YML 文件支持 `${}` 占位符语法,用于引用外部配置值。例如: ```yaml server: port: ${PORT:8080} # 如果环境变量 PORT 存在,则使用其值;否则默认为 8080 spring: datasource: url: ${DB_URL} # 引用环境变量 DB_URL username: ${DB_USERNAME} password: ${DB_PASSWORD} ``` 上述配置中,`${PORT:8080}` 表示优先使用环境变量 `PORT` 的值,如果未定义则使用默认值 `8080`[^4]。 #### 环境变量注入 Spring Boot 自动将操作系统的环境变量映射到配置中。例如,设置操作系统环境变量: ```bash export DB_URL=jdbc:mysql://localhost:3306/mydb export DB_USERNAME=root export DB_PASSWORD=secret ``` 在 YML 文件中可以通过 `${}` 引用这些环境变量: ```yaml spring: datasource: url: ${DB_URL} username: ${DB_USERNAME} password: ${DB_PASSWORD} ``` #### 使用 `application.yml` 和 `application.properties` Spring Boot 支持两种配置文件格式:`application.yml` 和 `application.properties`。两者功能相同,但 YAML 更适合嵌套结构的配置[^1]。例如: **YML 格式** ```yaml spring: profiles: active: dev datasource: url: ${DB_URL} username: ${DB_USERNAME} password: ${DB_PASSWORD} ``` **Properties 格式** ```properties spring.profiles.active=dev spring.datasource.url=${DB_URL} spring.datasource.username=${DB_USERNAME} spring.datasource.password=${DB_PASSWORD} ``` #### 动态配置与 Profile Spring Boot 支持多环境配置(Profiles),可以在不同环境下加载不同的配置。例如,创建以下文件: - `application-dev.yml`:开发环境配置 - `application-prod.yml`:生产环境配置 通过激活特定 Profile 来加载对应的配置: ```yaml # application.yml spring: profiles: active: dev ``` 在 `application-dev.yml` 中: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/devdb username: devuser password: devpass ``` #### 测试代码示例 以下是一个测试,展示如何读取配置并注入到 Bean 中: ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(SpringRunner.class) @SpringBootTest public class ConfigTest { @Value("${spring.datasource.url}") private String dbUrl; @Value("${spring.datasource.username}") private String dbUsername; @Test public void testConfig() { System.out.println("Database URL: " + dbUrl); System.out.println("Database Username: " + dbUsername); } } ``` #### 注意事项 1. 如果占位符引用的环境变量或系统属性不存在,且未提供默认值,程序启动时会抛出异常。 2. 默认值可以通过 `${key:default}` 的形式指定[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lxrqiyuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值