【SpringBoot】@Enable* 注解和 @Import
@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 {
// 获取 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 {
} 可以获取到
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);}}效果
评论