- 包扫描+标注注解(@Controller/@Service/@Repository/@Component)一般用于自己写的类
- @Configuration+@Bean,一般用于导入的第三方包里面的组件
- @Import,一般用于封装公共组件,提供jar包
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
Class>[] value();
}
- @Import(组件);容器中就会自动注册这个组件,id默认是全类名,如果导入的是@Configuration,没那么其类中的@Bean也会全部被导入
- @Import(ImportSelector或者DeferredImportSelector):返回需要导入的组件的全类名数组;
public interface ImportSelector {
String[] selectImports(AnnotationMetadata importingClassMetadata);
}
AnnotationMetadata可以获取到标注这个注解的类的相关信息,返回值不可为null,是导入类的全类名。
ImportSelector的实现类可以实现EnvironmentAware、BeanFactoryAware、BeanClassLoaderAware、ResourceLoaderAware接口获取相关的环境信息。
- @Import(BeanDefinitionRegistrar):手动注册bean到容器中
public interface ImportBeanDefinitionRegistrar {
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
}
AnnotationMetadata可以获取到标注这个注解的类的相关信息,通过BeanDefinitionRegistry手动注册组件。
ImportBeanDefinitionRegistrar的实现类可以实现EnvironmentAware、BeanFactoryAware、BeanClassLoaderAware、ResourceLoaderAware接口获取相关的环境信息。
5. 使用Spring提供的 FactoryBean,非常适合整合其他框架;
- 默认获取到的是工厂bean调用getObject创建的对象
- 要获取工厂Bean本身,我们需要给id前面加一个&
6. 直接注册一个Bean:SingletonBeanRegistry#registerSingleton



