敲代码的帅boy
有关@import的注解(简略版~待续更新中--------)

@import

对于非三层组件: 将某一个bean加入到IOC容器中可以采用@import的方式 直接通过类加入到@import注解中来加入到IOC容器中

前提:

需要在有@configruation的注解的配置类中编写:

1,可以直接写在@import中:

/*比如要将一个apple.class的类加入到IOC容器中
直接在()中写*/
@configruation
	@import(apple.class)
/*在()中是可以写多个的因为@import中是数组类型*/

@import(apple.class,banana.class)

2.②自定义ImportSelector接口的实现类,通过selectimports方法实现(方法的返回值 就是要纳入IoC容器的Bean) 。 并且 告知程序 自己编写的实现类。 @Import({Orange.class,MyImportSelector.class})

/*
Import注解第二种方法:
* 通过自定义ImportSelector接口的实现类,实现selectImports()方法
直接在方法中的返回值中加入要加入IOC容器的Bean的全类名
还要
通过@Import({接口实现类的名字.class})
告诉程序自己编写的实现类
*
*
*
* */
import cn.blackui.entity.Apple;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class MyimportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {


        return new String[]{"cn.blackui.entity.Apple","cn.blackui.entity.Banana"};  //返回值就是要加入IOC容器的bean全类名
    }

}

3,③编写ImportBeanDefinitionRegistrar接口的实现类,重写方法

@Import({Orange.class,MyImportSelector.class,ImportBeanDefinitionRegistrar.class})

/*
* @Import注解的第三种方式
* 通过实现ImportBeanDefinitionRegistrar接口的类
* 通过registerBeanDefinitions()中的参数:BeanDefinitionRegistry  beanDefinitionRegistry来加入我们的bean
* 用到.registerBeanDefinition(String var1, BeanDefinition var2)方法
* 注意::在使用时由于需要BeanDefinition类型
* BeanDefinition是个接口类他的实现类:RootBeanDefinition来进行转型
*
*
*

* */

import cn.blackui.entity.Orange;
import org.springframework.beans.factory.config.BeanDefinition;
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 {
    @Override
    //BeanDefinitionRegistry:bean的定义注册信息,他能拿到我们bean的所有信息,那么我们可以直接将bean注册到这个里面就可以了
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {

        //"cn.blackui.entity.Orange"
        //在 void registerBeanDefinition(String var1, BeanDefinition var2)中参数必须一致,所以需要将要加入的类名.class
        //转成beanDefinition型,所以用BeanDefinition这个接口的实现类RootBeanDefinition new个对象为beanDefinition型
        //点进去查看RootBeanDefinition类有class型string型都可以用::
            BeanDefinition beanDefinition= new RootBeanDefinition(Orange.class);
        //  BeanDefinition beanDefinition= new RootBeanDefinition("cn.blackui.entity.Orange");
        beanDefinitionRegistry.registerBeanDefinition("myorange",beanDefinition);//id class

    }
}