#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