Spring使用运行时对象设置属性?

时间:2011-09-08 11:25:52

标签: java spring dependency-injection annotations instantiation

我很难弄清楚如何在弹簧注释的帮助下设置属性。

我有一个抽象的基类。

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;

由于@ContextConfiguration Annotation自动用于我的RealTest的弹簧文件

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

1 个答案:

答案 0 :(得分:1)

  1. 了解bean scopes。它并没有真正成为你试图做的那种注射。您不应将会话本身注入业务服务类。您应该使用session范围的bean。

  2. 测试类本身不是测试ApplicationContext的一部分,因此您不能将测试类中创建的值自动装配到测试类。无论如何,你为什么要那样做?你已经在 测试类中了,所以为什么不在@Before public void setUp() {}方法中使用简单的setter?或者看下一点。

  3. 如果你有在测试类中创建了dependecies的类,那么@ContextConfiguration在这里没有任何帮助。您可以使用AnnotationConfigApplicationContext在测试类内部创建内部@Configuration类,并使用Spring Java Config配置服务类。

  4. 即:

    @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访问者。