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();
}
}
运行