注入Bean可以通过好几种注解方式:@Controller、@Service、@Repository一般用于自己写的类。@Bean注解一般用于别人写好的代码,我们需要注入时,可以通过该注解注入。
还有一种计较简便的方法,用@Import注解快速导入组件。
看一下@Import注解的源码,value属性是一个Class类型的数组。所以,我们需要注入哪个bean,只需要将其类名.class写入数组中即可。
输出IOC容器中所有的bean:
可以发现,LinuxBook和WindowsBook都已经成功注入到IOC容器中,bean的id默认为类的全类名。
@Import使用ImportSelector
ImportSelector是Spring提供的一个接口,先来看一下源码
很简单,里面就只有一个selectImports抽象方法,该方法返回一个String[]数组,AnnotationMetadata类可以获取当前组件上的所有注解信息。我们只需要写一个Selector实现该接口中的selectImports方法,返回想注入的组件的全类名数组即可。
MyImportSelector类代码如下所示:
配置类如下所示,在类上加上@Import注解,value中将MyImportSelector.class放进去。就可以注入MyImportSelector方法中返回的组件。
运行结果:
@Import使用ImportBeanDefinitionRegistrar
先看一下ImportBeanDefinitionRegistrar的源码,这是一个接口, 里面有一个registerBeanDefinitions()抽象方法,AnnotationMetadata可以获取当前类的所有注解信息,BeanDefinitionRegistry可以获得当前注册bean的定义。我们可以在这个方法中注册bean组件。
自定义一个方法实现ImportBeanDefinitionRegistrar,判断IOC容器中是否有LinuxBook和WindowsBook组件,如果都有的话,向容器中注册Book组件。
配置类如下所示:
运行结果: