Nachtrag 2018-11-05
In Laravel von PHP verursachte das globale Abrufen eines Objekts über DI-Auflösung von keiner Klasse keine Probleme (was meines Wissens nicht passiert ist), aber im Frühjahr beinhaltet es das nervige Element des Kontexts, also Laravel Es scheint, dass es nicht möglich ist, mit Hoi Hoi eine DI-Lösung mit einem solchen Kleber zu haben.
Wie üblich ist dies eine Geschichte in einem Zustand, in dem Spring Boot nicht verwendet wird. Daher ist es möglicherweise nicht der Fall, wenn Spring Boot eingeführt wird, aber zu diesem Zeitpunkt konnten wir noch nicht so viel untersuchen.
Zugewiesen an ein Web-System-Projekt mit Java Spring MVC. Spring Boot wird nicht verwendet, da es sich anscheinend um ein System handelt, das vor einiger Zeit hergestellt wurde. Ich bin noch neu in Java-Websystemen, daher ist dies sehr schwierig.
Spring MVC scheint eine Annotation wie "@Inject" für DI zu verwenden. Vor kurzem habe ich ein wenig über die domänengesteuerte Entwicklung gelernt, also habe ich versucht, ein einfaches Domänenobjekt zu erstellen, das mit dem Reparaturteil zusammenhängt, indem ich darüber nachgedacht habe, ein Domänenobjekt zu erstellen (ein Objekt, das eine leicht verständliche Arbeitseinheit trägt).
Ich habe jedoch gelernt, dass DI mit Anmerkungen nicht in einer Klasse verwendet werden kann, die nicht den Regeln von Spring MVC entspricht, dh in einer selbst erstellten Klasse. Als Ergebnis der Suche nach einer alternativen Methode habe ich sie so gefunden, wie sie ist, daher werde ich sie hier kurz zusammenfassen.
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.support.WebApplicationContextUtils;
(Unterlassung)
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
ServletContext servletContext = httpServletRequest.getServletContext();
WebApplicationContext webApplicationContext =
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
//Instanz anhand des Bean-Definitionsnamens abrufen
//Da es als Objekttyp zurückgegeben wird, wandeln Sie es in die gewünschte Klasse um
Zieltyp Variablenname= (In die gewünschte Form gießen) webApplicationContext.getBean("Name der Bean-Definition");
//Get Bean Definition Namensliste getBean()Sie können die Zeichenfolge überprüfen, die als Argument für verwendet werden kann.
String[] beanDefinitionNames = webApplicationContext.getBeanDefinitionNames();
getServletContext ()
abgerufen werden.((ServletRequestAttributes) RequestContextHolder.getRequestAttributes ()). GetRequest ()
.package Geben Sie den Paketnamen an;
import java.util.Arrays;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.support.WebApplicationContextUtils;
/**
*Domänenobjekt
*DI-Löser (DependencyInjectionSolver)
*In einer selbstgemachten Klasse, die nicht von Spring verwaltet wird@DI mit Anmerkungen wie Inject funktioniert also nicht
*Rufen Sie die DI-aufgelöste Instanz über diese Klasse ab.
*
*Beim Testen des Prozesses, der diese Klasse verwendet, sagt die JUnit Test-Klasse "@Kommentieren Sie "WebAppConfiguration".
*/
public class DependencyInjectionSolver {
private static final Logger logger = LoggerFactory.getLogger(DependencyInjectionSolver.class);
/**
*ApplicationContext zum Abrufen von Beans durch diese Instanz
*/
private WebApplicationContext webApplicationContext;
public DependencyInjectionSolver() {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
ServletContext servletContext = httpServletRequest.getServletContext();
this.webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
}
/**
*Erhalten Sie den Bean-Definitionsnamen und rufen Sie die DI-aufgelöste Instanz ab.
*Da es als Objekttyp zurückgegeben wird, werfen Sie es auf die Erfassungsseite.
*
* @param string Name der Bean-Definition
* @return Object
*/
public Object getBeanByBeanName(String beanName) {
return this.webApplicationContext.getBean(beanName);
}
/**
*Rufen Sie eine Liste der definierten Bean-Definitionsnamen ab.
*GetBeanByBeanName für die Namen in dieser Liste()Kann als Argument von verwendet werden.
*
* @return List<string>Liste der Bean-Definitionsnamen
*/
public List<String> gettableBeanNames() {
String[] beanDefinitionNames = this.webApplicationContext.getBeanDefinitionNames();
return Arrays.asList(beanDefinitionNames);
}
}
Benutzerseite
DependencyInjectionSolver diSolver = new DependencyInjectionSolver();
Variablenname wie Schnittstellenname= (Schnittstellenname usw.) diSolver.getBeanByBeanName("Name der Bean-Definition");
Recommended Posts