如何为apache日志类创建Springbean?

如何为apache日志类创建Springbean?,spring,maven,spring-mvc,Spring,Maven,Spring Mvc,我想在Dao类中创建一个自动连线bean,以便进行日志操作。迄今为止,我的方式是这样的静态最终声明: private static final Log log = LogFactory.getLog(LoggedClass.class); 但现在我正试图使用IoC将类解耦 如果只是在pom.xml中添加配置,并尝试执行以下操作 @Autowired Log log; 我收到一条错误消息: org.springframework.beans.factory.BeanCreationExcep

我想在Dao类中创建一个自动连线bean,以便进行日志操作。迄今为止,我的方式是这样的静态最终声明:

private static final Log log = LogFactory.getLog(LoggedClass.class);
但现在我正试图使用IoC将类解耦

如果只是在pom.xml中添加配置,并尝试执行以下操作

@Autowired 
Log log;
我收到一条错误消息:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'funciDaoImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.apache.commons.logging.Log br.com.bb.dirco.dao.impl.FunciDaoImpl.log; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'log' defined in class path resource [com/company/project/util/PersistenceConfig.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [java.lang.Class]: : No qualifying bean of type [java.lang.Class] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.Class] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

为了获得一个记录器,我必须在LogFactory类上为getLog方法提供一个类,并将其属性化为Log实例。有一种方法可以使用
@Autowired
springioc来实现吗?谢谢

只能注入由Spring容器管理/创建的对象。您必须将bean(或创建bean的工厂方法)注册到容器(使用@Component/@Singleton/…之类的注释或直接以xml形式)

在您的情况下,它不太适用,因为您必须拥有Spring提供的许多不同类型(针对每个类)的记录器对象,然后在注入时,必须为每个类使用不同的名称/类型来标识它们


顺便说一句,我认为现在使用它没有任何问题

您只能注入由Spring容器管理/创建的对象。您必须将bean(或创建bean的工厂方法)注册到容器(使用@Component/@Singleton/…之类的注释或直接以xml形式)

在您的情况下,它不太适用,因为您必须拥有Spring提供的许多不同类型(针对每个类)的记录器对象,然后在注入时,必须为每个类使用不同的名称/类型来标识它们


顺便说一句,我认为您现在使用它的方式没有任何问题

在我工作的地方,我们已经实现了对使用弹簧的
@Autowired
记录器的支持

首先,需要在应用程序上下文中定义记录器占位符bean。Spring将通过一个
@Autowired
记录器字段将这个bean注入所有bean

@Configuration
 public class LoggerConfig {

   @Bean
   public Logger placeHolderLogger() {
    return PlaceHolder.LOGGER;
  }

  @Bean
  public AutowiredLoggerBeanPostProcessor loggerPostProcessor() {
    return new AutowiredLoggerBeanPostProcessor();
  }
}

然后使用一个检查所有bean的
AutowiredLoggerBeanPostProcessor
,对包含用
@Autowired
注释的记录器字段的bean进行标识(此时应包含对记录器占位符bean的引用),为particar bean创建一个新的记录器,并将其分配给字段

@Component
public class AutowiredLoggerBeanPostProcessor implements BeanPostProcessor, PriorityOrdered {

  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    attachLogger(bean);
    return bean;
  }

  @Override
  public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
    attachLogger(bean);
    return bean;
  }

  private void attachLogger(final Object bean) {
    ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() {
      public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
        if (Logger.class.isAssignableFrom(field.getType()) && 
           (field.isAnnotationPresent(Autowired.class) ||
            field.isAnnotationPresent(Inject.class))) {
          ReflectionUtils.makeAccessible(field);
          if (field.get(bean) == PlaceHolder.LOGGER) {
            field.set(bean, LoggerFactory.getLogger(bean.getClass()));
          }
        }
      }
    });
  }

  @Override
  public int getOrder() {
    return HIGHEST_PRECEDENCE;
  }
}

在我工作的地方,我们使用弹簧实现了对
@Autowired
记录器的支持

首先,需要在应用程序上下文中定义记录器占位符bean。Spring将通过一个
@Autowired
记录器字段将这个bean注入所有bean

@Configuration
 public class LoggerConfig {

   @Bean
   public Logger placeHolderLogger() {
    return PlaceHolder.LOGGER;
  }

  @Bean
  public AutowiredLoggerBeanPostProcessor loggerPostProcessor() {
    return new AutowiredLoggerBeanPostProcessor();
  }
}

然后使用一个检查所有bean的
AutowiredLoggerBeanPostProcessor
,对包含用
@Autowired
注释的记录器字段的bean进行标识(此时应包含对记录器占位符bean的引用),为particar bean创建一个新的记录器,并将其分配给字段

@Component
public class AutowiredLoggerBeanPostProcessor implements BeanPostProcessor, PriorityOrdered {

  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    attachLogger(bean);
    return bean;
  }

  @Override
  public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
    attachLogger(bean);
    return bean;
  }

  private void attachLogger(final Object bean) {
    ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() {
      public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
        if (Logger.class.isAssignableFrom(field.getType()) && 
           (field.isAnnotationPresent(Autowired.class) ||
            field.isAnnotationPresent(Inject.class))) {
          ReflectionUtils.makeAccessible(field);
          if (field.get(bean) == PlaceHolder.LOGGER) {
            field.set(bean, LoggerFactory.getLogger(bean.getClass()));
          }
        }
      }
    });
  }

  @Override
  public int getOrder() {
    return HIGHEST_PRECEDENCE;
  }
}

我认为你迄今为止的做法是正确的答案。你和春豆工厂走得太远了。好吧,也许继续用老办法是好的。。。谢谢我认为你迄今为止的做法是正确的答案。你和春豆工厂走得太远了。好吧,也许继续用老办法是好的。。。谢谢