如何为apache日志类创建Springbean?
我想在Dao类中创建一个自动连线bean,以便进行日志操作。迄今为止,我的方式是这样的静态最终声明:如何为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
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;
}
}
我认为你迄今为止的做法是正确的答案。你和春豆工厂走得太远了。好吧,也许继续用老办法是好的。。。谢谢我认为你迄今为止的做法是正确的答案。你和春豆工厂走得太远了。好吧,也许继续用老办法是好的。。。谢谢