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上,感谢指针和查找。我包含了上面的主要问题文件。如果还有什么不清楚的地方,请告诉我。我使用配置注释加载属性,然后将属性自动连接到类,如果您认为您希望查看这样的解决方案,请告诉我