写点什么

【SpringBoot】@Enable* 注解和 @Import

作者:游坦之
  • 2022-11-27
    山东
  • 本文字数:1775 字

    阅读完需:约 6 分钟

​@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;


@SpringBootApplicationpublic class BootEnable02Application {


public static void main(String[] args) {    ConfigurableApplicationContext context = SpringApplication.run(BootEnable02Application.class, args);
复制代码


// 获取 BeanObject 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;


@Configurationpublic class UserConfig {@Beanpublic 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("配置类包名")


效果:


解决方案 2:@Import 效果图


解决方案 3:@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


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 {@Overridepublic 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 {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();registry.registerBeanDefinition("user",beanDefinition);}}效果


​​​​​​​


用户头像

游坦之

关注

还未添加个人签名 2022-10-14 加入

还未添加个人简介

评论

发布
暂无评论
【SpringBoot】@Enable*注解和@Import_spring-boot_游坦之_InfoQ写作社区