반응형
@Autowired 빈은 다른 빈의 생성자에서 참조 될 때 null입니다.
아래는 ApplicationProperties 빈을 참조하는 코드입니다. 생성자에서 참조하면 null이지만 다른 메서드에서 참조하면 괜찮습니다. 지금까지 다른 클래스에서이 자동 연결 빈을 사용하는 데 아무런 문제가 없었습니다. 그러나 다른 클래스의 생성자에서 이것을 사용하려고 시도한 것은 이번이 처음입니다.
아래 코드 조각에서 applicationProperties는 생성자에서 호출 될 때 null이지만 convert 메서드에서 참조 될 때는 그렇지 않습니다. 내가 뭘 놓치고 있니
@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();
...
아래는 ApplicationProperties의 일부입니다 ...
@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");
}
Autowiring (Dunes 주석의 링크)은 객체 생성 후에 발생합니다. 따라서 생성자가 완료 될 때까지 설정되지 않습니다.
If you need to run some initialization code, you should be able to pull the code in the constructor into a method, and annotate that method with @PostConstruct
.
To have dependencies injected at construction time you need to have your constructor marked with the @Autowired
annoation like so.
@Autowired
public DocumentManager(IApplicationProperties applicationProperties) {
this.applicationProperties = applicationProperties;
startOOServer();
}
반응형
'development' 카테고리의 다른 글
AngularJS : 템플릿 내부에 변수를 설정하는 방법은 무엇입니까? (0) | 2020.09.15 |
---|---|
Java에서 다른 형식으로 문자열을 날짜로 구문 분석 (0) | 2020.09.15 |
Array.sort ()가 숫자를 올바르게 정렬하지 않음 (0) | 2020.09.15 |
유닉스 차이점 좌우 결과? (0) | 2020.09.15 |
콘솔 출력을 파일로 미러링 (0) | 2020.09.15 |