我有一个3.2.14.Release spring应用程序,并且正在使用java config连接和注入bean。
在我的情况下我需要
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初始化顺序,有什么建议吗?
解决方案实际上可能很简单:
@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身份验证码、是否使用安全链接、测试接收邮件地址的设置 具体配置可参考教程 邮箱配置
短信设置 后台-设置-消息管理 系统支持短信接口为阿里云短信和凌凯短信(具体资费可询相关官方网站) 阿里云短信配置 可参考教程阿里云短息配置 凌凯短信配置 可参考教程凌凯短信配置