在模块化的Spring配置应用程序中,我们使用工厂bean跨模块边界提供bean实例。
例如,一个模块A可以通过名称name公开一个bean实例。然后,另一个模块B可以通过样式声明来使用该bean
<bean id="nameBean" class="com.zfabrik.springframework.ComponentFactoryBean">
<property name="componentName" value="A/name" />
<property name="className" value="a.AInterface" />
</bean>
请注意,模块具有分离的类加载器层次结构,并且A/name的实际实现类在B中可能不可见。就像在OSGI中一样(尽管这不是OSGi)。
我的目标是在 B 的编程应用程序上下文中提供 A/name。但是在尝试时
@Configuration
public static class AppContext {
@Bean AInterface nameBean() {
return lookup("A/name",AInterface.class);
}
}
(查找执行实际实例检索)我看到Spring正在尝试配置返回的实例。例如,它将尝试解析A/name实现类的@Autow的属性——这在B的上下文中没有意义(查找的目的是提供完全配置的东西)。即使,如果我尝试
@Configuration
public static class AppContext {
@Bean(autowire=Autowire.NO) AInterface nameBean() {
return lookup("A/name",AInterface.class);
}
}
它将继续配置返回的实例。
如何向应用程序上下文提供bean而不让spring触及其实现实例?
编辑:正如Sotirios Delimanolis所建议的,返回FactoryBean可以避免对返回的实例进行Spring配置。
替代代码如下所示:
@Configuration
public static class AppContext {
@Bean FactoryBean<AInterface> nameBean() {
return new ComponentFactoryBean("A/name",AInterface.class);
}
}
由于返回类型中的 FactoryBean,它不像 @UntouchedBean 注释那么酷,但它解决了这个问题。
@Sotirios:请建议作为答案,以便我可以相应地标记您的建议。
/EDIT
好的,这样它就可以关闭了。建议和接受的答案是返回工厂bean。
我正在使用最新版本的spring boot和spring cloud config。当我用应用程序启动应用程序时。属性,它工作正常。但是,当我从引导开始时。yml文件,它从Spring cloud下载所有道具,并加载应用程序。类路径中的属性。Spring的云就是这样运作的吗?是否可以将Spring云配置客户端配置为仅从远程云配置而不是从应用程序读取属性。类路径中的属性。 我正在使用, --Spri
问题内容: 以前的配置以前是用代码硬编码的,后来它被外部化为.property文件(以避免硬编码的值,避免为了更改配置而更改代码等),然后将其移至XML(用于为了更标准化,没有错误..等) 现在,在阅读Spring 3中的@Configuration时,似乎我们再次回到了最初的方法。 为什么我们要对代码中的配置进行硬编码而不是将其外部化? 问题答案: 有一些优点 Java是类型安全的。如果你正在配
问题内容: 我的问题是我必须在try语句中设置变量,否则会出现编译错误。 稍后我需要使用该变量,但现在超出了范围,所以我相信。我在try语句外部初始化了该变量并将其设置为null,我以为可以在外部访问它,但仍然得到了。 下面的代码,其中有很多代码使阅读变得更容易-我知道这是不好的代码,但是我是Servlets的新手,只想看看它与所有活动部件一起运行时应如何工作。 我创建了另一个类,该类调用crea
在Spring YAML配置文件中,我需要有一个参数,例如 其中< code>${app-name}在运行时被Java代码动态替换,我不希望Spring在启动时替换它。 为了实现这一点,我需要转义字符,以便Spring不会将其解释为SpEL。 以下答案在YAML不适用: > 如何逃脱EL美元符号? Spring属性文件中的转义属性引用 如果包含美元符号(${var}),则无法读取属性 我尝试了所有
问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)