2018-11-05 Addendum
Dans Laravel de PHP, obtenir un objet globalement via la résolution DI à partir de n'importe quelle classe ne posait aucun problème (ce qui n'était pas arrivé à ma connaissance), mais au printemps, cela implique un élément de contexte ennuyeux, donc Laravel Il semble qu'il n'est pas possible de faire une solution DI avec Hoi Hoi avec une telle colle.
Comme d'habitude, il s'agit d'une histoire dans un état où Spring Boot n'est pas utilisé, donc ce n'est peut-être pas le cas lorsque Spring Boot est introduit, mais à ce stade, nous n'avons pas été en mesure d'enquêter autant.
Affecté à un projet de système Web à l'aide de Spring MVC de Java. Spring Boot n'est pas utilisé car il semble être un système créé il y a peu de temps. Je suis encore nouveau sur les systèmes Web Java, c'est donc très difficile à faire.
Spring MVC semble utiliser une annotation comme "@Inject" pour DI. Récemment, j'ai appris un peu sur le développement piloté par domaine, j'ai donc essayé de créer un objet de domaine simple lié à la partie réparation en pensant à créer un objet de domaine (un objet qui porte une unité de travail facile à comprendre).
Cependant, j'ai appris que DI utilisant des annotations ne peut pas être utilisé dans une classe qui ne suit pas les règles de Spring MVC, c'est-à-dire dans une classe auto-créée. À la suite de la recherche d'une méthode alternative, je l'ai trouvée telle quelle, je vais donc la résumer brièvement ici.
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;
(Omission)
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
ServletContext servletContext = httpServletRequest.getServletContext();
WebApplicationContext webApplicationContext =
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
//Obtenir l'instance par nom de définition de bean
//Puisqu'il retourne en tant que type Object, transtypez-le dans la classe souhaitée
Type de cible Nom de variable= (Couler dans le moule souhaité) webApplicationContext.getBean("Nom de la définition du haricot");
//Obtenir la liste des noms de définitions de bean getBean()Vous pouvez vérifier la chaîne de caractères qui peut être utilisée comme argument de.
String[] beanDefinitionNames = webApplicationContext.getBeanDefinitionNames();
WebApplicationContextUtils.getRequiredWebApplicationContext (instance ServletContext)
, et vous pouvez obtenir "WebApplicationContext".getServletContext ()
.((ServletRequestAttributes) RequestContextHolder.getRequestAttributes ()). GetRequest ()
.peut être obtenu par
WebApplicationContext.getBeanDefinitionNames ()`.package Spécifiez le nom du package;
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;
/**
*Objet de domaine
*Solveur DI (DependencyInjectionSolver)
*Dans une classe autodidacte non gérée par Spring@DI utilisant des annotations telles que Inject ne fonctionne pas, donc
*Obtenez l'instance résolue DI via cette classe.
*
*Lors du test du processus qui utilise cette classe, la classe JUnit Test dit "@Annoter "WebAppConfiguration".
*/
public class DependencyInjectionSolver {
private static final Logger logger = LoggerFactory.getLogger(DependencyInjectionSolver.class);
/**
*ApplicationContext pour obtenir des beans via cette instance
*/
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);
}
/**
*Recevez le nom de la définition du bean et obtenez l'instance résolue DI.
*Puisqu'il revient en tant que type Object, lancez-le du côté de l'acquisition.
*
* @param string Nom de la définition du bean
* @return Object
*/
public Object getBeanByBeanName(String beanName) {
return this.webApplicationContext.getBean(beanName);
}
/**
*Obtenez une liste des noms de définition de bean définis.
*GetBeanByBeanName pour les noms de cette liste()Peut être utilisé comme argument de.
*
* @return List<string>Liste des noms de définition de bean
*/
public List<String> gettableBeanNames() {
String[] beanDefinitionNames = this.webApplicationContext.getBeanDefinitionNames();
return Arrays.asList(beanDefinitionNames);
}
}
Côté utilisateur
DependencyInjectionSolver diSolver = new DependencyInjectionSolver();
Nom de variable tel que le nom de l'interface= (Nom de l'interface, etc.) diSolver.getBeanByBeanName("Nom de la définition du haricot");