首页 > 其他分享 >spring boot之@Import注解的应用

spring boot之@Import注解的应用

时间:2024-12-09 23:03:03浏览次数:10  
标签:EnableUserConfiguration spring boot Bean class bean Import public

我们知道spring boot会通过@ComponentScan定义包扫描路径进行业务定义的bean的加载,但是对于很多不在此包路径下定义的bean怎么办呢?比如其他jar包中定义的。这时候import就发挥作用了,通过它也可以实现bean的定义。具体是怎么做的呢,我们先看一下Import这个注解的类:

它的value属性方法中明确说明,可以是Configuration,ImportSelector,ImportBeanDefinitionRegistrar,或者其他常规的组件类。下面我们一一举例:

我们先和大部分jar包一样,定义一个EnableUserConfiguration,然后在META-INF/spring.factories中加入配置,这样EnableUserConfiguration就会在Spring boot启动时加载。此时它是个空的类,后面我们在这个上面展示Import四种应用方式

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.mall.provider.config.EnableUserConfiguration
public class EnableUserConfiguration {

}

(1)Configuration

我们在扫描包路径外定义了一个Configuration配置类:

package com.mall.pkgscan1;

import com.mall.pkgscan1.bean.ClassInfo;
import com.mall.pkgscan1.bean.Student;
import com.mall.pkgscan1.bean.UserInfo;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @since 2024/11/28 15:17
 */
@Configuration
public class UserConfiguration {

    @Bean
    public UserInfo userInfo() {
        return new UserInfo();
    }

    @Bean
    @ConditionalOnBean(ClassInfo.class)
    public Student student() {
        class Student1 {

        }
        new Student1();
        return new Student();
    }

    @Bean
    public ClassInfo classInfo() {
        return new ClassInfo();
    }
}

然后在EnableUserConfiguration上用@Import导入此配置类

@Import(UserConfiguration.class)
public class EnableUserConfiguration {

}

这样UserConfiguration中定义的Bean就会被加载了,我们直接在调试状态下可以看到使用上下文是可以获取到UserConfiguration中定义的Bean的

(2)ImportSelector

这种方式我们需要定义一个实现ImportSelector的类,然后赋值给Import注解的Value。为了方便展示,这里直接在EnableUserConfiguration中定义了一个静态内部类,代码如下:

@Import(EnableUserConfiguration.UserSelector.class)
public class EnableUserConfiguration {
    public static class UserSelector implements ImportSelector {

        @Override
        public String[] selectImports(AnnotationMetadata importingClassMetadata) {
            return new String[]{"com.mall.pkgscan1.UserConfiguration"};
        }
    }
}

通过selectImports返回的类的全限定名数组,就是我们想要Spring去加载的Bean。

(3)ImportBeanDefinitionRegistrar

此方式需要导入类ImportBeanDefinitionRegistrar接口。然后重写它的registerBeanDefinitions方法逻辑,自行实现bean定义,然后通过注册器进行bean的注册。此种方式可以随意自定义bean的名称

@Import(EnableUserConfiguration.UserRegistrar.class)
public class EnableUserConfiguration {
    public static class UserRegistrar implements ImportBeanDefinitionRegistrar {
        @Override
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            RootBeanDefinition beanDefinition = new RootBeanDefinition(UserConfiguration.class);
            registry.registerBeanDefinition("userConfiguration", beanDefinition);
        }
    }
}

(4)导入常规组件类

这种方式最简单,但也最局限。

@Import({UserInfo.class, ClassInfo.class})
public class EnableUserConfiguration {
}

上面代码把UserInfo和ClassInfo这两个普通类加载为Bean。但因为没有直接导入它两的外围类UserConfiguration这个配置类,所以不能用它的Bean方法获取,而是用对应类获取:下方的两种获取方式,UserInfo可以获取到bean,但ClassInfo不行

标签:EnableUserConfiguration,spring,boot,Bean,class,bean,Import,public
From: https://blog.csdn.net/lft18/article/details/144358788

相关文章

  • 基于Java+SpringBoot的大学生选修选课系统
    关注底部领取源码源码编号:S370源码名称:基于SpringBoot的大学生选修选课系统用户类型:多角色,学生、教师、管理员主要技术:Java、Vue、ElementUl、SpringBoot运行环境:Windows/Mac、JDK1.8及以上运行工具:IDEA/Eclipse数 据 库:MySQL5.7及以上版本数据库表数量:12张表是......
  • SpringBoot 集成 Quartz
    假定为在单机场景下使用,且为经典的SpringBoot项目(用到SpringBoot、Spring、SpringMVC、MyBatis等框架)引入依赖在pom.xml中添加依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></depe......
  • SpringBoot开发过程中经常遇到问题解决方案分享
    目录1. SpringBoot应用启动缓慢2. 数据库连接池配置问题3. SpringBoot应用无法连接外部服务4. 配置文件读取不生效5. SpringBoot应用的日志输出不完整6. SpringBoot中的@Transactional事务管理问题1. SpringBoot应用启动缓慢问题原因:SpringBoot应用启......
  • 基于SpringBoot的停车场管理系统的设计(计算机毕业设计)+万字文档
    系统合集跳转源码获取链接一、系统环境运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。IDE环境:Eclipse,Myeclipse,IDEA或者SpringToolSuite都可以tomcat环境:Tomcat7.x,8.x,9.x版本均可操作系统环境:WindowsXP/7/8//8.1/10/11或者L......
  • 【开源免费】基于Vue和SpringBoot的人事管理系统(附论文)
    博主说明:本文项目编号T077,文末自助获取源码\color{red}{T077,文末自助获......
  • Netty 源码分析之 一 揭开 Bootstrap 神秘的红盖头 (服务器端)
    录Netty源码分析之番外篇JavaNIO的前生今世JavaNIO的前生今世之一简介JavaNIO的前生今世之二NIOChannel小结JavaNIO的前生今世之三NIOBuffer详解JavaNIO的前生今世之四NIOSelector详解Netty源码分析之零磨刀不误砍柴工源码分......
  • Netty 源码分析之 一 揭开 Bootstrap 神秘的红盖头 (客户端)
    永顺 2016-10-26阅读 20 分钟41 目录Netty源码分析之番外篇JavaNIO的前生今世JavaNIO的前生今世之一简介JavaNIO的前生今世之二NIOChannel小结JavaNIO的前生今世之三NIOBuffer详解JavaNIO的前生今世之四N......
  • springboot毕设基于框架的生活垃圾识别与处理的科普网站源码+论文+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着社会的发展和人口的增长,生活垃圾的产生量日益增多,这对环境和人类健康都带来了诸多挑战。传统的垃圾处理方式面临着效率低下、分类不准确等问......
  • springboot毕设基于微信小程序的公共厕所地图系统论文+程序+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在现代城市生活中,公共厕所是城市基础设施的重要组成部分,关乎市民生活质量与城市形象。然而,当前公共厕所存在诸多问题,如分布信息不明确,使用者难以......
  • springboot整合lua脚本在Redis实现商品库存扣减
    1、目的        使用lua脚本,可以保证多条命令的操作原子性;同时可以减少操作IO(比如说判断redis对应数据是否小于0,小于0就重置为100,这个场景一般是取出来再判断,再存放进行,就至少存在2次IO,用lua脚本一条命令1次IO就解决了,在批量扣减情况存在多次IO,lua脚本1次也可以解决......