我正在使用SpringBoot1.5.7和ApacheCamel 2.19.3,使用SpringBootStarterCamel提供的SpringBoot自动配置
这是相当基本的Spring Boot和Camel初始化,正如他们的教程中所述,所以我们有一个RouteBuilder组件,可以完全做到这一点。
@Component
public class CIFRoutes extends RouteBuilder {
@Override
public void configure() throws Exception {
// build routes
}
}
我们有一个配置,它定义了应用程序中需要的一些bean
@Configuration
public class MyConfiguration {
@Bean
public void Map<String, Object> map() {
return new HashMap<>()
}
}
最后,我们有一个定制的InflightRepository实现,该实现应该通过自动配置进行扫描,并添加到CamelContext中,这基本上可以正常工作,但由于某些原因,组件没有正确初始化。也就是说,它的依赖项没有初始化,但是bean被实例化并注入到我的应用程序中。
@Component
public class MyCustomInflightRepository extends DefaultInflightRepository {
@Autowired
private Map<String, Object> map;
@Override
public void add(Exchange exchange) {
super.addExchange(exchange);
// ....
}
}
现在的问题是map仍然是(null),我还尝试添加@PostConstruct初始值设定项方法,但没有调用它。
据我所知,它似乎与CamelAutoConfiguration中的premature有关,CamelContext bean在这里被实例化(在私有方法AfterPropertieSet中完成)。
InflightRepository inflightRepository = getSingleBeanOfType(applicationContext, InflightRepository.class);
if (inflightRepository != null) {
LOG.info("Using custom InflightRepository: {}", inflightRepository);
camelContext.setInflightRepository(inflightRepository);
}
如果MyCustomInflight Repository没有实现Inflight Repository,则bean会正确初始化,但Camel确实无法识别。禁用自动配置时,将注入bean的依赖项。
所以,要么我按照Spring的标准做了不可能的事情,要么Spring的Camel组件有些可疑。
问题是映射
相反,要更具体,或者可能提供必要的参数作为构造函数参数,并在
@Bean
方法中显式配置它们(无论如何总是使用构造函数注入是个好主意)。
我解决这个问题有点快(我两天前就想发布这个了^^),但是一个同事发现了问题所在。
当使用CamelAutoConfiguration(或实际上Camel试图在这里获得匹配bean的所有内容)时,在属性解析器完全初始化之前访问上下文,这导致在解析任何自动连接的属性之前初始化bean(并在上下文中缓存)...
我不是Spring专家,但在我看来,这种行为有点问题,因为当您依赖Spring DI来定制组件时,未初始化的bean会被拉到上下文中。
当然,我会向维护人员提出这个问题。。。
顺便说一下,我的简单解决方案是在上下文配置中手动设置正在运行的存储库(如建议的)
@Bean
public CamelContextConfiguration camelConfig() {
return new CamelContextConfiguration() {
@Override
public void beforeApplicationStart(CamelContext context) {
context.setInflightRepository(new MyCustomInflightRepository(/* Dependencies go here */ ));
}
@Override
public void afterApplicationStart(CamelContext camelContext) {
}
};
}
此外,在项目中使用骆驼超文本传输协议启动程序似乎也是一个问题,这是不推荐的,他们声称不建议使用。
因此,要么不为骆驼管理的bean执行DI(不管是通过属性还是构造函数注入),要么跳过启动程序。
我有一个带有自动扫描和@Component注释的Spring项目。一些组件需要使用@Autow的注入到不同的bean中。默认情况下,它是否将是作为单例创建的相同组件bean?如果是,如何将同一组件的不同实例注入不同的bean中? 附言:我知道它接近基础,听起来很一般。只是想自己说清楚。 提前致谢
我有一个使用JDK 8、JSF 2.2(JBoss提供的实现)、Spring 4.2和Primeface 6.2开发的本地Web应用程序 在应用程序中,我有一个XHTML页面,用于编辑对象的一些字段,该对象是名为SiepRoEncabezado的类的实例。其中一个字段是Sieprpapaescador的一个实例。 直到昨天,我还有一个 在这里,tmpPescador是托管bean correcci
与属性自动装配相比,构造函数自动装配有什么特殊的优势吗……或者普通的优势。?优于迫使团队在Spring启动中使用构造函数自动装配……它有什么特殊的优势吗?两种类型的自动装配的优缺点
我有一个组件如下: 这是另一个类,我在哪里自动连接上面的类: 在上面的自动布线中,我需要使用参数化构造函数。如何传递构造函数参数?
当我打开视图控制器时,我有一个从顶部飞出的视图。我已将UIView的Y约束设置为-200,当视图加载时,将调用以下内容,一切正常: 但是现在我有一个关闭按钮,它应该将动画回到-200位置,然后从屏幕上删除视图控制器。但是这个动画没有发生。视图控制器被直接删除。这是我正在做的: 我提到了这个链接。这似乎对他们有效,但对我无效。请帮忙。
问题内容: 我对的反转如何在Spring。 假设我有一个称为服务的类,它实现了接口。 怎么会这样? 而在我,我怎么会在这个服务的? 我会做以下事情吗? 问题答案: 首先,也是最重要的一点-所有Spring Bean都受到管理-它们“实时”存在于称为“应用程序上下文”的容器中。 其次,每个应用程序都有一个指向该上下文的入口。Web应用程序具有Servlet,JSF使用el-resolver等。此外,