Spring Java Configuration - @DependsOn Binding

I have a 3.2.14.RELEASE spring application and I use java config to connect and input beans.

In my case, I need

  • configure ssh tunnel
  • create a data source so that it uses the same ssh tunnel session.
  • create a query class that executes an SQL query using JDBCTemplate

I set the ApplicationContext link using @DependsOn annotations to bind the three beans

package com.b.e.kpireport;

@Configuration
@ComponentScan(basePackages = {"com.b.e.kpireport" })
public class ApplicationContext {

    @Bean(name = "sshTunnel")
    public SSHTunnel getSSHTunnel() {
        return new SSHTunnel();
    }

    @Bean(name = "dataSource" )
    @DependsOn("sshTunnel")
    public DataSource getDataSource() {

        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(jdbcUrl);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        logger.info("getDataSource():"+jdbcUrl+":"+username+"/"+password+":"+driver);
        return dataSource;
    }

    @Bean
    @DependsOn("dataSource")
    public Query getQuery() {
        return new Query();
    }  
}

Query class looks like

class Query {

    private JdbcTemplate jdbcTemplate;

    @Autowired
    private DataSource dataSource;

    @Autowired
    private SSHTunnel sshTunnel;

    public void runQuery() {
        sshTunnel.openSession();
        jdbcTemplate = new JdbcTemplate(dataSource);
        jdbcTemplate.execute(sql);
    }

No matter what I tried, I see that the data source is initialized to SSHTunnel

Aug 26, 2015 5:20:44 PM com.b.e.kpireport.ApplicationContext getDataSource
INFO: getDataSource():jdbc:mysql://localhost:3006/centstorage:davidobrien/MnBufeuwncv3eR:com.mysql.jdbc.Driver
Aug 26, 2015 5:20:44 PM com.b.e.kpireport.SSHTunnel openSession
INFO: openSession

Any suggestions on how I can provide the correct bean initialization order?

+4
source share
1 answer

:

@Configuration
public class ApplicationContext {
    @Bean(name = "sshTunnel")
    public SSHTunnel getSSHTunnel() {
        return new SSHTunnel();
    }

    @Bean(name = "dataSource" )
    public DataSource getDataSource() {
         getSHTunnel();
         DriverManagerDataSource dataSource = new DriverManagerDataSource();
         // ...
         return dataSource;
    }

    @Bean
    public Query getQuery() {
        return new Query(getSSHTunnel(), getDataSource());
    }  
}

( ). , , Spring . , (, getSSHTunnel()) , bean (.. ).

, @Autowired - . .

, @DependsOn . , ( Spring). , .


:

Spring, . Java

. , @Configuration , Spring bean , , . :

@Configuration 
public class TestDependencies {
    @Bean(name="dataSource")
    public DataSource getDataSource() {
        return new MockDataSource();
    }
}
...
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationContext.class, TestDependencies.class);
context.getBean("dataSource"); // returns MockDataSource

, getDataSource() @Autowired context.getBean(). - AFAIK ( @Bean, ), .

0

All Articles