在spring工作中,我们在编写通用工具jar时,经常会遇到需要将一些类注入到spring容器中,这个时间我们就要用到spring提供的延迟导致选择器(DeferredImportSelector)来实现自动装配功能,话不多说,直接上代码。
一、定义一个接口
需要注入到spring容器中的类,都要实现该接口
/**
* @ClassName: prev.springframework.springboot.AutoConfiguration
* @Description:
* @Author: redkapok
* @Date: 2024/2/28 19:03
* @Version: v1.0
*/
public interface AutoConfiguration {
}
二、编写自动装配类
实现spring提供的延迟装载选择器,按指定的接口类型进行装配
package prev.springframework.springboot;
import org.springframework.context.annotation.DeferredImportSelector;
import org.springframework.core.type.AnnotationMetadata;
import java.util.ArrayList;
import java.util.List;
import java.util.ServiceLoader;
/**
* @ClassName: prev.springframework.springboot.ImportSeclet
* @Description:
* @Author: redkapok
* @Date: 2024/2/28 19:05
* @Version: v1.0
*/
public class AutoConfigurationImportSelector implements DeferredImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
ServiceLoader<AutoConfiguration> serviceLoader = ServiceLoader.load(AutoConfiguration.class);
List<String> list = new ArrayList<>();
for(AutoConfiguration autoConfiguration:serviceLoader){
list.add(autoConfiguration.getClass().getName());
}
return list.toArray(new String[0]);
}
}
三、编写配置文件
在resources路径下创建目录META-INF/services,创建文件prev.springframework.springboot.AutoConfiguration
文件内容如下:
prev.springframework.springboot.WebServiceAutoConfiguration
四、实现自动配置接口
package prev.springframework.springboot;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
/**
* @ClassName: prev.springframework.springboot.WebServiceAutoConfiguration
* @Description:
* @Author: redkapok
* @Date: 2024/2/28 18:49
* @Version: v1.0
*/
@Configurable
public class WebServiceAutoConfiguration implements AutoConfiguration{
@Bean
@ConditionalOnClass("org.apache.catalina.startup.Tomcat")
public TomcatWebServer tomcatWebServer(){
return new TomcatWebServer();
}
@Bean
@ConditionalOnClass("org.eclipse.jetty.server.Server")
public JettyWebServer jettyWebServer(){
return new JettyWebServer();
}
}
五、在spring可以扫描到的注册上添加@Impor注解
@Import(AutoConfigurationImportSelector.class)