向Spring容器中注册组件的方法汇总小结
1、通过xml定义
<bean class="">
<property name="" value=""></property>
</bean>
2、通过注解
这种方式比较常见,通常用@Controller、@Component、@Service等等
3、通过@Bean注解
比如下面的代码往容器中注册一个Person对象
@Bean
public Person person(){
return new Person("张三", 20);
}
默认情况下,使用方法【person()】名person作为Person对象的注册id
也可以通过修改方法名或者使用@Bean(“customBeanName”)
4、通过实现FactoryBean接口
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
// Sample
public class PersonFactoryBean implements FactoryBean<Person> {
....
}
实现上述接口的3个方法,并把PersonFactoryBean注册到容器中,就可以把Person也注册到容器中。
具体创建Person过程的源码可以看FactoryBeanRegistrySupport#getObjectFromFactoryBean方法。
// 如下代码拿到的是Person对象
applicationContext.getBean("personFactoryBean")
// 如果想要拿到PersonFactoryBean对象,可以再前面加&
applicationContext.getBean("&personFactoryBean")
5、通过@Import注解
先来看看源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
/**
* {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
* or regular component classes to import.
*/
Class<?>[] value();
}
源码注释写的也很清楚,可以引入 配置类、ImportSelector、ImportBeanDefinitionRegistrar,甚至是普通class。 通过@Import,我们可以使用如下方式注册组件:
@Import({Person.class, MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
其中:
-
MyImportSelector实现了ImportSelector接口,selectImports方法返回类全名的String[]都会被注册到容器中
-
MyImportBeanDefinitionRegistrar实现了ImportBeanDefinitionRegistrar接口
// Sample
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// 指定Bean定义信息
RootBeanDefinition beanDefinition = new RootBeanDefinition(Person.class);
// 注册一个Bean,指定bean名
registry.registerBeanDefinition("person", beanDefinition);
}
}
```
这是一个非常重要的注解,在Spring源码中,哪哪都能看到他的身影。
-
如 @EnableAspectJAutoProxy注解
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(AspectJAutoProxyRegistrar.class) public @interface EnableAspectJAutoProxy { ... }
EnableAspectJAutoProxy通过@Import引入了AspectJAutoProxyRegistrar类[实现了 ImportBeanDefinitionRegistrar],这个Registrar里面又会向Spring容器中注册AnnotationAwareAspectJAutoProxyCreator(Spring aop注解实现的功臣)。
-
如 @EnableWebMvc注解。通过Import引入的是一个配置类
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(DelegatingWebMvcConfiguration.class) public @interface EnableWebMvc { }
-
如 @EnableAsync注解。通过Import引入的是AsyncConfigurationSelector[实现了ImportSelector接口]
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(AsyncConfigurationSelector.class) public @interface EnableAsync { ... }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端