2017-11-25 3 views
0

Im Frühjahr, ich Objekte mit Aware Schnittstellen Frühling bekommen kann:Was den Unterschied zwischen Aware-Schnittstelle und @Autowired

@Component 
class TestAware : ApplicationContextAware, EnvironmentAware { 
    override fun setEnvironment(environment: Environment) { 
     println("Server port" + environment.getProperty("server.port")) 
    } 

    override fun setApplicationContext(applicationContext: ApplicationContext) { 
     println("ApplicationContext" + applicationContext.displayName) 
    } 
} 

Aber dann kann ich das Gleiche mit @Autowired tun:

@Component 
class AutowiredTest { 
    @Autowired 
    fun constructor(env: Environment, appCtx: ApplicationContext) { 
     println("ApplicationContext From Autowired" + appCtx.displayName) 
     println(env.getProperty("server.port")) 
    } 

} 

Also was ist der Unterschied zwischen ihnen, und in welchen Fällen muss ich Aware aber nicht @Autowired verwenden?

Antwort

1

Traditionell ist @Autowired die Methode der Kernabhängigkeitsinjektion, die im Konstruktor bevorzugt wird, um notwendige Beans zu injizieren, die von diesem Objekt verwendet werden.

Bewusst, genauer gesagt, ich denke du meinst ApplicationContextAware ja? Dies ist eher eine höhere Sicht, so dass die implementierende Klasse den Kontext ändern kann, in dem sie erstellt wurde. Die gesamte Bedeutung und Vorgehensweise ist anders. Wenn Sie die Funktionalität einer anderen Bean benötigen, @Autowire (injizieren) in die using-Klasse. Wenn Sie Ihren Kontext manipulieren müssen, z. B. Bootstrapping anderer Beans, Entscheidungen basierend auf dem, was als Ganzes injiziert wurde, dann wäre dies der Ansatz, der für Aware verwendet wird.

Habe ich die Marke übersehen?

Verwandte Themen