我发现两个Spring接口可以用来实现我所需要的。该BeanNameAware接口允许Spring通过调用来告诉一个对象的应用程序上下文中它的名字setBeanName(字符串)方法。该FactoryBean的接口告诉Spring不使用对象本身,而是当返回,而对象的getObject()方法被调用。将它们放在一起,您将获得:
public class PlaceholderBean implements BeanNameAware, FactoryBean { public static Map<String, Object> beansByName = new HashMap<String, Object>(); private String beanName; @Override public void setBeanName(String beanName) { this.beanName = beanName; } @Override public Object getObject() { return beansByName.get(beanName); } @Override public Class<?> getObjectType() { return beansByName.get(beanName).getClass(); } @Override public boolean isSingleton() { return true; }}
Bean的定义现在简化为:
<bean id="dataSource" />
占位符在创建应用程序上下文之前会获得其值。
public void run(DataSource externalDataSource) { PlaceholderBean.beansByName.put("dataSource", externalDataSource); ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); assert externalDataSource == context.getBean("dataSource");}
事情似乎已成功运行!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)