SpringBoot超详细讲解@Enable*注解和@Import

目录
  • @Enable*
  • 解决办法
    • 解放方案一
    • 解决方案二
    • 解决方案三
  • @Import
    • 1、导入Bean
    • 2、导入配置类
    • 3、导入ImportSelector实现类
    • 4、导入ImportBeanDefinitionRegistrar实现类

@Enable*

创建一个主启动类

package com.you.boot;
import com.you.config.EnableUser;
import com.you.config.UserConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
@SpringBootApplication
public class BootEnable02Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(BootEnable02Application.class, args);
//      获取Bean
        Object user = context.getBean("user");
        System.out.println(user);
    }
}

新建一个Module

【如果创建完,不是并列,如下图(并列),而是包含】

【错误原因】路径写错了,需要把红框类的去掉

在新Module里写一个用户类和配置类

User类

package com.you.domain;
public class User {
}

UserConfig

package com.you.config;
import com.you.domain.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class UserConfig {
    @Bean
    public User user()
    {
        return new User();
    }
}

在主启动类的Pom里引入配置类的依赖

<dependency>
         <groupId>com.you</groupId>
         <artifactId>boot-enable-other</artifactId>
         <version>0.0.1-SNAPSHOT</version>
</dependency>

启动。问题SpringBoot不可以直接获取Jar包中定义的Bean

解决办法

解放方案一

@ConponentScan("配置类包名")

效果:

解决方案二

@Import

效果图

解决方案三

@Import的封装

在配置类包下,创建如下类

package com.you.config;
import org.springframework.context.annotation.Import;
import java.lang.annotation.*;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(UserConfig.class)
public @interface EnableUser {
}

效果:

@Import

@Import提供了四种用法

1、导入Bean

2、导入配置类

3、导入ImportSelector实现类,一般用于加载配置文件的类

4、导入ImportBeanDefinitionRegistrar实现类

1、导入Bean

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

可以获取到

2、导入配置类

和上面@Enable*详解中的一样

3、导入ImportSelector实现类

一般用于加载配置文件的类

首先需要写一个ImporeSelector的实现类,还是写在config包下

package com.you.config;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class MySelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.you.domain.User"};
    }
}

效果

4、导入ImportBeanDefinitionRegistrar实现类

首先需要写一个ImportBeanDefinitionRegistrar实现类,同样写在config包下

package com.you.config;
import com.you.domain.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;
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);
    }
}

效果

