往spring容器中放入一个bean,可以使用@Configuration和@Bean。
spring会扫描标记了@Component、@Controller、@Service、@Repository的类,@Configuration注解本身也用@Component标注了,Spring将能够识别出 @Configuration标注类。

@Configuration:放于类上,表明该类是一个配置类,相当于老早时期的xml文件的作用,在类中定义多个bean方法

@Bean:放在被@Configuration标注的类中的方法上,该方法返回的是一个bean,默认bean名称是方法名,也可以设置名称@Bean(“myBean1”)

@Import:通过快速导入的方式实现把实例加入spring的IOC容器中,功能和@Bean类似,一个类上只能配置一个,如果导入多个类的话并列写在一个注解中。

代码有多个模块时,启动类要配置其他模块的包名,以便于扫描到bean,但有时只需要别的包中的几个类,配置整个包名会扫描太多东西,可以用@EnableXXX + @import + @bean 的方式实现灵活引用。例如@EnableDiscoveryClient、@EnableScheduling都是用类似方法。
1.将需要的bean使用@Configuration + @Bean的方法编写完成

@Configuration
public class BeanConfig {

    @Bean
    @ConditionalOnMissingBean(XXX.class)
    public XXX beanX() {
        return new XXX();
    }
}

@ConditionalOnMissingBean注解用于表示在缺少该bean时才引入
@ConditionalOnBean,在bean存在时才注入
@ConditionalOnClass,在类存在时才注入
2.自定义注解@EnableXXX,其中@import引入上面的类

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Import({BeanConfig.class})
public @interface EnableXXX {
}

3.服务的启动类上就可以用该注解@EanbleXXX,达到引入bean的效果

@EnableXXX
public class XApplication {