스프링이 있는 자가 주입
Spring 3.x에서 3.BeanNotFoundException
그리고 그것은 제가 전에 질문했던 질문의 대답에 따라야 합니다 - 스프링을 사용하여 같은 클래스를 주입할 수 있습니까?
@Service
public class UserService implements Service{
@Autowired
private Service self;
}
Java 6에서 이 작업을 시도한 결과 다음 코드가 제대로 작동합니다.
@Service(value = "someService")
public class UserService implements Service{
@Resource(name = "someService")
private Service self;
}
순환 의존성을 어떻게 해결하는지 이해할 수 없습니다.
여기 오류 메시지가 있습니다.OP는 답변 중 하나에 대한 논평에서 이를 언급했습니다.
원인: org.spring framework.콩 공장콩의 정의 없음예외:[com.spring.service] 유형의 일치하는 빈이 없습니다.Service]에 종속성이 있습니다. 이 종속성에 대한 자동 배선 후보로 적합한 빈이 하나 이상 필요합니다.종속성 주석: {@org.springframework.콩, 공장, 공장, 식품자동 배선(필수=true)}
업데이트: 2016년 2월
자가 자동 배선은 Spring Framework 4.3에서 공식적으로 지원될 예정입니다.구현은 이 GitHub 커밋에서 확인할 수 있습니다.
스스로 자동 배선할 수 없는 결정적인 이유는 Spring's의 구현 때문입니다.DefaultListableBeanFactory.findAutowireCandidates(String, Class, DependencyDescriptor)
메서드에서 가능성을 명시적으로 제외합니다.이는 이 방법에서 발췌한 다음 코드에서 확인할 수 있습니다.
for (String candidateName : candidateNames) {
if (!candidateName.equals(beanName) && isAutowireCandidate(candidateName, descriptor)) {
result.put(candidateName, getBean(candidateName));
}
}
참고로, 콩의 이름(즉, 자동 배선을 시도하는 콩)은 다음과 같습니다.beanName
는 if-condition이 if-condition이기 때문입니다).candidateName
은 사상실과 .beanName
따라서 콩할 수 없습니다( 봄 M1이후는 따라서 단순히 콩 자체를 자동 배선할 수 없습니다(적어도 봄 3.1 M1 이후는 아님).
이제 이것이 의미론적으로 의도된 행동인지 아닌지에 대해서는 다른 질문입니다 ;)
주르겐에게 물어보고 무슨 말을 할지 알아보겠습니다.
안부 전해요,
샘(코어 스프링 커미터)
p.s. @Autowired를 사용하여 유형별 자가 자동 배선 지원을 고려하기 위해 Spring JIRA호를 개설했습니다.여기에서 이 문제를 보거나 투표하십시오. https://jira.springsource.org/browse/SPR-8450
이 코드도 작동합니다.
@Service
public class UserService implements Service {
@Autowired
private ApplicationContext applicationContext;
private Service self;
@PostConstruct
private void init() {
self = applicationContext.getBean(UserService.class);
}
}
이유는 모르겠지만 봄이 콩을 얻을 수 있을 것 같아요.ApplicationContext
생성되었지만 초기화되지 않은 경우.@Autowired
초기화 전에 작동하고 동일한 빈을 찾을 수 없습니다.@Resource
아마 그 후에 일을 할 것입니다.@Autowired
그이에 앞에@PostConstruct
.
하지만 모르겠어요, 그냥 추측일 뿐이에요.어쨌든, 좋은 질문입니다.
객체 자체의 질문에서 AOP 프록시 가져오기를 사용하여 다른 해킹 접근 방식을 제안합니다.AopContext.currentProxy()
특별한 경우에 적합할 수 있습니다.
그런데, 자기 호출 문제에 대한 더 우아한 해결책은 트랜잭션 프록시(또는 사용 중인 AOP 도입 프록시)에 AspectJ Load-Time Wabing을 사용하는 것입니다.
예를 들어 주석 기반 트랜잭션 관리를 사용하면 다음과 같이 "aspectj" 모드를 사용할 수 있습니다.
<tx:annotation-driven mode="aspectj" />
기본 모드는 "proxy"(즉, JDK 동적 프록시)입니다.
안부 전해요,
샘.
위의 코드를 보면 순환 의존성이 보이지 않습니다.일부 서비스 인스턴스를 UserService에 주입하는 경우주입된 서비스의 구현이 반드시 다른 사용자 서비스일 필요는 없으므로 순환 종속성이 없습니다.
왜 UserService를 UserService에 주입하는지는 모르겠지만 이론적인 시도나 그런 것이기를 바랍니다.
다른 접근법일 뿐입니다.
@EnableAsync
@SpringBootApplication
public class Application {
@Autowired
private AccountStatusService accountStatusService;
@PostConstruct
private void init() {
accountStatusService.setSelf(accountStatusService);
}
}
@Service
public class AccountStatusService {
private AccountStatusService self;
public void setSelf(AccountStatusService self) {
this.self = self;
}
}
이것으로 당신의 서비스는 대리가 될 것입니다.저는 그 자체로 비동기적인 방법을 연구하기 위해 이것을 했습니다.
저는 @sinuhepop 솔루션을 시도해 보았습니다.
@PostConstruct
private void init() {
self = applicationContext.getBean(UserService.class);
}
주입을 했지만 서비스가 프록시 내부에 없었고 메소드가 새 스레드에서 실행되지 않았습니다.그 접근법은 제가 원하는 대로 작동합니다.
봄은 물체를 만들고 구성한 다음 빈 룩업 컨텍스트에 배치하는 것처럼 보입니다.그러나 Java의 경우 객체를 생성하고 구성 중에 컨텍스트에서 찾은 이름으로 객체를 조회할 때 이름과 에 연결한다고 생각합니다.
이것이 중소규모 프로젝트에 대한 저의 솔루션입니다.AspectJ 또는 애플리케이션 컨텍스트 매직이 없으며 싱글톤 및 생성자 주입과 함께 작동하며 테스트하기 매우 쉽습니다.
@Service
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
class PersonDao {
private final PersonDao _personDao;
@Autowired
public PersonDao(PersonDao personDao) {
_personDao = personDao;
}
}
언급URL : https://stackoverflow.com/questions/5152686/self-injection-with-spring
'programing' 카테고리의 다른 글
작은 Ajax JavaScript 라이브러리 (0) | 2023.07.24 |
---|---|
행에서 공통 값을 찾으려면 SQL 쿼리에 도움말이 필요합니다. (0) | 2023.07.24 |
PowerShell의 텍스트 파일에 출력 쓰기 (0) | 2023.07.24 |
서브를 실행하면 어떻게 됩니까? (0) | 2023.07.24 |
Ajax에서 사용자 지정 HTTP 헤더 응답을 가져올 수 없음 getAllResponseHeaders (0) | 2023.07.24 |