原创

@Import-给容器中加载bean的第三种方式

给容器中注册组件:

1)包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)
2)@Bean[导入的第三方包里面的组件]
3)@Import[快速给容器中导入一个组件]
① @Import(要导入到容器中的组件):容器中就会自动注册这个组件,id默认是全类名
②ImportSelector:返回需要导入的组件的全类名数组
③ImportBeanDefinitionRegistrar:手动注册bean到容器中
4)使用Spring提供的FactoryBean(工厂Bean);
①默认获取到的是工厂bean调用getObejct()方法创建的对象
②要获取工厂Bean本身,我们需要给bean的id前面添加一个“&”,例如“colorFactoryBean”和“&colorFactoryBean”
@Import的参数是一个类类型的数组
示例代码:

package com.debuggg.test1.main3;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({Color.class})
public class MainConfig2 {

使用ImportSelector的实现类的方式批量导入

1) ImportSelector是一个接口
2) ImportSelector的实现类需要返回一个全类名的数组,该数组即为加载bean的全类名
示例代码:
MyImportSelector

package com.debuggg.test1.main3;

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.debuggg.test1.main3.Pink","com.debuggg.test1.main3.Blue"};
    }
}

@Import处的代码

package com.debuggg.test1.main3;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({Color.class,MyImportSelector.class})
public class MainConfig2 {

使用ImportBeanDefinitionRegistrar进行手工注册

该类是一个接口类,需要实现默认方法
default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
}

//AnnotationMetadata: 当前类的注解信息
//BeanDefinitionRegistry : BeanDefinition(注册类)
// 把所有需要添加到容器的Bean:调用
// BeanDefinitionRegistry.registerBeanDefinition()手工注册

示例代码:

package com.debuggg.test1.main3;

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;

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    /**
     * 作者 ZYL
     * 功能描述 : AnnotationMetadata: 当前类的注解信息
     * BeanDefinitionRegistry : BeanDefinition(注册类)
     *      把所有需要添加到容器的Bean:调用
     *          BeanDefinitionRegistry.registerBeanDefinition()手工注册
     * 日期 2020-04-13 21:40
     * 参数 importingClassMetadata
     * 参数 registry
     * 返回值 void
     */
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //这里可以调用判断某个bean是否存在来进行注册
        boolean blue = registry.containsBeanDefinition("com.debuggg.test1.main3.Blue");
        if(blue){
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Yellow.class);
            registry.registerBeanDefinition("yellow",rootBeanDefinition);
        }

    }
}

配置类的示例代码:

package com.debuggg.test1.main3;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({Color.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {

使用FactoryBean的方式创建bean

Spring提供的FactoryBean是一个接口,里面提供了3个主要的方法
①getObject() 返回的就是创建的bean
②getObjectType() 返回值的类类型
③isSingleton() 确认该bean是单例还是不是单例,如果不是,则每次调用就生成一个bean

继承方法ColorFactoryBean的代码:

package com.debuggg.test1.main3;

import org.springframework.beans.factory.FactoryBean;

public class ColorFactoryBean implements FactoryBean {
    @Override
    public Object getObject() throws Exception {
        return new Color();
    }

    @Override
    public Class<?> getObjectType() {
        return Color.class;
    }

    public boolean isSingleton() {
        return true;
    }
}

bean的生成:
@Bean
public ColorFactoryBean colorFactoryBean(){
return new ColorFactoryBean();
}

调用的话:bean的id是colorFactoryBean,获得的对象是Color的对象,如果想要获得ColorFactoryBean本身对象,则需要在id前面加一个 "&" ,例如:“&colorFactoryBean”

正文到此结束
本文目录