繁体   English   中英

没有Autowired的情况下如何初始化Spring服务?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM