[Java Spring MVC] Je souhaite utiliser DI dans ma propre classe

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.

Aperçu

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();

ApplicationContext.getBean ("Nom de la définition du bean")

Obtenir ServletContext

Comment trouver le nom de la définition du bean

Exemple de classe

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");

Recommended Posts

[Java Spring MVC] Je souhaite utiliser DI dans ma propre classe
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Je veux utiliser @Autowired dans Servlet
[java] Ce que j'ai fait en comparant des listes dans ma propre classe
Je souhaite envoyer un e-mail en Java.
Je veux utiliser java8 forEach avec index
rsync4j --Je veux toucher rsync en Java.
Mon mémorandum que je veux faire ValidationMessages.properties UTF8 dans Spring Boot
Je souhaite utiliser les fonctions pratiques de Clojure dans Kotlin
Je veux faire quelque chose comme "cls" en Java
Je veux aussi utiliser des coquillages à Laradock! !!
Comment utiliser la classe Java
Je souhaite utiliser PowerMock dans une classe qui combine des tests paramétrés et des tests ordinaires
Comment appeler et utiliser l'API en Java (Spring Boot)
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
J'ai essayé de résumer l'orientation de l'objet à ma manière.
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
Comment utiliser Lombok au printemps
J'ai été piégé lorsque j'ai généré mes propres égaux de classe et hashCode en Java à l'aide de l'IDE
Comment utiliser les méthodes de classe [Java]
Comment utiliser les classes en Java?
[Java] Comment utiliser la classe Math
Je veux juste écrire Java en utilisant Eclipse sur mon Mac
J'ai essayé de configurer les débutants Java pour qu'ils utilisent des touches de raccourci dans eclipse
[Java] Je veux effectuer distinctement avec la clé dans l'objet
[Spring Boot] Je veux ajouter mon propre fichier de propriétés et obtenir la valeur avec env.getProperty ().
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
Je souhaite utiliser DBViewer avec Eclipse 2018-12! !!
[Traitement × Java] Comment utiliser la classe
Comment utiliser la classe Java Scanner (Remarque)
Je veux arrêter complètement les mises à jour Java
[Java] Comment utiliser la classe Calendar
[* Java *] J'ai participé au JJUG CCC 2019 Spring
Je veux afficher des images avec REST Controller de Java et Spring!
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (édition PowerMockito)
(Limité à Java 7 ou version ultérieure) Je souhaite que vous compariez des objets dans Objects.equals
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
Je veux ForEach un tableau avec une expression Lambda en Java
"Professeur, je souhaite implémenter une fonction de connexion au printemps" ① Hello World
Quelle classe doit être utilisée pour obtenir la date et l'heure dans l'application Rails (Time, DateTime, TimeWithZone)
[Java] Comment utiliser la classe FileReader et la classe BufferedReader
Appel de méthode Java depuis RPG (appel de méthode dans sa propre classe)
Même en Java, je veux sortir true avec un == 1 && a == 2 && a == 3 (deuxième décoction Javassist)
Comment obtenir une classe depuis Element en Java
Je souhaite transmettre APP_HOME pour me connecter à Gradle
Je veux que vous utilisiez Scala comme meilleur Java pour le moment
[JAVA] [Spring] [MyBatis] Utiliser IN () avec SQL Builder
Je veux écrire rapidement de java vers sqlite
J'ai essayé de créer une compétence Alexa avec Java
Faisons une application TODO avec Java 2 Je veux créer un modèle avec Spring Initializr et créer Hello world
[Java] Spring DI ③
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (Black Magic)
Je veux obtenir la valeur en Ruby
[Java] Comment utiliser la classe Calendar et la classe Date