Могу ли я внедрить тот же класс с помощью 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 из контекста