使用AspectJ我已經注射服務爲一體的非管理域對象: 這是服務:自動裝配Autowired春豆定製SLF4J的appender
@Service
public class DomainServiceImpl implements DomainService {
public String getLoggerMessage(String prevMessage) {
return String.format("Message from logger service:%s", prevMessage);
}
}
這是域對象:
@Configurable(dependencyCheck = true)
public class DomainObject {
private IAppenderService appenderService;
@Autowired
public void setAppenderService(IAppenderService appenderService) {
this.appenderService = appenderService;
}
public IAppenderService getAppenderService() {
return appenderService;
}
public String formMessage(String message){
return appenderService.getLoggerMessage(message);
}
}
以下測試成功:
@Test
public void testAppender(){
DomainObject domainObject = new DomainObject();
assertNotNull(domainObject.getAppenderService());
}
如果我加
System.out.println(new DomainObject().formMessage("test message"));
任何控制器我有預計在控制檯字符串: 「從記錄器服務的消息:測試消息」
然後我嘗試使用這項服務到自定義SLF4J附加器:
@Configurable(dependencyCheck = true)
public class MyAppender extends AppenderSkeleton {
IAppenderService appenderService;
@Autowired
public void setAppenderService(IAppenderService appenderService) {
this.appenderService = appenderService;
}
public IAppenderService getAppenderService() {
return appenderService;
}
@Override
public void close() {
}
@Override
public boolean requiresLayout() {
return false;
}
@Override
protected void append(LoggingEvent event) {
System.out.println(new DomainObject().formMessage(event.getMessage().toString()));
}
}
但得NPE:
java.lang.NullPointerException
at sbk.spring.testaopjc.domain.DomainObject.formMessage(DomainObject.java:19)
at sbk.spring.testaopjc.appender.MyAppender.append(MyAppender.java:29)
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
在同一時間下面的測試是成功的:
public void testAppendeSecond(){
MyAppender appender = new MyAppender();
assertNotNull(appender.getAppenderService());
}
任何人都可以解釋爲什麼MyAppender在這種情況下行爲不同嗎? PS:我的log4j.properties文件:
log4j.rootLogger=INFO, STDOUT
log4j.appender.STDOUT=sbk.spring.testaopjc.appender.MyAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%M:%L - %m%n
貌似是創造了這個附加器彈簧加載的類之前,從而讓你的例外。 –
提供任何建議? – Sobik