Java 如何在创建SpringFactorybean时访问非静态属性?
在这里寻找任何类型的解决方案,但我会提出我的思考过程。Java 如何在创建SpringFactorybean时访问非静态属性?,java,spring,mybatis,Java,Spring,Mybatis,在这里寻找任何类型的解决方案,但我会提出我的思考过程。 使用SpringMybatis(通过MySql数据库)并通过Maven嵌入式jetty插件运行它 所以这是我遇到的一个非常简单的问题,很容易重新创建。基本上,Mybatis Spring需要为SqlSessionFactoryBean类定义一个Springbean。此类实现了Spring的接口。要将其正确连接起来,除其他事项外,还应提供一个电源。我在代码的其他地方引用了JDBC连接细节(出于Mybatis生成器的目的),并希望将这些细节合并
使用SpringMybatis(通过MySql数据库)并通过Maven嵌入式jetty插件运行它 所以这是我遇到的一个非常简单的问题,很容易重新创建。基本上,Mybatis Spring需要为
SqlSessionFactoryBean
类定义一个Springbean。此类实现了Spring的接口。要将其正确连接起来,除其他事项外,还应提供一个电源。我在代码的其他地方引用了JDBC连接细节(出于Mybatis生成器的目的),并希望将这些细节合并到一个地方:属性文件或其他地方
现在,我有一个属性文件,从Spring的角度来看,所有东西都是非常标准的。我在尝试启动Jetty服务器时发现了一些问题,但是Mybatis Spring似乎陷入了循环依赖中
我不能说我完全知道这个循环引用的原因,但我知道失败的原因:我在尝试调用时(从一个自动连接的env.getRequiredProperty(“JDBC.driver”)
将JDBC驱动程序设置为null
。它是一个NPE(在env
对象上);当我在PostConstructor中打印出属性时,该属性将被初始化
我对这个问题的理解是,因为SqlSessionFactoryBean
是一个Spring工厂bean(这是否使它成为BFPP类型?),所以不能假设正常的自动连接和bean实例化是可用的。进一步巩固这一点的是,如果我硬编码JDBC细节(或者将SqlSessionFactoryBean
方法设为静态),这样Jetty就可以正常启动,应用程序也可以按预期工作。显然,这里不需要在JDBC细节中进行硬编码——我在另一个地方引用了这些细节
tl;dr我如何静态访问Spring的环境属性值,比如说,在工厂Bean方法中?我尝试了@autowired+postconstruct路由和实现应用程序上下文感知的方法,但都没有用 代码示例
public abstract class AbstractMybatisConfig {
@Autowired
Environment env;
String jdbcDriver;
String jdbcUrl;
String jdbcUsername;
String jdbcPassword;
// if I try the below statement, the env object throws an NPE
// jdbcDriver = env.getRequiredProperty( "jdbc.driver" );
@PostConstruct
protected void postConstruct() {
jdbcDriver = env.getRequiredProperty( "jdbc.driver" );
// this statement prints out "com.mysql.jdbc.Driver" as expected
System.out.println( jdbcDriver );
jdbcUrl = env.getRequiredProperty( "jdbc.url" );
jdbcUsername = env.getRequiredProperty( "jdbc.username" );
jdbcPassword = env.getRequiredProperty( "jdbc.password" );
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName( jdbcDriver );
// this statement prints out null
System.out.println( jdbcDriver );
dataSource.setUrl( jdbcUrl );
dataSource.setUsername( jdbcUsername );
dataSource.setPassword( jdbcPassword );
return dataSource;
}
@Bean // circular reference happens here b/c dataSource() sets null properties
public SqlSessionFactoryBean sqlSessionFactory() {
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource( dataSource() );
// ...other (unrelated) configuration goes here...
return sqlSessionFactory;
}
private static getJdbcProperties() {
Properties jdbcProps = new Properties();
// when this method is invoked, Spring complains the resource does not exist
// (and it is the same String used to identify this property file in my PropertySources annotation found in another config)
jdbcProps.load( new ClassPathResource( "classpath:META-INF/properties/mybatis.properties" ).getInputStream() );
// ...code to grab property values omitted for brevity...
return jdbcProps
}
如果您不向我们展示一些代码,我们将很难为您提供帮助。很难想象您描述了什么并提供了答案或想法。添加了上下文:我发现了一个与我的问题几乎相同的问题。我已尝试按照此处找到的设置和解决方案进行操作(主要是创建一个MapperScannerConfigure,而不是依赖@MapperScan注释Mybatis Spring提供的),但没有用。我的问题在于SqlSessionFactory是FactoryBean,而DataSource bean在被调用进行实例化时无法访问属性。在@Edwin Dalorzo上,感谢指针和查找。我包含了上面的主要问题文件。如果还有什么不清楚的地方,请告诉我。我使用配置注释加载属性,然后将属性自动连接到类,如果您认为您希望查看这样的解决方案,请告诉我