Spring autowired…pass source class to autowired class

前端 未结 2 1446
孤独总比滥情好
孤独总比滥情好 2021-01-14 06:20

Caught up in a weird requirement. I need to attach unique error id to log4j message and return that message id back to interface.So, I though lets create a spring service, l

相关标签:
2条回答
  • 2021-01-14 07:07

    Why dont you use Spring AOP. AOP provides you much accessibility and features, and you can exploit its interesting features later also, when your application becomes heavy. Spring AOP

    0 讨论(0)
  • 2021-01-14 07:13

    I used this mechanism to inject a logger.

    Create this annotation..

    /**
    * Indicates InjectLogger of appropriate type to
    * be supplied at runtime to the annotated field.
    *
    * The injected logger is an appropriate implementation
    * of org.slf4j.Logger.
    */
    import static java.lang.annotation.ElementType.FIELD;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
    
    @Retention(RUNTIME)
    @Target(FIELD)
    @Documented
    public @interface InjectLogger {
    }
    

    Now lets define a class that actually does the job of injecting the logger implementation.

    /**
     * Auto injects the underlying implementation of logger into the bean with field
     * having annotation <code>InjectLogger</code>.
     * 
     */
    import java.lang.reflect.Field;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.util.ReflectionUtils;
    
    import static org.springframework.util.ReflectionUtils.FieldCallback;
    
    public class LoggerInjector implements BeanPostProcessor {
    
     public Object postProcessAfterInitialization(Object bean, String beanName)
       throws BeansException {
      return bean;
     }
    
     public Object postProcessBeforeInitialization(final Object bean,
       String beanName) throws BeansException {
      ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() {
       public void doWith(Field field) throws IllegalArgumentException,
         IllegalAccessException {
        // make the field accessible if defined private
        ReflectionUtils.makeAccessible(field);
        if (field.getAnnotation(InjectLogger.class) != null) {
         Logger log = LoggerFactory.getLogger(bean.getClass());
         field.set(bean, log);
        }
       }
      });
      return bean;
     }
    }
    

    Using it is even simpler. Just add the Logger annotation created above to the Log field in the required class.

    import org.slf4j.Logger;
    
    public class Demo {
    
     @InjectLogger
     private Logger log;
    
     public void doSomething() {
      log.info("message");
      log.error("Lets see how the error message looks...");
     }
    }
    
    0 讨论(0)
提交回复
热议问题