spring boot之@Import注解的应用
我们知道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不行
原文地址:https://blog.csdn.net/lft18/article/details/144358788
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!