Могу ли я внедрить тот же класс с помощью Spring? - PullRequest
3 голосов
/ 24 февраля 2011

У меня есть класс, скажем, UserService, который реализует Service и помечен Service StereoType, я использую Spring AOP и хочу сделать временное решение для этого ( Я знаю, что это можно сделать лучше )

@Service
public class UserService implements Service{
   @Autowired
   private Service self;
}

Я попробовал это, но получил BeanNotFoundException, я что-то пропустил?

Я знаю, что должен пойти с AspectJ с @Configurable, но просто ищу небольшой временный обходной путь

Ответы [ 4 ]

6 голосов
/ 24 февраля 2011

С какой стати вы должны это делать?В любом методе, где вам нужно обратиться к текущему экземпляру, например, self, вы просто используете ключевое слово this.

Мы что-то упустили?Если есть что-то еще, что вы пытаетесь сделать, попробуйте уточнить свой вопрос, и мы сделаем это.

Если вам интересно, это не сработает, потому что бин не можетвводиться до тех пор, пока он не будет полностью построен -> это означает, что Spring должен внедрить все свойства компонента.По сути, вы создали циклическую зависимость, потому что Spring пытается создать экземпляр компонента, а когда это происходит, он обнаруживает, что ему нужно Autowire другой компонент.Когда он пытается найти этот bean-компонент, он не может этого сделать, потому что bean-компонент не был добавлен в список инициализированных bean-компонентов (потому что он в настоящее время инициализируется).Имеет ли это смысл?Вот почему вы получаете BeanNotFoundException, потому что компонент не может быть инициализирован.

1 голос
/ 08 ноября 2013

Вы можете изменить свой класс на

@Service
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON, proxyMode = ScopedProxyMode.INTERFACES)
public class UserService implements Service
{
    @Autowired
    private Service self;
}

это должно работать

0 голосов
/ 01 марта 2011

Это отлично работает -

@Service(value = "someService")
public class UserService implements Service{
   @Resource(name = "someService")
   private Service self;
}
0 голосов
/ 24 февраля 2011

Я знаю, что это не совсем ответ на вопрос, но я бы предложил переписать ваш код, чтобы вам не нужно было полагаться на аспекты, применяемые к самовывозу. Например, если у вас есть какой-нибудь транзакционный метод, просто убедитесь, что все компоненты транзакции правильно настроены в вызывающем методе.

Если вам действительно нужно, вы можете сделать свой класс ApplicationContextAware и извлечь bean-аспекты с контекстом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...