SpringBoot 的自动装配功能深受大家的喜欢, 可以零配置的方式加载应用.

但是实际项目中, 有很多情况是: 我们引入一个jar包, 只是引用到其中的一些类, 而不希望其执行自动装配的操作. 那么这个时候, jar包就需要用手动装配的方式.

1. 自动装配( 使用@EnableAutoConfiguration方式 )

首先, 写一个初始化类, 加上 @Configuration 注解;

然后, 在”META-INF/spring.factories”中配置:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  类全限定名

这样, 在pom.xml引入该模块时, SpringBoot会自动初始化spring.factories中的类

2. 手动装配

手动装配有两种方式:

1. 直接用@Import方式引入

首先, 写一个模块初始化入口类(比如XXXModule.java), 加上@Configuration注解

然后, 在需要引用的模块中, @Import({ XXXModule.class}) 就可以

这种方式简单明了, 但是每个初始化类,都需要手动Import, 比较麻烦;

2. 自定义AutoConfiguration的方式(和 @EnableAutoConfiguration 自动装配原理一样)

首先, 写一个 XXXImportSelector.java类, 该类要实现 ImportSelector.java 接口

public class XXXImportSelector implements ImportSelector{
  @Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		//todo 返回需要加载的类全限定名
	}
}

其次, 写一个@EnableXXXXX注解, 加上@Import({XXXImportSelector.class})

然后, 在需要引用的模块中, 加入注解:@EnableXXXXX 就可以.

这种方式可以在”XXXImportSelector.java”中添加任意需要初始化的类, 而且可以配合EnableXXXXX的注解使用, 比较灵活

在开发中, 自动装配和手动装配往往需要结合使用, 这里有几点建议:

  1. 如果是模块必须初始化的类, 建议用自动装配的方式;
  2. 如果是含有复杂逻辑的初始化工作, 可以结合@ConditionalOnXXX使用, 要知道SpEL基本上能满足需求
  3. 如果是需要调用方去指定初始化的类, 或者选择权交给调用方处理的类, 建议用手动装配的方式, 这样可以避免一些不必要的初始化配置

发表评论

电子邮件地址不会被公开。 必填项已用*标注