ちょっと気になったので試したら悩みができた。。。
@Autowiredとか@Resourceとかで設定した場合でprototype指定されていたら、
ApplicationContextを直接持ってないとこでdestroyって呼べなくね?みたいな。
ApplicationContext持ち回せばいいのかな。。。。
試しに以下のようなコードを書いたが確かにdestroyは呼ばれない。(前回試してるから当たり前なんだが)
クラスを2重にするのがめんどくさかったのでJUnitで。。。。
対象Bean
package com.zomu.t.example; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("testComponent") @Scope("prototype") public class TestComponent { @PostConstruct public void init() { System.out.println("init."); } public void outputMsg() { System.out.println("msg...."); } @PreDestroy public void destroy() { System.out.println("destroy."); } }
実行クラス
package com.zomu.t.example; import javax.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:ApplicationContext.xml" }) public class TestInitDestroy2 { @Resource(name = "testComponent") TestComponent tc = null; @Test public void main() { tc.outputMsg(); } }
んーどうすりゃいいんだ。
思いつくのはこれしかない。
実行クラス
package com.zomu.t.example; import javax.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:StoreManager-Common-ApplicationContext.xml" }) public class TestInitDestroy2 { @Resource(name = "testComponent") TestComponent tc = null; @Autowired ConfigurableApplicationContext appContext = null; @Test public void main() { tc.outputMsg(); appContext.getBeanFactory().destroyBean("testComponent", tc); } }やってることは、前回と変わりはない。ApplicationContextと手を握り合って「バルス」って唱えただけ。
これだと当たり前にdestroyも呼ばれるんだが。
他にいい方法ってないの?
0 件のコメント:
コメントを投稿