Spring: Methodeninjektion mithilfe der Eigenschaft „lookup-method“.

Methodeninjektion mithilfe der Eigenschaft „lookup-method“.

Bevor ich mich mit dem Thema befasse, möchte ich kurz auf die beiden wichtigen Bereiche in Spring eingehen und erläutern, wie diese im Spring-Container funktionieren. Singleton-Beansinstanzen werden nur einmal pro Container erstellt und für mehrere angeforderte Zwecke wiederverwendet. Für jede Anfrage werden prototypische Beans-Instanzen erstellt. Es ist ideal zu berücksichtigen, dass der Singleton-Bereich für die Definition von Stateless-Beans und der Prototype-Bereich für Stateful-Beans geeignet ist.

Federmethode-Injektion

Kommen wir zum Thema: Wenn wir eine Bean in eine andere Bean injizieren (durch die Abhängigkeitsinjektion von Spring), wobei sich beide Beans im selben Bereich befinden, wäre das kein Problem. Betrachten wir dieses Szenario: Das Einfügen einer Prototyp-Bean in eine Singleton-Bean erschwert die Handhabung der Situation, da die Prototyp-Bean zum Zeitpunkt der Container-Instanziierung nur einmal in die Singleton-Bean injiziert wird.

  • Unterschied zwischen @Resource, @Autowired und @Inject

Spring bietet Methodeninjektion, um das oben genannte Problem zu lösen. Es handelt sich um eine andere Art der Injektion, die zum dynamischen Überschreiben einer Klasse und ihrer abstrakten Methoden verwendet wird, um bei jeder Injektion der Bean Instanzen zu erstellen. Dieses Tutorial beleuchtet die wichtigsten Unterschiede zwischen normal @Autowired Bohnen und injiziert mit Methodeninjektion. Schauen wir uns dieses einfache Beispiel an, um zu verstehen, wie Annotationen mit der Spring-Lookup-Methode verwendet werden.

Im folgenden Beispiel verwenden wir die Prototyp-Beans ResourceA und ResourceB, die in einen anderen Singleton-Bean RequestProcessor injiziert werden. ResourceB wird mit injiziert @Autowired und ResourceA mit der Methode Injektion injiziert. Im Hauptprogramm gibt es eine Schleife zum Aufrufen der Instanzen für die Beans. Die Bean mit Methodeninjektion wird jedes Mal instanziiert, wenn eine neue Anfrage gestellt wird.

Beispiel einer Methodeninjektion

ResourceA.java

package javabeat.net;

public class ResourceA {
	String url ="http://localhost:8080";
	public ResourceA(){
		System.out.println("Resource A instance creation");
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}
}

ResourceB.java

package javabeat.net;

public class ResourceB {
	String url ="http://localhost:8081";
	public ResourceB(){
		System.out.println("Resource B instance creation");
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}
}

RequestProcessor.java

package javabeat.net;

import org.springframework.beans.factory.annotation.Autowired;

public abstract class RequestProcessor {
	@Autowired
	ResourceB resourceB;
	public ResourceB getResourceB(){
		return resourceB;
	}

	abstract ResourceA getResourceA();
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:cache="http://www.springframework.org/schema/cache"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xsi:schemaLocation="
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc.xsd
	    http://www.springframework.org/schema/beans
	   	http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
		http://www.springframework.org/schema/cache
		http://www.springframework.org/schema/cache/spring-cache.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-2.5.xsd
        http://www.springframework.org/schema/jee
		http://www.springframework.org/schema/jee/spring-jee.xsd">
	<context:component-scan base-package="javabeat.net"></context:component-scan>
	<bean id="processor"  >
		<lookup-method name="getResourceA" bean="resourceA"/>
	</bean>

	<bean id="resourceA"   scope="prototype"/>
	<bean id="resourceB"   scope="prototype"/>
</beans>

SpringExample.java

package javabeat.net;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringExample {
	public static void main(String[] args) {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("org/applicationContext.xml");
		RequestProcessor processor = (RequestProcessor)applicationContext.getBean("processor");
		for (int i=0;i<3;i++){
			ResourceA resource = processor.getResourceA();
			System.out.println(resource.getUrl());
		}
		for (int i=0;i<3;i++){
			ResourceB resource = processor.getResourceB();
			System.out.println(resource.getUrl());
		}
	}
}

Ausgabe für das obige Programm:

Resource B instance creation
Resource A instance creation
http://localhost:8080
Resource A instance creation
http://localhost:8080
Resource A instance creation
http://localhost:8080
http://localhost:8081
http://localhost:8081
http://localhost:8081

Wenn Sie diese Ausnahme erhalten, bedeutet das, dass Sie die frühere Version als Spring 3.2 verwenden und die Bibliotheken für CGLIB fehlen. Ab Spring 3.2 wurden alle net.sf.cglib-Klassen nach org.springframework.cglib verschoben und direkt in die Spring-Core-JAR integriert. CGLIB ist eine Bytecode-Generierungsbibliothek, eine High-Level-API zum Generieren und Transformieren von Java-Bytecode. Es handelt sich um eine dritte Teilbibliothek, die jetzt mit dem Spring-Framework selbst zusammengeführt ist.

Caused by: java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter
	at org.springframework.beans.factory.support.CglibSubclassingInstantiationStrategy.instantiateWithMethodInjection(CglibSubclassingInstantiationStrategy.java:71)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:75)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:948)
	... 13 more
Caused by: java.lang.ClassNotFoundException: net.sf.cglib.proxy.CallbackFilter
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	... 16 more

Zusammenfassung

Dieser Artikel hilft Ihnen zu verstehen, wie Anmerkung zur Spring-Lookup-Methode Wird für die Methode Injektion verwendet. Dies ist eine der nützlichen Funktionen, wenn wir Bohnen unterschiedlichen Umfangs injizieren. Wenn Sie irgendwelche Gedanken haben, posten Sie diese bitte im Kommentarbereich.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen