首页 文章

如何将 Logger 注入示例Spring启动应用程序中的字段?

提问于
浏览
10

我想要的是让spring autowire成为 Logger . 所以,换句话说,我想让这个工作:

import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MainController {

    @Autowired
    private Logger logger;

    @RequestMapping("/")
    public String enterSite(HttpServletResponse response) {
        logger.info("site entered");
        return "welcome";
    }
}

现在它在启动时抛出异常:“找不到类型[org.slf4j.Logger]的限定bean用于依赖...” .

我的pom.xml依赖项:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.0.M1</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.1-901.jdbc4</version>
        </dependency>
        <!-- <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> 
            </dependency> -->
    </dependencies>

我看了这个

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-logging

它说如果你使用其中一个起动器poms(我愿意)使用Logback - 但是用于内部记录 . 它可以在我的 class 中自动装配吗?

4 回答

  • 7

    虽然通常的方式是你可以直接在上下文中添加一个 Logger bean来重现经典绑定:

    private final Logger logger = LoggerFactory.getLogger(MainController.class);
    

    只需插入 spring 上下文:

    <bean id="logger" scope="prototype" class="org.slf4j.LoggerFactory" factory-method="getLogger">
        <constructor-arg name="name" value="youLoggerName" />
    </bean>
    

    然后你可以简单地注入你的 Logger :

    @Autowired
    private Logger logger;
    
  • 10

    如果此处的目标是代码缩减,请尝试Project Lombok . 然后你甚至不需要声明 Logger - 只需添加一个注释并使用 log 而不是 logger

    所以你上面的代码现在看起来像这样:

    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.Logger;
    // import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import lombok.extern.slf4j.Slf4j;
    
    @Slf4j
    @Controller
    public class MainController {
    
        @RequestMapping("/")
        public String enterSite(HttpServletResponse response) {
            log.info("site entered");
            return "welcome";
        }
    }
    
  • 0

    你可以让Spring自动装配一个Logger实例,但这是一件非常不寻常的事情(你需要一个 Logger 类型的bean才能进入你的应用程序环境) . 更常见的方法是初始化它声明的 Logger ,使用将用于记录的类配置它:

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class MainController {
    
        private final Logger logger = LoggerFactory.getLogger(MainController.class);
    
    }
    
  • 14

    Solution使用 @Bean

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import org.springframework.beans.factory.InjectionPoint;
    
    @Configuration
    public class LoggerConfiguration {
    
        @Bean
        @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
        public Logger logger(InjectionPoint injectionPoint){
            return LoggerFactory.getLogger(injectionPoint.getMethodParameter().getContainingClass());
        }
    
    }
    

    之后,只需注入Logger:

    @Autowired
    private Logger logger;
    

相关问题