当前位置: 首页 > 知识库问答 >
问题:

Spring Java配置-@dependson链接

怀洛华
2023-03-14

我有一个3.2.14.Release spring应用程序,并且正在使用java config连接和注入bean。

在我的情况下我需要

  1. 设置SSH隧道
  2. 创建数据源,使其使用相同的ssh隧道会话
  3. 创建使用JDBCTemplate执行SQL查询的查询类
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();
    }  
}
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);
    }
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

关于如何确保正确的bean初始化顺序,有什么建议吗?

共有1个答案

鲁滨海
2023-03-14

解决方案实际上可能很简单:

@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传递依赖关系--它不那么神奇,也更容易测试。但这是可选的。

编辑以响应备注:

但是在这种情况下,您可以删除所有的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
 类似资料:
  • 在Spring Hibernate XML配置中,我有 我知道SpringJava配置的等价物如下:LocalSessionFactoryBuilder(dataSource())。AddAnnotatedClass(Foo.class)。buildSessionFactory(); 我的问题是,如果我不使用LocalSessionFactoryBuilder类,而是使用HibernateJpaV

  • 目录 1. autoconf 2. 库的查找 3. 强制模块依赖 4. Windows方言 5. 小结 所有前面示例中的代码, 都是你曾经在php用户空间编写过代码的C语言的独立版本. 如果你做的项目需要和php扩展进行粘合, 那么你就至少需要链接一个外部库.

  • 动作链,很强大,但之前很少解释,导致很少人用到. 在conf文件夹中,新建一个文件夹mvc,新增一个配置文件叫nutzbook-mvc-chain.js, 内容如下 var chain={ "default" : { "ps" : [ "net.wendal.nutzbook.mvc.LogTimeProcessor",

  • 被分级点餐弄糊涂了。我是一个新手,以前在构建中使用过Ant,有过使用Gradle的经历,这可能会解释一些问题 简要背景(以防有人问“你为什么这么做”)。我们在war文件中提供了一个Java WebStart应用程序。Java7(从-40开始)正在提示用户关于缺少元素的格式不正确的jar文件。我想自动化一个获得战争的过程;从“bin”文件夹中提取JavaWS的JAR;向清单中添加元素稍后我将重新签名

  • 邮箱配置 后台-设置-消息管理-邮件设置 是否开启、SMTP服务器、SMTP端口 、发信人邮件地址、SMTP身份验证用户名、SMTP身份验证码、是否使用安全链接、测试接收邮件地址的设置 具体配置可参考教程 邮箱配置

  • 短信设置 后台-设置-消息管理 系统支持短信接口为阿里云短信和凌凯短信(具体资费可询相关官方网站) 阿里云短信配置 可参考教程阿里云短息配置 凌凯短信配置 可参考教程凌凯短信配置