spring应用手册-IOC(XML配置实现)-(33)-context:component-scan的name-generator属性

    科技2022-08-03  104

    戴着假发的程序员出品

    context:component-scan的name-generator属性

    spring应用手册(第一部分)

    name-generator这个属性指定你的构造型注解,注册为Bean的ID生成策略,这个生成器基于接口BeanNameGenerator实现generateBeanName方法,你可以自己写个类去自定义策略。这边,我们可不显示配置,它是默认使用org.springframework.context.annotation.AnnotationBeanNameGenerator生成器,也就是类名首字符小写的策略,如Account类,它注册的Bean的ID为account.并且可以自定义ID,.这边简单贴出这个默认生成器的实现。

    public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) { if (definition instanceof AnnotatedBeanDefinition) { String beanName = determineBeanNameFromAnnotation((AnnotatedBeanDefinition) definition); if (StringUtils.hasText(beanName)) { // Explicit bean name found. return beanName; } } // Fallback: generate a unique default bean name. return buildDefaultBeanName(definition, registry); }

    我们可以自定义一个BeanName的生成器:

    /** * @author 戴着假发的程序员 * * @description */ public class MyBaenNamegenerator implements BeanNameGenerator { @Override public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) { String beanName = null; //从beanDefinition中取出类名 String beanClassName = beanDefinition.getBeanClassName(); if(beanClassName.indexOf(".")!=-1){ beanClassName = beanClassName.substring(beanClassName.lastIndexOf(".")+1); //我们来添加一个前缀 beanName = "dk_"+beanClassName; } return beanName; } }

    修改配置: 其中的name-generator指定为我们自定义的生成器

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan name-generator="com.boxuewa.dk.demo5.MyBaenNamegenerator" base-package="com.boxuewa.dk.demo5"> </context:component-scan> </beans>

    修改Student类,添加一个BeanNameAware接口的实现(关于BeanNameAware接口请参看相关介绍 )。

    /** * @author 戴着假发的程序员 * * @description */ @Component public class Student implements BeanNameAware { @Override public void setBeanName(String s) { System.out.println("Student的BeanName:"+s); } }

    测试:

    @Test public void testNameGen(){ ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-demo9.xml"); }

    结果: 我们发现Student的Beanname会按照我们的规则生成.

    Processed: 0.010, SQL: 8