随笔 - 1162  文章 - 0  评论 - 16  阅读 - 59万 

一、@Import 注解

给容器中注册方式:

1) 通过包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)【适用于添加自己写的类】
2@Bean 导入第三方包里面的组件
3@Import:快速给容器中导入一个组件
  【1@Import(要导入到容器中组件),容器会自动注册这个组件,id 默认是全类名;
  【2】ImportSelector:返回需要导入的 组件的全类名数组;
  【3】ImportBeanDefinitionRegistrar:手动注册 bean 到容器中

二、注册组件

给容器中注册组件有以下几种方式:

(1)通过包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)【适用于添加自己写的类】

(2)@Bean (适用于导入第三方包里面的组件)

(3)@Import:快速给容器中导入一个组件

三、@Import 注解快速导入

在配置类上面使用 @Import 注解可以快速给容器中导入组件:

@Import(value = {Color.class, Red.class}) //快速导入多个组件
@Configuration
public class MainConfig4 {

    @Bean(name = "person")
    public Person person01() {
        return new Person("李四"20);
    }

}

注意

(1)配置类只能有一个 @Import 注解,不能出现多个;

(2)导入的组件的 id 默认是组件的全类名

四、@ImportSelector

ImportSelect 是一个接口,里面提供了一个方法 selectImports,用于返回要导入的组件的全类名数组。

自定义一个 MyImportSelect 类,实现 ImportSelect 接口

//自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector {

    /**
     * 返回值,就是要导入到容器中组件全类名
     * AnnotationMetadata:当前标注 @Import 注解的类的所有注解信息
     * @param importingClassMetadata
     * @return
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {

        //方法不要返回 null 值,可以返回空数组
        return new String[]{"com.njf.bean.Yellow""com.njf.bean.Blue"};
    }

}

在配置类上进行应用:

@Import(value = {Color.class, Red.class, MyImportSelector.class})
@Configuration
public class MainConfig4 {

    @Bean(name = "person")
    public Person person01() {
        return new Person("李四"20);
    }

}

五、@ImportBeanDefinitionRegistrar

ImportBeanDefinitionRegistrar 是一个接口,它里面有一个 registerBeanDefinition 方法,用于向容器中注册一个组件。

自定义一个 MyImportBeanDefinitionRegistrar 类:

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    /**
     * AnnotationMetadata:当前类的注解信息
     * BeanDefinitionRegistry:Bean定义的注册类
     *   把所有需要添加到容器中的 bean,调用registerBeanDefinition方法进行手工注册
     *   BeanDefinitionRegistry.registerBeanDefinition
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        boolean definition1 =  registry.containsBeanDefinition("com.njf.bean.Red");
        boolean definition2 =  registry.containsBeanDefinition("com.njf.bean.Blue");
        if (definition1 && definition2) {

            //beanDefinition  指定bean的类型,bean的定义信息,如类型,scope等信息
            RootBeanDefinition beanDefinition = new  RootBeanDefinition(RainBow.class);
            //注册一个bean,指定bean的名字
            registry.registerBeanDefinition("rainBow",  beanDefinition);
        }
    }

}

在配置类上应用:

@Import(value = {Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
@Configuration
public class MainConfig4 {

    @Bean(name = "person")
    public Person person01() {
        return new Person("李四"20);
    }

}

测试结果:

posted on   格物致知_Tony  阅读(73)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示

目录导航