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