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

时间:2017-03-06 12:12:27

标签: java spring

我手动创建一个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
    }
}

2 个答案:

答案 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