我正在转向基于 @Configuration 样式的新 Spring 3.x 代码。到目前为止,我做得很好,但是当我尝试添加 @Profile("production") 来选择 JNDI 数据源而不是 C3p0 连接池 @Profile("standalone") 时,我得到了:
Error creating bean with name 'dataSource': Requested bean is currently in creation: Is there an unresolvable circular reference?
...
当然,有很多细节(我在下面列出了一些供参考),但我的问题是:有人会张贴/指向一个工作示例吗?
谢谢,
细节:
- 与 XML 相同的配置工作正常,
- web.xml 指向 AppConfig.class 中配置的根上下文和 WebConfig.class 中配置的 servlet 上下文,
- AppConfig 有一个 @Import(SomeConfig.class) 从服务层项目中提取配置 - 依赖项由 maven 连接,
- SomeConfig 类在 C3p0 数据源上有 @Profile("standalone"),
- AppConfig 类在 JNDI 数据源上有 @Profile("production"),web.xml 定义 spring.profiles.default=production。
编辑:已解决
我将个人资料移到了正确的位置。现在它们在同一个文件和同一个项目中:
...
other bean definitions
/**
* Stand-alone mode of operation.
*/
@Configuration
@Profile("standalone")
static class StandaloneProfile {
@Autowired
private Environment env;
/**
* Data source.
*/
@Bean
public DataSource dataSource() {
try {
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass(env.getRequiredProperty("helianto.jdbc.driverClassName"));
ds.setJdbcUrl(env.getRequiredProperty("helianto.jdbc.url"));
ds.setUser(env.getRequiredProperty("helianto.jdbc.username"));
ds.setPassword(env.getRequiredProperty("helianto.jdbc.password"));
ds.setAcquireIncrement(5);
ds.setIdleConnectionTestPeriod(60);
ds.setMaxPoolSize(100);
ds.setMaxStatements(50);
ds.setMinPoolSize(10);
return ds;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
/**
* Production mode of operation.
*/
@Configuration
@Profile("production")
static class ProductionProfile {
@Autowired
private Environment env;
/**
* JNDI data source.
*/
@Bean
public DataSource dataSource() {
try {
JndiObjectFactoryBean jndiFactory = new JndiObjectFactoryBean();
jndiFactory.setJndiName("java:comp/env/jdbc/heliantoDB");
jndiFactory.afterPropertiesSet(); //edited: do not forget this!
return (DataSource) jndiFactory.getObject();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}