SpringBoot2.0深度实践学习笔记(二)之 @Enable 模块

Spring Framework手动装配之Spring@Enable模块
定义:具备相同领域的功能组件集合,组合所形成一个独立的单元
例如@EnableWebMvc,@EnableAutoConfiguration等等
实现方式:注解方式、 编程方式

【小栗子】
1、新建一个configuration包---新建一个类HelloWorldConfiguration

/**
 * HelloWorld 配置
 */
public class HelloWorldConfiguration {
    @Bean
    public String helloWorld(){  //方法名即为Bean的名称
        return "Hello,World";
    }
}

2、在annotation包下面新建一个HelloWorldImporSelector的实现类,
可以返回任意的接口,可以加分支也可以不加分支,也可以增加条件判断

/**
 * @author SLian
 * HelloWorld{@link ImportSelector}实现
 */
public class HelloWorldImporSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{HelloWorldConfiguration.class.getName()};
    }
}

说明:
将定义的HelloWorldConfiguration类放在实现的方法里面做返回值,它返回的是一个数组
实际上就是用HelloWorldImportSelector导入,然后又变成HelloWorldConfiguation这个bean

3、annotation包下新建一个注解EnableHelloWorld

/**
 *  激活 HelloWorld 模块
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
//@Import(HelloWorldConfiguration.class)//注解驱动,直接的方式
@Import(HelloWorldImporSelector.class) //导入实现类,间接方式
public @interface EnableHelloWorld {
}

说明:
可以采用注解驱动方式,直接导入HelloWorldConfiguation类,这种方式是没有弹性的。
采用编程方式,导入HelloWorldImporSelector实现类绕了一大圈,HelloWorldImporSelector实现要先加载HelloWorldConfiguation再去实现helloWorld这个bean,这种导入实现类的方式比较有弹性,可以定义多种返回值(可以参考源码CachingConfigurationSelector实现类,里面实现了switch分支)

注解配置只有一种方式,接口编程有多种方式(case)

4、bootstrap包下新建一个引导类EnableHelloWorldBootstrap

/**
 * {@link EnableHelloWorld} 引导类
 */
@EnableHelloWorld
public class EnableHelloWorldBootstrap {
    public static void main(String[] args) {

        ConfigurableApplicationContext context = new SpringApplicationBuilder(EnableHelloWorldBootstrap.class)
                    .web(WebApplicationType.NONE)
                    .run(args);

        //helloWorld Bean 是否存在
        String helloWorld = context.getBean("helloWorld",String.class);
        System.out.println("helloWorld Bean : " + helloWorld);

        // 关闭上下文
        context.close();
    }
}

运行


Image 1.png

你可能感兴趣的:(SpringBoot2.0深度实践学习笔记(二)之 @Enable 模块)