概述
使用XML配置文件、注解、java 配置、使用 import注解
- 使用xml配置文件
- 在xml配置文件中使用标签来定义Bean,通过ClassPathXmlApplicationContext等容器来加载 并初始化Bean
- 使用注解
- 使用Spring提供的注解,例如:@Component、@Service 、@Controller、@Repository 等注解来标识Bean
- 通过@ComponentScan等注解扫描来加载并初始化Bean
- 使用java配置
- 可以使用java代码来配置Bean,例如使用@Configuration和@Bean注解来定义Bean
- 然后通过AnnotationConfigApplicationContext等容器来加载并初始化Bean
- 使用import注解
- 使用@Import注解来引入其它配置类,然后通过容器加载 并初始化Bean
- @Import注解提供了三种用法
- 直接Import导入
- ImportSelector接口批量
- ImportBeanDefinitionRegistrar条件注册
import注解
- spring框架中的一个注解,用于在一个配置类中引入其它配置类或者普通的java类
- 默认的bean名称是:类全限定名,即包名+类名
源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
/**
* {@link Configuration @Configuration}, {@link ImportSelector},
* {@link ImportBeanDefinitionRegistrar}, or regular component classes to import.
*/
Class<?>[] value();
}
ImportSelector 接口
用于实现动态 注册 Bean的功能,批量导入对象到容器里,根据条件动态的选择需要注册的Bean,并加入spring容器,实现ImportSelector接口,这个接口的selectImports方法会返回一个String数组,数组中的值 就是添加的组件的全类名
源码
public interface ImportSelector {
// 该方法的返回值是一个String数组,用于指定需要注册的Bean的类名
String[] selectImports(AnnotationMetadata importingClassMetadata);
@Nullable
default Predicate<String> getExclusionFilter() {
return null;
}
}
实战
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.fun.complex.BlueColor"};
}
}
ImportBeanDefinitionRegistrar接口
是spring框架中的一个接口,用于实现动态 注册Bean的功能,ImportBeanDefinitionRegistrar可以运行时动态的向spring容器中注册 BeanDefinition,与ImportSelector不同的是,ImportSelector只能返回注册的Bean的类名
源码
public interface ImportBeanDefinitionRegistrar {
default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,
BeanNameGenerator importBeanNameGenerator) {
registerBeanDefinitions(importingClassMetadata, registry);
}
default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
}
}
实践
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
if (registry.containsBeanDefinition("com.fun.complex.BlueColor")) {
// 如果存在,那么不再注册
System.out.println("存在。。。");
}else {
// 不存在,注册
RootBeanDefinition definition = new RootBeanDefinition(BlueColor.class);
registry.registerBeanDefinition("blue",definition);
}
}
}