Могу ли я внедрить тот же класс с помощью Spring?

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

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

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

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

4 ответа

Решение

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

@Service(value = "someService")
public class UserService implements Service{
   @Resource(name = "someService")
   private Service self;
}

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

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

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

Вы можете редактировать свой класс, чтобы быть

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

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

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

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

Другие вопросы по тегам