2.Spring的IOC容器里面加入对象的常见方式

概述

  使用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);
        }
    }
}

相关推荐

  1. 2.SpringIOC容器里面加入对象常见方式

    2024-07-11 13:58:03       25 阅读
  2. Spring IOC 容器构建流程?

    2024-07-11 13:58:03       26 阅读
  3. 前端常见加密方式

    2024-07-11 13:58:03       27 阅读
  4. Spring(创建对象方式3个)

    2024-07-11 13:58:03       37 阅读
  5. 常见加密方式都有哪些

    2024-07-11 13:58:03       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 13:58:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 13:58:03       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 13:58:03       58 阅读
  4. Python语言-面向对象

    2024-07-11 13:58:03       69 阅读

热门阅读

  1. React基础学习-Day02

    2024-07-11 13:58:03       20 阅读
  2. MyClass.static_method() 加不加括号有什么区别

    2024-07-11 13:58:03       24 阅读
  3. AcWing 1633:外观数列

    2024-07-11 13:58:03       26 阅读
  4. nginx的重定向

    2024-07-11 13:58:03       24 阅读
  5. SpringBoot整合Easy-Es最佳实践

    2024-07-11 13:58:03       21 阅读
  6. SpringBoot防止重复提交 AOP+自定义注解+redis

    2024-07-11 13:58:03       23 阅读