创建工程
首先创建一个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));
}
}