到此这篇关于SpringBoot超详细讲解@Enable*注解和@Import的文章就介绍到这了,更多相关SpringBoot @Enable*注解和@Import内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot2底层注解@Import用法详解

    目录 SpringBoot2注解@Import @Import 导入组件 用法 验证 SpringBoot2注解@Import 上一篇中了解到了@Configuration,可以注册组件.除此之外,还有许多注解也可以,用法跟之前学习 spring 的时候一样.比如,@Bean.@Component.@Controller.@Service.@Repository等. 这篇介绍另外一种给容器添加组件的方法:@Import注解,给容器中导入组件. @Import 导入组件 用法 @Import的用法

  • springBoot @Enable* 注解的使用

    1.为什么使用@SpringBootApplication注解,即可做到自动配置? 答:@SpringBootApplication,内部起作用的注解其实有3个.@EnableAutoConfiguration,@ComponentScan,@Configuration.这篇文章主要是讲解@EnableXX注解 2.为什么使用了@EnableAutoConfiguration.当使用了@ConfigurationProperties时,即可自动导入.yml 或者.properties里面的配置项

  • SpringBoot中@Import注解的使用方式

    目录 一. @Import引入普通类 二. @Import引入配置类(@Configuration修饰的类) 三 .@Import引入ImportSelector的实现类 3.1 静态import场景(注入已知的类) 3.2 动态import场景(注入指定条件的类) 四. @Import引入ImportBeanDefinitionRegistrar的实现类 前言: @Import注解用来帮助我们把一些需要定义为Bean的类导入到IOC容器里面.下面我们就对@Import注解的使用做一个简单的总结

  • SpringBoot中@Import注解如何正确使用

    目录 简介 一.功能简介 二.示例 1.引入普通类 2.引入ImportSelector的实现类 (1)静态import场景(注入已知的类) (2)动态import场景(注入指定条件的类) 3.引入ImportBeanDefinitionRegister的实现类 简介 由于最近的项目需求,需要在把配置类导入到容器中,通过查询,使用@Import注解就能实现这个功能,@Import注解能够帮我们吧普通配置类(定义为Bean的类)导入到IOC容器中.该注解我们也能过在源码中经常看到,是框架层实现的重

  • 浅析SpringBoot2底层注解@Conditional@ImportResource

    目录 SpringBoot2底层注解 一.@ImportResource 示例 二.@ImportResource SpringBoot2底层注解 一.@ImportResource @Conditional注解,是根据条件进行装配.满足了 Conditional 指定的条件,就进行组件的注入. 另外@Conditional是个根注解,在idea里使用 ctrl+H 可以打开它的结构. 可以看到有许多的派生注解,每个注解都代表着一种功能.比如: @ConditionalOnBean:当容器中存在

  • 详解SpringBoot开发使用@ImportResource注解影响拦截器

    问题描述 今天在给SpringBoot项目配置拦截器的时候发现怎么都进不到拦截器的方法里面,在搜索引擎上看了无数篇关于配置拦截器的文章都没有找到解决方案. 就在我准备放弃的时候,在 CSDN 上发现了一篇文章,说的是SpringBoot 用了@ImportResource 配置的拦截器就不起作用了.于是我就赶紧到Application启动类看了一眼,果然项目中使用了@ImportResource 注解用于配置系统的参数. 代码如下: 启动类配置 package com.xx.xxx; impor

  • SpringBoot超详细讲解@Enable*注解和@Import

    目录 @Enable* 解决办法 解放方案一 解决方案二 解决方案三 @Import 1.导入Bean 2.导入配置类 3.导入ImportSelector实现类 4.导入ImportBeanDefinitionRegistrar实现类 @Enable* 创建一个主启动类 package com.you.boot; import com.you.config.EnableUser; import com.you.config.UserConfig; import org.springframew

  • SpringBoot超详细讲解@Value注解

    目录 一.非配置文件注入 1.注入普通字符串 2.注入JAVA系统变量 3.注入表达式 4.注入其他Bean属性 5.注入文件资源 6.注入URL资源 二.通过配置文件注入 1.注入普通字符串 2.注入基本类型 3.注入数组类型 4.注入List类型 5.注入Map类型 一.非配置文件注入 1.注入普通字符串 直接附在属性名上,在 Bean 初始化时,会赋初始值. @Value("admin") private String name; 2.注入JAVA系统变量 @Value(&quo

  • SpringBoot超详细讲解多数据源集成

    目录 一.多数据源使用场景与弊端 1.场景 2.弊端 二.使用步骤 1.引入库 2.多数据源配置文件 3.多数据源配置类 4.使用 总结 一.多数据源使用场景与弊端 1.场景 业务系统跨数据库 数据转存(这个现在太low了,应该高级点都不用) 系统集成 2.弊端 跨库业务事务问题 service.dao不能重复注入数据源 二.使用步骤 1.引入库 <!-- 多数据源支持 --> <dependency> <groupId>com.baomidou</groupId

  • SpringBoot超详细讲解事务管理

    目录 1. 事务的定义 2. 事务的特性 3. 事务的隔离性 4. 事务管理 5. 示例 1. 事务的定义 事务是由 N 步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行. 2. 事务的特性 事务的 ACID 特性: 原子性:事务是应用中不可分割的最小执行体 一致性:事务执行的结果必须使得数据从一个一致性状态转变为另一个一致性状态 隔离性:各个事务的执行互不干扰,任何事务的内部操作对其他事务都是隔离的 持久性:事务一旦提交,对数据所做的任何修改都要记录到永久存储器中

  • SpringBoot超详细讲解集成Flink的部署与打包方法

    目录 一.SpringBoot集成Flink 二.FlinkTask写法调整 三.打包插件 四.Flink的上传与运行 总结 一.SpringBoot集成Flink 其实没什么特别的,就把Flink依赖的包在pom引入就行了.只是FlinkTask的写法要小调整下,把相关依赖交给spring管理就行. 然后如果放弃Flink的Dashboard端监控task执行相关信息,那也可以在SpringBoot的启动类里调用就行,但是可能出现task的相关对象没有注入,这种都是小问题(实际就是spring

  • SpringBoot超详细讲解自动配置原理

    目录 SpringBoot自动配置原理 SpringBoot特点 1.依赖管理 A.父项目做依赖管理 B.开发导入starter场景启动器 C.可以修改默认版本号 2.自动配置 A.自动配好Tomcat B.自动配好SpringMVC C.默认的包结构 D.各种配置拥有默认值 E.按需要加载所有自动配置项 SpringBoot自动配置原理 了解SpringBoot自动配置原理 1.SpringBoot特点 2.容器功能 3.自动配置原理入门 4.开发技巧 SpringBoot特点 1.依赖管理

  • SpringBoot超详细讲解Thymeleaf模板引擎

    Jsp是最早的模板技术,用来处理视图层的,用来做数据显示的模板 B S结构: B:浏览器:用来显示数据,发送请求,没有处理能力 发送一个请求,访问a.jsp,a.jsp在服务器端变成Servlet,在将输出的数据返回给浏览器,浏览器就可以看到结果数据,jsp最终翻译过来也是个html页面 模板技术你就可以把它们当成字符串的替换,比如说:这里{data}这里有一个字符串,你把它换成固定值其他值,但是这个替换有一些附加的功能,通过模板技术处理视图层的内容 第一个例子: pom.xml:Thymele

  • SpringBoot超详细讲解yaml配置文件

    目录 1.文件类型 A.properties配置文件类型 B.yaml 基本语法 数据类型 2.配置提示 1.文件类型 A.properties配置文件类型 同以前properties用法一样 B.yaml 简介: YAML 是 "YAML Ain't Markup Language"(YAML 不是一种标记语言)的递归缩写.在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言). 非常适合用来做以

  • 超详细讲解SpringBoot参数校验实例

    目录 使用传统方式的弊端 引入依赖 注解说明 一.对实体类进行校验 1.entity 2.controller 3.编写全局统一异常处理 二.针对单个参数进行校验 三.分组校验 1.entity 2.controller 四.自定义分组校验 1.entity 2.CustomSequenceProvider 3.controller 五.自定义校验 1.定义校验注解 2.实现注解 六.嵌套校验 七.快速失败 注意事项 总结 使用传统方式的弊端 public String addUser(User

  • SpringBoot超详细深入讲解底层原理

    目录 手写springboot Springboot项目 自动配置 小结 手写springboot 在日常开发中只需要引入下面的依赖就可以开发Servlet进行访问了. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 那这是怎么做到的呢?今天就来

随机推荐