@autowed bean은 다른 bean의 컨스트럭터에서 참조되는 경우 null입니다.
아래는 Application Properties bean을 참조하는 코드 조각입니다.컨스트럭터에서 참조할 때는 늘이지만 다른 메서드에서 참조할 때는 괜찮습니다.지금까지 저는 이 자동배선콩을 다른 수업에서 사용하는 데 전혀 문제가 없었습니다.하지만 다른 클래스의 컨스트럭터에서 사용하는 것은 이번이 처음입니다.
다음 코드 스니펫에서는 applicationProperties가 컨스트럭터에서 호출될 때는 늘이지만 변환 메서드에서 참조될 때는 늘이 아닙니다.내가 뭘 놓쳤지?
@Component
public class DocumentManager implements IDocumentManager {
private Log logger = LogFactory.getLog(this.getClass());
private OfficeManager officeManager = null;
private ConverterService converterService = null;
@Autowired
private IApplicationProperties applicationProperties;
// If I try and use the Autowired applicationProperties bean in the constructor
// it is null ?
public DocumentManager() {
startOOServer();
}
private void startOOServer() {
if (applicationProperties != null) {
if (applicationProperties.getStartOOServer()) {
try {
if (this.officeManager == null) {
this.officeManager = new DefaultOfficeManagerConfiguration()
.buildOfficeManager();
this.officeManager.start();
this.converterService = new ConverterService(this.officeManager);
}
} catch (Throwable e){
logger.error(e);
}
}
}
}
public byte[] convert(byte[] inputData, String sourceExtension, String targetExtension) {
byte[] result = null;
startOOServer();
...
다음은 Application Properties의 일부입니다.
@Component
public class ApplicationProperties implements IApplicationProperties {
/* Use the appProperties bean defined in WEB-INF/applicationContext.xml
* which in turn uses resources/server.properties
*/
@Resource(name="appProperties")
private Properties appProperties;
public Boolean getStartOOServer() {
String val = appProperties.getProperty("startOOServer", "false");
if( val == null ) return false;
val = val.trim();
return val.equalsIgnoreCase("true") || val.equalsIgnoreCase("on") || val.equalsIgnoreCase("yes");
}
자동 배선(Dunes 주석 링크)은 객체 구축 후에 발생합니다.따라서 생성자가 완료될 때까지 설정되지 않습니다.
초기화 코드를 실행해야 할 경우 컨스트럭터의 코드를 메서드로 풀하고 그 메서드에 주석을 붙일 수 있습니다.
건설 시 종속성을 주입하려면 컨스트럭터에 다음 마크를 붙여야 합니다.@Autowired
이렇게 annoation.
@Autowired
public DocumentManager(IApplicationProperties applicationProperties) {
this.applicationProperties = applicationProperties;
startOOServer();
}
네, 둘 다 정답입니다.
솔직히 이 문제는 'Why Spring is my Spring @Autowired field is null?'이라는 글과 비슷합니다.
에러의 근본 원인에 대해서는, Spring 레퍼런스 문서(Autowired)를 참조해 주세요.
자동 배선 필드
필드는 bean 구성 직후 설정 메서드가 호출되기 전에 주입됩니다.
그러나 Spring document에서 이 말을 하는 진짜 이유는 봄의 Bean 라이프 사이클입니다.이것은 Spring의 디자인 철학의 일부입니다.
다음은 Spring Bean 라이프 사이클의 개요입니다. 필드 등의 속성을 주입하려면 먼저 콩을 초기화해야 합니다.콩은 이렇게 설계되어 있기 때문에, 이것이 진짜 이유입니다.
이 대답이 너에게 도움이 되었으면 좋겠어!
언급URL : https://stackoverflow.com/questions/6335975/autowired-bean-is-null-when-referenced-in-the-constructor-of-another-bean
'programing' 카테고리의 다른 글
번식 가능한 좋은 판다를 만드는 방법 (0) | 2022.09.24 |
---|---|
[]가 list()보다 빠른 이유는 무엇입니까? (0) | 2022.09.24 |
set Timeout 리셋 (0) | 2022.09.24 |
컴파일 시 함수 파라미터 수 계산 (0) | 2022.09.24 |
Python의 집합에 값 추가 (0) | 2022.09.24 |