![](/img/trans.png)
[英]Spring: @Service class with constructor with @Autowired(required = false) parameters: how to initialize it with these parameters?
[英]How to initialize Spring service without Autowired?
我正在手动创建一个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
}
}
您使用LoggerFactory
而不是Spring bean factory实例化Logger
。
Logger
不是Spring组件。 这意味着Spring不负责连接其依赖项。
一旦执行此操作,它将不受Spring的控制。
我认为这种依赖性是不正确的。 Logger
不应提供服务; 它应该是相反的方式。
从服务中获取用户信息,并将其传递到Logger
。
如果没有其他选择,那么您需要让Spring将Logger实例化为bean。 然后,您必须将其注入您声称的数千个类中。
我仍然说第二种选择是一个更大的问题。
我想知道为什么成千上万的类必须做同样的事情。 登录方面并将其放在一个地方会更好吗?
您的问题表明您的系统存在更大的问题。
您需要通过注释或XML来指定@ComponentScan,如下所示:
但是我认为您的错误是您的Logger类不是bean。 您只能在bean类上自动装配bean。 默认情况下,bean是单例实例,并且您使用的是Factory方法。 看看Factory Bean: https : //spring.io/blog/2011/08/09/what-sa-factorybean
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.