栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

@Import及其相关注解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

@Import及其相关注解

给注解中注册组件:

a. 包扫描 + 组件标注(@Controller/@Service/@Repository/@Component),在自己写类一般使用

b. @Bean[导入第三方组件]

c. @import[快速给容器导入组件]

d. 使用Spring提供的工厂FactoryBean——默认获取的是工厂Bean调用getObject()创建的对象,在bean的名字前加上&可以获取到工厂Bean本身

@import注解作用
@import({Color.class, Red.class})

给容器中自动创建这两个类型的组件,默认组件的名称是全类名

com.floweryu.example.config.bean.User

@importSelector注解作用

返回需要导入的组件的全类名数组

需要先实现importSelector接口selectimports:

public class MyimportSelector implements importSelector {

    
    @Override
    public String[] selectimports(Annotationmetadata importingClassmetadata) {
        // 方法不要返回Null值
        return new String[] {"com.floweryu.example.bean.Blue", "com.floweryu.example.bean.Green"};
    }
}

然后在@import注解中导入该类:

@Configuration
@import({Color.class, Red.class, MyimportSelector.class})
public class MainConfig2 {
    
    @Lazy
    @Bean("book")
    public Book book() {
        System.out.println("向容器中添加book...");
        return new Book("小王子", "猫儿");
    }
}

这样就可以将Blue和Green类注入到容器中

@importBeanDefinitionRegistrar注解作用

可以手动并且按条件注入bean

先实现importBeanDefinitionRegistrar里面的一个接口registerBeanDefinitions:

public class MyimportBeanDefinitionRegistrar implements importBeanDefinitionRegistrar {
    
    @Override
    public void registerBeanDefinitions(Annotationmetadata importingClassmetadata, BeanDefinitionRegistry registry) {
        boolean red = registry.containsBeanDefinition("com.floweryu.example.bean.Red");
        boolean blue = registry.containsBeanDefinition("com.floweryu.example.bean.Blue");
        // 如果容器中有上面的bean,则注入rainBow
        if (red && blue) {
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);
            // 注入一个bean,并且指定名字
            registry.registerBeanDefinition("rainBow", rootBeanDefinition);
        }
    }
}

然后在@import中注入上面类:

@Configuration
@import({Color.class, Red.class, MyimportSelector.class, MyimportBeanDefinitionRegistrar.class})
public class MainConfig2 {
    
    @Lazy
    @Bean("book")
    public Book book() {
        System.out.println("向容器中添加book...");
        return new Book("小王子", "猫儿");
    }
}

这样如果容器中存在符合条件的bean,就会注入自定义的bean.

FactoryBean

实现FactoryBean接口,创建工厂bean

public class ColorFactoryBean implements FactoryBean{
    
    @Override
    public Object getObject() throws Exception {
        System.out.println("getObject ...");
        return new Color();
    }

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

然后注入这个工厂bean

@Configuration
public class MainConfig2 {
    @Bean
    public ColorFactoryBean colorFactoryBean() {
        return new ColorFactoryBean();
    }
}

最后测试获取bean

@Test
public void importTest() {
    Object colorFactortyBean = context.getBean("colorFactoryBean");
    System.out.println("colorFactoryBean...  " + colorFactortyBean.getClass());
}
// 输出如下
getObject ...
colorFactoryBean...  class com.floweryu.example.bean.Color

发现最终获取的Bean是Color

如果想获取这个工厂bean怎么办?

在前面添加**&**符号,这个在BeanFactory接口中可以查到

@Test
public void importTest() {
    printNames();
    Object colorFactortyBean = context.getBean("&colorFactoryBean");
    System.out.println("colorFactoryBean...  " + colorFactortyBean.getClass());
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/750621.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号