Есть ли какой-либо способ разрешить заполнитель в beanName?

#java #spring #spring-mvc

Вопрос:

 <?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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:component-scan base-package="com.wqh">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
    </context:component-scan>
    
    <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:custom.properties</value>
            </list>
        </property>
    </bean>

    <aop:aspectj-autoproxy proxy-target-class="true"/>
    <bean class="com.wqh.demo.TestBean" name="${custom.beanName}" />
</beans>
 

Когда я использую подобную конфигурацию, Spring создаст определение Beand с именем beanName ${custom.beanName} и не разрешит заполнитель внутри него.
Но я хочу использовать имя, указанное в custom.properties файле, есть ли способ выполнить это требование?

Комментарии:

1. вы не можете назначить переменную в качестве имени компонента

Ответ №1:

Следующая конфигурация приведет к NoSuchBeanDefinitionException тому, что при попытке получить компонент из контекста.

 <bean class="com.wqh.demo.TestBean" name="${custom.beanName}" />
 

Однако в предложениях XML-шаблона для имени атрибута показано следующее

Атрибут : имя может использоваться для создания одного или нескольких псевдонимов, запрещенных в идентификаторе (XML). Несколько псевдонимов могут быть разделены любым количеством пробелов, запятых или точек с запятой (или любой их смесью).

Тип данных : строка

Исходя из этого , возможен следующий обходной путь

Учитывая, что запись в файле свойств является :

 custom.beanName=propBeanName
 

Предоставьте конфигурацию компонента с несколькими псевдонимами следующим образом

 <bean class="com.wqh.demo.TestBean" name="testBeanName ${custom.beanName}"  />
 

Теперь , когда вы getBean() основываетесь на имени из контекста приложения, оно успешно извлекает компонент

Пример кода

 public static void main(String[] args) {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("app-context.xml");
    System.out.println(Arrays.asList(ctx.getAliases("testBeanName")));
    TestBean bean = (TestBean)ctx.getBean("propBeanName");
    System.out.println(bean);
}
 

будет отображаться следующее в консоли

 [propBeanName]
com.wqh.demo.TestBean@4c60d6e9