Spring注解驱动第六讲--@Import注解

在以前的博客中介绍了两种让容器自动装配bean的方法:

  1,使用@Bean注解进行装配

  2,使用@ComponentScan进行包扫描,扫描带有@Controller,@Service,@Repository,@Component注解的类即可装载bean

还有一种方式,使用@Import注解进行对引用第三方类时使用

用法:

一,直接在主配置类上添加@Import注解,注解的值赋值上要创建的类型即可

首先创建一个要加载进来的外部类

public class Color {
    ...
}

可以看到此类没有添加任何可以让包扫描到的注解,在容器创建是也不会加载到容器中

然后在主配置类上添加@Import注解

@Configuration
@Import({Color.class})//注解里面的值为需要IOC加载的类的类型
public class MainConfig2 {

}

测试类和返回结果:

public class IOCTest {
    @Test
    public void test4() {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
        String[] names = applicationContext.getBeanDefinitionNames();//返回容器中所有bean的名字
        for (String name : names) {
            System.out.println(name);
        }
    }
}

运行结果:

mainConfig2
com.wxj.bean.Color

观察可得,使用@Import导入的组件在ioc容器中默认的id为全类名

二,实现ImportSelector接口方式

1,创建一个一个方法来实现ImportSelector接口()

public class MyImportSelector implements ImportSelector {
    /**
     * AnnotationMetadata类中可以获得注解名字,等注解信息
     * 
     * 返回的String数组为要让@Import注解加载的类的全类名
     */
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        
        return new String[] {"com.wxj.bean.Color"};//需要ioc容器管理的全类名,多个类可以由,分隔
    }

}

2,更改主配置类的@Import注解中的value值

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

3,再次运行

mainConfig2
com.wxj.bean.Color

三,实现ImportBeanDefinitionRegistrar接口(手工的自定义bean)

1,实现ImportBeanDefinitionRegistrar,代码如下:

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    /**
     * importingClassMetadata:当前类的直接信息
     * registry:bean定义的注册类,通过使用它来为容器中注册bean
     *         把所有需要加到容器中的bean通过手工注册,调用BeanDefinitionRegistry的registerBeanDefinition方法进行手工注册
     *         
     */
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //指定bean的定义信息...
        RootBeanDefinition beanDefinition = new RootBeanDefinition(Color.class);
        //给容器中的bean自定义id
        registry.registerBeanDefinition("Color", beanDefinition);
    }

}

2,更改主配置类

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

3,运行结果

mainConfig2
Color

注:在以后阅读SpringBoot源码时,第二种方法应用的极为广泛

posted @ 2019-07-18 19:39  焦糖毛嗑  阅读(220)  评论(0编辑  收藏  举报