自己实现一个自动装配注解@EnableAutoConfiguration

创建工程

首先创建一个springboot的工程,maven配置不需要修改
在这里插入图片描述
添加demo、demo1、demo2三个包,我们将启动类放入demo包中。
分别在demo1、demo2中创建测试配置类。

MyBatisConfig

@Configuration
public class MyBatisConfig {

    @Bean
    public MyBatis getMyBaties(){

        return new MyBatis();
    }
}
public class MyBatis {
}

RedisTemplateConfig

@Configuration
public class RedisTemplateConfig {


    @Bean
    public RedisTemplate getRedisTemplate(){
        return new RedisTemplate();
    }

}
public class RedisTemplate {


}

修改DemoImportApplication代码并运行,会出现NoSuchBeanDefinitionException的异常,因为springboot启动时默认只扫描同级目录或对应的子目录。demo1和demo2和启动类的父包同级,无法扫描到。

@SpringBootApplication
public class DemoImportApplication {

    public static void main(String[] args) {

        ConfigurableApplicationContext ctx = SpringApplication.run(DemoImportApplication.class, args);

        System.out.println(ctx.getBean(RedisTemplate.class));
        System.out.println(ctx.getBean(MyBatis.class));
    }

}

在这里插入图片描述
创建ImportSelectorImpl类并实现ImportSelector接口,将对应需要扫描的类返回。

public class ImportSelectorImpl implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{RedisTemplateConfig.class.getName(), MyBatisConfig.class.getName()};
    }

    @Override
    public Predicate<String> getExclusionFilter() {
        return null;
    }
}

创建@EnableAutoConfiguration注解,将ImportSelectorImpl放到@ImportSelectorImpl注解中。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(ImportSelectorImpl.class)
public @interface EnableAutoConfiguration {

}

再次修改DemoImportApplication代码并运行,这样就可以找到对应的类了

import com.example.demoimport.demo1.RedisTemplate;
import com.example.demoimport.demo2.MyBatis;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@EnableAutoConfiguration
@SpringBootApplication
public class DemoImportApplication {

    public static void main(String[] args) {

        ConfigurableApplicationContext ctx = SpringApplication.run(DemoImportApplication.class, args);

        System.out.println(ctx.getBean(RedisTemplate.class));
        System.out.println(ctx.getBean(MyBatis.class));
    }

}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值