使用@Autowired资源“try with resource”

时间:2013-05-02 15:33:44

标签: java spring

鉴于以下内容:

public class ResourceOne implements AutoCloseable {...}

在(Spring)XML配置中实例化ResourceOne的实例。

此对象(自动装配时)如何与“try-with-resources语句”一起使用,因为您需要在try块中实例化资源?

一种方法可能是使用引用(见下文),但这不是最佳选择。

public class Test {
@Autowired
ResourceOne test;
//...
public void execute()
{
 //...
 try (ResourceOne localTest = test)
 {
   localTest.init()
   localTest.readLine();
   //...
 }
}

2 个答案:

答案 0 :(得分:1)

AFAIK我认为你采取的方法似乎是唯一的方法。

try (ResourceOne localTest = test)
 {
   localTest.init()
   localTest.readLine();
   //...
 }

我假设您已使用原型范围声明了您的自动装配资源。

    @Bean
    @Scope(value="prototype", proxyMode=ScopedProxyMode.DEFAULT)
    public Resource1 resource1() {
        return new Resource1();
    }

答案 1 :(得分:0)

一种解决方案可能是自动装配spring应用程序上下文,并使其在运行时检索bean的实例。

public class Test {

@Autowired
ApplicationContext applicationContext

//...
public void execute()
{
 //...
 try (ResourceOne localTest = applicationContext.getBean(ResourceOne.class))
 {
   localTest.init()
   localTest.readLine();
   //...
 }
}

这样,您就不必冒险在代码中包含ResourceOne的非功能实例,该实例可能会通过其他方法再次使用,并且由于尚未关闭而导致异常。