hualinux spring 4.9: @Import导入组件

目录

一、知识点

二、使用@Import导入组件

2.1 知识点

2.2 例子

三、使用ImportSelector接口(常用)

3.1 介绍

3.2  例子

四、ImportBeanDefinitionRegistrar接口

4.1 功能

4.2 例子

五、使用FactoryBean接口

5.1 介绍

5.2 例子


@Import 导入组件,可以导入一个或多个,当多个的时候用花括号括起来,并用逗号分隔

一、知识点

 /*
* 给容器注册组件
* 1)包扫描+容器标注注解,(@Controller/@Service/@Repository)[自己写的类]
* 2)@Bean[导入]第三方里面的组件
* 3) @Import[快速给容器中导入一个组件]
*       1.@Import(要导入的容器中的组件):容器中就会自动注册这个组件,id默认是全类名
*       2.ImportSelector接口:返回需要导入的组件全类名数组(常用)
*       3.ImportBeanDefinitionRegistrar接口:手工注册bean到容器中
*4) 使用Spring提供的 FactoryBean接口(工帮Bean)
*       1.默认获取到的是工厂Bean调用getObject创建的对象
*       2.要获取工厂Bean本身,我们需要给id前面加一个&
*           &colorFactoryBean
* */

 

二、使用@Import导入组件

2.1 知识点

使用@Import导入组件,id默认是组件全类名,如果是导入多个可以用花括号,类之间用逗号隔开

2.2 例子

这个例子是基于《hualinux spring 4.5:@ComponentScan自动扫描》例1的基础上进行操作的,我在此基础上添加几空的类

src-->com.hualinux.beans.Color.java

package com.hualinux.beans;

public class Color {
}

src-->com.hualinux.beans.Red.java

package com.hualinux.beans;

public class Red {
}

src-->com.hualinux.beans.Blue.java

package com.hualinux.beans;

public class Blue {
}

src-->com.hualinux.beans.Green.java

package com.hualinux.beans;

public class Green {
}

conf.MainConfAutoScan.java配置文件修改如下

package conf;

import com.hualinux.beans.Color;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

//我把自动扫描也注解掉了
//@ComponentScan(value = "com.hualinux.beans")
@Configuration
@Import(Color.class)
public class MainConfAutoScan {

}

其它都保持不变,运行com.hualinux.beans.AutoScanMain.java,结果如下:

PS:如果是多个类的话,可以使用花括号

@Configuration
@Import({Color.class, Red.class, Blue.class})
public class MainConfAutoScan {

运行如果如下:

 

三、使用ImportSelector接口(常用)

3.1 介绍

ImportSelector接口:返回需要导入的组件全类名数组,这个功能使用的比较多

 

3.2  例子

也是在上面的基础上 2.2例子上进行修改

src-->com.hualinux.beans.MyImportSelector.java

package com.hualinux.beans;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportSelector implements ImportSelector {
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        //方法不要返回NUll值
        //return new String[0];
        return new String[]{"com.hualinux.beans.Blue", "com.hualinux.beans.Red"};
    }
}

conf.MainConfAutoScan.java配置文件修改为:

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

}

其它都保持不变,运行com.hualinux.beans.AutoScanMain.java,结果如下:

 

四、ImportBeanDefinitionRegistrar接口

4.1 功能

ImportBeanDefinitionRegistrar接口:手工注册bean到容器中

 

4.2 例子

我在3.2 例子的基础上继续操作,使用ImportBeanDefinitionRegistrar做一下判断,如果Red.java和Blue.java同时存在则手工注册一个名为rainBow的Bean

我在这里只要添加多一个类实现ImportBeanDefinitionRegistrar即可

src-->com.hualinux.beans.MyImportBeanDefinitionRegistrar.java

package com.hualinux.beans;

import com.hualinux.beans.RainBow;
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 {
    /*
    * AnnotationMetadata:当前类的注册信息
    * BeanDefinitionRegistry:BeanDefinition注册类
    *           把所有需要增加到容器中的Bean;
    *           BeanDefinitionRegistry.registerBeanDefinition手工注册进来
    * */
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
        //判断两个注册类是否相同
        boolean definiton = beanDefinitionRegistry.containsBeanDefinition("com.hualinux.beans.Red");
        boolean definition2 = beanDefinitionRegistry.containsBeanDefinition("com.hualinux.beans.Blue");

        //如果找到上面的2人类则注册 rainBow 的Bean
        if (definiton && definition2) {
            System.out.println("definiton && definition2");
            // 指定Bean我定义信:Bean的类型
            RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
            //注册一个Bean,指定bean名
            beanDefinitionRegistry.registerBeanDefinition("rainBow", beanDefinition);
        }

    }
}

在conf.MainConfAutoScan.java配置类用@Import也把这个类当组件导入

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


}

其它都保持不变,运行com.hualinux.beans.AutoScanMain.java,结果如下:

 

五、使用FactoryBean接口

5.1 介绍

使用Spring提供的 FactoryBean接口(工帮Bean)
1.默认获取到的是工厂Bean调用getObject创建的对象
2.要获取工厂Bean本身,我们需要给id前面加一个&colorFactoryBean

5.2 例子

我就直接建立一个工厂类,再写一个工厂类的bean,获取试下

src-->com.hualinux.beans.ColorFactoryBean.java

package com.hualinux.beans;

import org.springframework.beans.factory.FactoryBean;

public class ColorFactoryBean implements FactoryBean<Color> {

    public Color getObject() throws Exception {
        System.out.println("ColorFactoryBean...getObject...");
        return new Color();
    }

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

    //是单例?
    //true:这个beanj是单实例,在容器中保存一份
    //false:多实例,每次获取都会创建一个新的bean
    public boolean isSingleton() {
        return false;
        //return true;
    }
}

conf.MainConfAutoScan.java配置文件修改如下:

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

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

com.hualinux.beans.AutoScanMain.java代码修改如下:

package com.hualinux.beans;

import conf.MainConfAutoScan;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AutoScanMain {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(MainConfAutoScan.class);
        String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
        for (String name: beanDefinitionNames){
            System.out.println(name);
        }
        Object colorFactoryBean = ctx.getBean("colorFactoryBean");
        System.out.println("Bean的类型为:"+colorFactoryBean.getClass());
        //拿到它本身类
        Object colorFactoryBean2 = ctx.getBean("&colorFactoryBean");
        System.out.println("Bean2的类型为:"+colorFactoryBean2.getClass());

    }
}

运行上面的com.hualinux.beans.AutoScanMain.java结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值