Spring如何通过普通类实现"lite" bean模式?
普通无注解类中Spring Lite @Bean模式的实现方式
Spring文档中提到的Lite @Bean模式包含“在无@Configuration/@Component注解的普通类中声明@Bean”的场景,但这类@Bean无法通过@ComponentScan自动被Spring识别,必须通过手动将该普通类注册到Spring容器中,才能触发对其中@Bean方法的处理。以下是具体实现方案:
一、通过@Import导入普通类
这是最简洁的实现方式,只需将包含@Bean方法的普通类通过@Import注解导入到任意@Configuration类中,Spring会自动注册该普通类的实例,并处理其中的@Bean方法。
代码示例
// 普通无注解类,包含@Bean方法 public class LiteBeanProvider { @Bean public UserService userService() { return new UserService(); } @Bean public OrderService orderService() { return new OrderService(); } }
// 配置类,导入普通类 @Configuration @Import(LiteBeanProvider.class) public class AppConfig { // 无需额外配置,Spring自动处理LiteBeanProvider中的@Bean方法 }
注册完成后,LiteBeanProvider本身会成为Spring容器管理的bean,其内部定义的userService和orderService也会被注册为容器bean,且处于Lite模式。
二、手动注册BeanDefinition
通过实现BeanDefinitionRegistryPostProcessor接口,手动向Spring容器注册普通类的BeanDefinition,Spring后续会创建该类实例并处理其中的@Bean方法。
代码示例
// 自定义Bean注册处理器 public class CustomBeanRegistrar implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { // 构建普通类的BeanDefinition GenericBeanDefinition beanDef = new GenericBeanDefinition(); beanDef.setBeanClass(LiteBeanProvider.class); // 将BeanDefinition注册到容器 registry.registerBeanDefinition("liteBeanProvider", beanDef); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // 无需额外操作 } }
// 在配置类中注册自定义处理器 @Configuration public class AppConfig { @Bean public CustomBeanRegistrar customBeanRegistrar() { return new CustomBeanRegistrar(); } }
Lite模式的核心特性
与Full @Configuration模式的核心区别在于:
- Lite模式下的@Bean方法不会被CGLIB代理,同一类中@Bean方法互相调用时,会直接执行方法创建新实例,而非从Spring容器中获取已注册的bean
- 普通类仅作为@Bean方法的载体,不会被Spring代理增强
内容的提问来源于stack exchange,提问作者Manuel Jordan
相关产品推荐
相关产品推荐

