我手动创建一个Logger对象,而Spring没有按预期初始化UserService。如何强制Spring初始化UserService?
我尝试了下面的代码,但它没有初始化;
WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
userService = context.getBean(UserService.class);
这是JobService;
@Service
public class JobService{
private static final Logger logger = LoggerFactory.getLogger(JobService.class);
doJob(){
logger.info("Job is starting...");
.....
}
}
我的LoggerFactory;
public class LoggerFactory {
public static Logger getLogger(Class clazz) {
Logger logger = new Logger(clazz);
return logger;
}
private LoggerFactory() {
throw new UnsupportedOperationException("Not instantiable");
}
}
我的记录器;
public class Logger {
@Autowired
UserService userService;
public void info(String message){
User user = userService.getCurrentUser(); //userService is null
}
}
答案 0 :(得分:0)
使用Logger
实例化LoggerFactory
,而不是Spring bean工厂。
Logger
不是Spring组件。这意味着Spring不负责连接其依赖项。
你这样做的那一刻它已经超出了Spring的控制范围。
我不认为这种依赖是正确的。 Logger
不应该提供服务;它应该是另一种方式。
从服务中获取用户信息并将其传递到Logger
。
如果你别无选择,那么你需要让Spring将Logger实例化为bean。然后你必须将它注入你声称的数千个类中。
我仍然说第二种选择是一个更大的问题。
我想知道为什么成千上万的班级必须做同样的事情。登录某个方面并在一个地方进行操作会不会更好?
您的问题表明您的系统存在较大问题。
答案 1 :(得分:0)
您需要通过注释或XML格式指定@ComponentScan:
但我认为您的错误是您的Logger类不是bean。您只能在bean类上自动装配bean。默认情况下,bean是单例实例,您使用的是Factory方法。看一下Factory Beans:https://spring.io/blog/2011/08/09/what-s-a-factorybean