Spring установить свойство с помощью объекта времени выполнения? - PullRequest
1 голос
/ 08 сентября 2011

Мне трудно понять, как установить свойство с помощью весенних аннотаций.

У меня есть абстрактный базовый класс.

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;

Файл Spring, который автоматически используется для моего RealTest благодаря аннотации @ContextConfiguration

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

1 Ответ

1 голос
/ 08 сентября 2011
  1. Читать о области применения бобов .Это действительно не имеет смысла, вид инъекции, который вы пытаетесь сделать.Не следует внедрять сам сеанс в классы бизнес-сервисов.Вместо этого вы должны использовать session bean-объектам.

  2. Сам класс теста не является частью теста ApplicationContext, поэтому вы не можете автоматическое связывание значений, созданных в тестовом классе, с тестовым классом.В любом случае, зачем Ты это делаешь?У вас уже есть в тестовом классе, так почему бы просто не использовать простой установщик в методе @Before public void setUp() {}?Или посмотрите следующий пункт.

  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 accessor.

...