Skip to content

一、ImportBeanRegistrar 实例

1. 创建一个 Mac 对象类

java
package org.example.spring5.domain;

/**
 * @author: Calvin <br>
 * @date: 2020/11/25 17:26 <br>
 * @since: 1.0 <br>
 * @description: Mac <br>
 */
public class Mac {

    public Mac() {
        System.out.println("【Mac系统】将被注入到Spring IoC容器中...");
    }

}

2. 创建一个 MacOsManualImportBeanDefinitionRegistrar 实现类,实现接口 ImportBeanDefinitionRegistrar 接口类。

java
package org.example.spring5.config.register;

import org.example.spring5.domain.Mac;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @author: Calvin <br>
 * @date: 2020/11/26 15:03 <br>
 * @since: 1.0 <br>
 * @description: MacOsManualImportBeanDefinitionRegistrar <br>
 */
public class MacOsManualImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    /**
     * 手动注册 Bean对象到IOC容器
     *
     * @param annotationMetadata 注解信息
     * @param registry           注册器
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
        RootBeanDefinition MacBeanDefinition = new RootBeanDefinition(Mac.class);
        registry.registerBeanDefinition("mac",MacBeanDefinition);
    }
}

3. 在 @EnableOS 中添加 @Import 添加 MacOsManualImportBeanDefinitionRegistrar.class 值。

  • 作用:将手动注册 Mac Bean对象写入到配置文件中,再通过配置文件加载到 IOC 容器中。
java
package org.example.spring5.config.annotations;

import org.example.spring5.config.imports.ImportSelectorOS;
import org.example.spring5.config.register.MacOsManualImportBeanDefinitionRegistrar;
import org.springframework.context.annotation.Import;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author: Calvin <br>
 * @date: 2020/11/26 10:50 <br>
 * @since: 1.0 <br>
 * @description: EnableOS <br>
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(value = {
        ImportSelectorOS.class,
        MacOsManualImportBeanDefinitionRegistrar.class
})
public @interface EnableOS {
}

4. 启动程序

java
package org.example.spring5;

import org.example.spring5.config.SpringConfiguration;
import org.example.spring5.domain.User;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Arrays;

/**
 * @author: Calvin <br>
 * @date: 2020/11/25 14:27 <br>
 * @since: 1.0 <br>
 * @description: SpringApplication <br>
 */
public class SpringApplication {

    private static AnnotationConfigApplicationContext annotationConfigApplicationContext;

    public static void main(String[] args) {
        annotationConfigApplicationContext  = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        System.out.println("Bean 对象已装配完毕...");
    }
}

5. 执行结果

java
【Win7操作系统】将被注入到Spring IoC容器中...
【Win10操作系统】将被注入到Spring IoC容器中...
【Mac系统】将被注入到Spring IoC容器中...
Bean 对象已装配完毕...