2011-09-08 60 views
1

我很難搞清楚如何在spring註釋的幫助下設置屬性。Spring使用運行時對象設置屬性?

我有一個抽象基類。

abstract class AbstractTest{ 
private static Session session; 

@BeforeClass 
public static void initApplication() throws Exception { 
    session = new Session(); 
    ... 
} 

public Session getSession(){ 

我有一個擴展我的AbstractTest的測試類。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class RealTest extends AbstractTest{ 

@Autowired 
Service service; 

我有一個需要使用會話對象的服務,我希望它對會話對象進行「自動設置」。

public class ServiceImpl implements Service { 

// @AutoSomething how to make this work? 
private Session session; 

被自動用於我RealTest感謝@ContextConfiguration註解

<bean id="Service" class="...ServiceImpl" > 
<property name="session"> 
    getSession()?? // What's the syntax or how to do this? 
</property> 

回答

1
  1. 閱讀bean scopes春天文件。它並不真正讓你想要做的那種注射。您不應將會話本身注入業務服務類。您應該使用session範圍的bean來代替。

  2. 測試類本身不是測試ApplicationContext中的一部分,所以你不能自動裝配測試類的測試類創造的價值。無論如何,你爲什麼要這樣做?你已經有這個測試類,那麼爲什麼不在@Before public void setUp() {}方法中只用簡單的setter?或者看下一點。

  3. 如果您有在測試類內部創建了依賴關係的類,那麼@ContextConfiguration在這裏沒有任何幫助。您可以使用AnnotationConfigApplicationContext,在測試類內部創建一個內部@Configuration類,並使用Spring Java Config配置服務類。

即:

@ContextConfiguration 
public class RealTest extends AbstractTest { 

    @Autowired 
    private ApplicationContext appCtx; 

    private Service service; 

    @Before 
    public void setUp() { 
     AnnotationConfigApplicationContext testCtx = new AnnotationConfigApplicationContext(); 
     testCtx.setParent(this.appCtx); 
     testCtx.register(RealTestCfg.class); 
     testCtx.refresh(); 

     this.service = BeanFactoryUtils.beanOfType(testCtx, Service.class); 
    } 

    @Configuration 
    public static class RealTestCfg { 

     @Bean 
     public Session session() { 
      return AbstractTest.session; 
     } 

     @Bean 
     public Service service() { 
      return new Service(); 
     } 
    } 
} 

@ContextConfiguration和家長ApplicationContext是可選的,如果你沒有任何其他的依賴。而AbstractTest.session需要爲protected static,或者有protected static訪問者。

+0

1.這是有道理的,我有一個會話用於測試框架中的測試,並希望注入到我的業務服務中。 2.我認爲你誤解了我想從Test-> Test而不是Test-> Session傳遞會話的問題,我當然可以在服務中聲明一個setter並從我的Test中調用setSession(),但是我希望春天來處理我的依賴關係之後,一切爲了什麼。 – Farmor

+0

據我所知,你想將'Session'從'Test'轉移到'Service',這是'Test'依賴關係之一,對吧? – Roadrunner

+0

這是正確的:) – Farmor