Весна - "поздняя привязка" фасоли - PullRequest
2 голосов
/ 03 августа 2011

Допустим, у меня есть следующие зависимости:

@Configuration
public class MyCfg {
  // ...
  @Bean
  public Session session() {
    return sessionFactory().getCurrentSession();
  }
}

@Repository
@Transactional
public class MyRepo {
  @Autowired
  private Session session;
}

sessionFactory() настроен правильно. Если я введу SessionFactory вместо Session, все будет работать нормально. Однако, если попытаться внедрить Session, он умирает с исключением при загрузке контейнера, потому что нет никакого сеанса, связанного с потоком.

Поскольку хранилище - @Transactional, я знаю, что во время выполнения будет сеанс. Как я могу заставить его работать, чтобы он вводил инициализированный AOP Session во время выполнения, но не пытался разрешить его при создании экземпляра репо?

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Я бы взглянул на эту часть документации Spring, касающейся областей применения бобов . Внизу они показывают, как использовать аннотацию @Scope, которую вы хотите применить к методу session() в MyCfg. Похоже, вы захотите использовать значение 'request', которое будет создавать новый экземпляр этого компонента для каждого входящего HTTP-запроса.

Я также предлагаю взглянуть на элемент <aop:scoped-proxy/> для конфигурации. Это упомянуто пару раз в документации и может быть полезно для того, что вы пытаетесь сделать.

0 голосов
/ 03 августа 2011

Такой подход доставит вам массу неприятностей. Вместо введения Session, который вы теперь автоматически определяете как одиночный, вы должны вместо этого ввести SessionFactory. Экземпляры Session, полученные с использованием аннотированного метода @Transactional, будут соответствовать этим правилам транзакции, например:

@Transactional(readonly=true)
public List<Person> getPersons() {
  Session session = sessionFactory.getCurrentSession();
  //find those darn people.
}
@Autowired
private SessionFactory sessionFactory; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...