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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流月up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值