给容器中注册组件的方式
- 包扫描+标注注解(@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
|