Java 弹簧靴。获取bean作为对本地bean方法调用的响应
我在Java 弹簧靴。获取bean作为对本地bean方法调用的响应,java,spring,spring-boot,Java,Spring,Spring Boot,我在@Configuration类上工作,masterTransactionManagerbean需要注入masterDataSourcebean。我找到了一个例子,但它不起作用 这里是简化的示例类 @Configuration public class MasterDataSourceConfig { @Bean @Primary public DataSource masterDataSource() { DruidDataSource dataSou
@Configuration
类上工作,masterTransactionManager
bean需要注入masterDataSource
bean。我找到了一个例子,但它不起作用
这里是简化的示例类
@Configuration
public class MasterDataSourceConfig {
@Bean
@Primary
public DataSource masterDataSource() {
DruidDataSource dataSource = new DruidDataSource();
...
return dataSource;
}
@Bean
@Primary
public DataSourceTransactionManager masterTransactionManager() {
/*
* Spring not injects bean here, instead
* it just get new instance
* of DataSource object
*/
return new DataSourceTransactionManager(masterDataSource());
}
}
我可以通过传递bean引用作为参数来解决这个问题:
@Bean
@Primary
public DataSourceTransactionManager masterTransactionManager(
@Qualifier("schmodelAuditDataSource") DataSource dataSource) {
/*
* Now bean injected, and everything works as it should
*/
return new DataSourceTransactionManager(dataSource);
}
现在的问题是:它如何工作呢?我以前从未见过Spring可以像第一个示例中那样在方法调用时返回bean。这是获取bean的正确解决方案吗?如果这是一个合适的电话,那么为什么它对我不起作用呢
我找不到很多关于这种bean调用方法的信息,尽管在线程中提到它应该可以工作。而我的情况并非如此
更新:我看到了什么错误
我在第一种情况下得到的错误是
查询数据库时出错。原因:org.springframework.jdbc.CannotGetJdbcConnectionException
同样在调试模式下,我看到Springbean初始化调用上的bean实例与我的类调用masterDataSource()
方法时返回的实例不同
应用程序启动时没有错误。我在开始使用实例化的bean(将数据写入数据库)时出错。我认为这是由于调用
masterDataSource()
时返回了不正确的bean(是否是bean,不确定)的结果。在回答问题之前,我需要澄清什么是Autowiring
Spring在应用程序上下文中管理他们的bean和生命周期,后者是一个容器<代码>应用程序上下文
是一个包含bean的容器。
当应用程序上下文引导时,bean也通过其定义的(单例,原型,请求,会话,全局会话)实例化
Spring的默认作用域是singleton,指它立即实例化并在应用程序上下文中共享对象(通常是缓存对象)
Autowire会将一个bean实例注入到另一个bean中。这意味着我们注入的位置和注入的内容都应该是bean,并且都位于SpringIoC容器中(应用程序上下文)
现在来问你一个问题。如果您自动连接一个bean,实际上您的实例化对象(由spring实例化)设置在这里。如果您在示例中调用一些方法,如masterDataSource()
:-
@Bean
@Primary
public DataSource masterDataSource() {
DruidDataSource dataSource = new DruidDataSource();
...
return dataSource;
}
@Bean
@Primary
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(masterDataSource());
}
然后masterDataSource()
还创建一个新对象,并将其设置(注入)为DataSourceTransactionManager
constructor
所以底线是,如果您使用了@Autowired
,那么您就得到了spring管理的(生命周期)bean/object,如果您调用了masterDataSource()
,那么您只需在spring管理的object之外创建一个新的对象。在回答问题之前,我需要澄清什么是Autowiring
Spring在应用程序上下文中管理他们的bean和生命周期,后者是一个容器<代码>应用程序上下文
是一个包含bean的容器。
当应用程序上下文引导时,bean也通过其定义的(单例,原型,请求,会话,全局会话)实例化
Spring的默认作用域是singleton,指它立即实例化并在应用程序上下文中共享对象(通常是缓存对象)
Autowire会将一个bean实例注入到另一个bean中。这意味着我们注入的位置和注入的内容都应该是bean,并且都位于SpringIoC容器中(应用程序上下文)
现在来问你一个问题。如果您自动连接一个bean,实际上您的实例化对象(由spring实例化)设置在这里。如果您在示例中调用一些方法,如masterDataSource()
:-
@Bean
@Primary
public DataSource masterDataSource() {
DruidDataSource dataSource = new DruidDataSource();
...
return dataSource;
}
@Bean
@Primary
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(masterDataSource());
}
然后masterDataSource()
还创建一个新对象,并将其设置(注入)为DataSourceTransactionManager
constructor
所以底线是,如果您使用了@Autowired
,那么您得到了spring管理的(生命周期)bean/object,如果您调用了masterDataSource()
,那么您只需在spring管理的object之外创建一个新对象。如果您注入了一个bean,那么在spring中使用@Autowired
或@inject
注释,但我问的问题不同。像masterDataSource()这样的方法调用怎么能返回bean,而不仅仅是新的对象实例呢?第一种情况显示了什么错误?请参阅我的带有错误描述的更新帖子如果您注入bean,然后在spring中使用@Autowired
或@inject
注释。好的,我使用这个,但我问的问题不同。像masterDataSource()这样的方法调用如何返回bean,而不是只返回新的对象实例?第一种情况显示了什么错误?请参阅我的更新后的错误描述