自动装配&jar中的bean自动注入到spring工程中

在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)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容