在Spring中如何自定义BeanName生成规则?

BeanName是什么?

BeanName是Spring中用来区分不同Bean的一种手段,IoC容器必须保证BeanName的唯一性。如果无法保证BeanName的唯一性,容器会抛出异常,类似于我们的身份证,用户可以通过BeanName来定位唯一一个Bean。例如通过BeanFactory或者ApplicationContext提供的getBean方法。

AbstractSuperBean extendAbstractBean = 
				(AbstractSuperBean) applicationContext.getBean("extendAbstractSuperBean");

怎么用?

在IoC容器中默认为用户类生成BeanName规则是Bean的简单类名首字母小写,但用户也可以通过@Component或者其派生注解@Service、@Controller等来指定BeanName,这样IoC容器就会使用用户指定的BeanName。

@Component("extendAbstractBean")
public class ExtendAbstractSuperBean extends AbstractSuperBean {
     
   
}

如何自定义BeanName生成规则?

借助于IoC容器良好的扩展性,我们只需要编写一个类实现BeanNameGenerator接口即可。

在Spring中如何自定义BeanName生成规则?_第1张图片
这是自定义的一个BeanNameGenerator,返回的BeanName是将BeanClass的简单名称首字母小写,这里借助了java.beans包中的内省器-Introspector的decapitalize方法。
@SuppressWarnings("all")
public class MyBeanNameGenerator implements BeanNameGenerator {
     
   @Override
   public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
     
      String beanClassName = definition.getBeanClassName();
      int idx = beanClassName.lastIndexOf(".");
      beanClassName = beanClassName.substring(idx + 1,beanClassName.length());
      return Introspector.decapitalize(beanClassName);
   }
}

然后在@ComponentScan注解中配置器nameGenerator属性即可,这样就可以替换掉IoC容器内部默认的BeanNameGenerator。

需要注意的是这里的自定义BeanNameGenerator不能作用于通过@Import注解导入的Bean的BeanN-ame生成,目前IoC容器还没有将其对外开放。

你可能感兴趣的:(Spring,Context,spring,spring,boot,bean,java,ioc)