我的上下文定义文件中有很多重复的bean,只有名称不同。
因此,当我想要定义bean a,b和c时,我必须添加:
<bean id="a" class="org.project.A" />
<bean id="b" class="org.project.B" />
<bean id="c" class="org.project.C" />
<bean id="aDao" class="org.project.ADAO" />
<bean id="bDao" class="org.project.BDAO" />
<bean id="cDao" class="org.project.CDAO" />
由于有超过3个bean,我想要类似的东西:
bean: a,b,c
templates:
- <bean id=":bean:" class="org.project.:bean:upper:" />
- <bean id=":bean:Dao" class="org.project.:bean:upper:DAO" />
在Spring中有没有办法做到这一点? 如果我必须实现自己的解决方案,在尝试导入生成的文件之前如何让Spring调用此函数?
答案 0 :(得分:2)
Spring中没有这样的功能。您可以编写maven插件或其他一些搜索bean的预处理工具并生成XML文件。
或者您可以让Spring执行此操作并通过使用@Service
,@Repository
和朋友注释您的bean来完全删除XML定义。
答案 1 :(得分:1)
如果使用annotation based container configuration,则无需生成bean定义xml元素。
答案 2 :(得分:0)
在我的一个项目中,我使用Apache Velocity使用模板文件为IoC框架生成配置。模板语言简单而强大。 您可以将其实现为Java应用程序,从Ant调用它等等。
答案 3 :(得分:0)
我最后一次检查(几年前),Spring使用以下(简化)算法来创建bean:
读取XML文件以获取bean定义。 bean是不是立即创建的。相反,它们的定义保存在一些数据结构中,稍后(在步骤4中)将查询以创建bean。
Spring迭代每个bean定义,并使用反射来检查bean的类是否实现了BeanFactoryPostProcessor
接口。
如果是,则创建该bean并调用其postProcessBeanFactory()
操作。该方法通常被编码为迭代所有bean定义并修改其中一些,例如,将"${property.value}"
替换为从Java属性文件中读取的属性的值。
之后,根据(可能修改的)bean定义创建剩余的(“普通”)bean。
自从我上次查看Spring以来已经有好几年了,但如果它仍然以相同的方式运行,那么就可以实现一个实现BeanFactoryPostProcessor
接口的类,代码postProcessBeanFactory()
将bean的id
属性附加到其class
属性上。