2017-03-06 45 views
0

我正在手动创建一个Logger对象,并且Spring没有按预期初始化UserService。我如何强制Spring初始化UserService?如何在没有自动装配的情况下初始化Spring服务?

我试过下面的代码,但它没有初始化;

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..."); 
     ..... 
    } 
} 

My 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

你实例化一个Logger使用LoggerFactory,不是的Spring bean工厂。

Logger不是Spring组件。这意味着Spring不负责连接它的依赖关系。

当你这样做的时候,它已经超出了Spring的控制范围。

我不认为这种依赖是正确的。 Logger应该没有服务;它应该是相反的。

从服务中获取用户信息并将其传递到Logger

如果你没有其他选择,那么你需要让Spring将Logger作为一个bean实例化。然后,您必须将其注入您要求的类的数千个

我还是说第二个选择是一个更大的问题。

我想知道为什么成千上万的班级必须做同样的事情。在一个地方登录一个方面不是更好吗?

你的问题表明你的系统有更大的问题。

+0

我无法获取用户信息并将其传递到记录器,因为我需要为所有项目添加用户信息(我有成千上万的类)没有任何解决方法初始化UserService的方法? – hellzone

+0

听起来像一个可怕的设计。成千上万的?我对此表示怀疑。 – duffymo

0

您需要通过注释或XML这样的指定@ComponentScan:

但我认为你的错误是你的Logger类不是一个bean。您只能在bean类上自动调用bean。默认情况下,bean是单例实例,并且您正在使用Factory方法。看看Factory Beans:https://spring.io/blog/2011/08/09/what-s-a-factorybean

相关问题