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源码时,第二种方法应用的极为广泛