2017-12-26 6 views

Antwort

1

Angenommen, Sie versuchen, Logger Annotation in Spring-Anwendung zu injizieren.

Hier Beispiel Annotation-Klasse: Log.kt

package com.example.util 
@Retention(AnnotationRetention.RUNTIME) 
@Target(AnnotationTarget.FIELD) 
@MustBeDocumented 
annotation class Log 

Diese Klasse inject Anmerkung zur Laufzeit: LogInjector.kt

package com.example.util 
import org.slf4j.LoggerFactory 
import org.springframework.beans.BeansException 
import org.springframework.beans.factory.config.BeanPostProcessor 
import org.springframework.stereotype.Component 
import org.springframework.util.ReflectionUtils 
import java.lang.reflect.Field 

@Component 
class LogInjector: BeanPostProcessor { 

    @Throws(BeansException::class) 
    override fun postProcessAfterInitialization(bean: Any, beanName: String): Any { 
    return bean 
    } 

    @Throws(BeansException::class) 
    override fun postProcessBeforeInitialization(bean: Any, name: String): Any { 
    ReflectionUtils.doWithFields(bean.javaClass, 
     @Throws(IllegalArgumentException::class, IllegalAccessException::class) { field: Field -> 
     // SAM conversion for Java interface 
     ReflectionUtils.makeAccessible(field) 
     if (field.getAnnotation(Log::class.java) != null) { 
      val log = LoggerFactory.getLogger(bean.javaClass) 
      field.set(bean, log) 
     } 
     } 
    ) 
    return bean 
    } 
} 

Dann verwendet diese Klasse @Log Anmerkung: GreetingController .kt

package com.example.web 
import org.slf4j.Logger 
import org.springframework.web.bind.annotation.* 

@RestController 
class GreetingController { 
    @Log lateinit private var logger: Logger 

    @RequestMapping("/greeting") 
    fun greeting(): String { 
    logger.info("Greeting endpoint was called") 
    return "Hello" 
    } 
} 

Um zu vermeiden, dass der Logger in Null-Safe wie logger?.info('...') aufgerufen wird, wird in diesem Beispiel die Eigenschaft durch the late-initialized modifier markiert.

+0

Das funktionierte für mich! – hughjdavey