2017-12-16 4 views
1

Wäre es technisch eine gute und akzeptable Methode, erforderliche Abhängigkeiten mit einem Interceptor-Typ zu injizieren. Zum Beispiel:Abhängigkeiten mit einem Interceptor einsperren

public @interface Inject { 
    public Class thisType(); 
} 

public class InjectionInterceptor implements HandlerInterceptor { 

    @Override 
    public bool preHandle(HttpServletRequest hsr, HttpServletResponse hsr1, Object o) { 
     HandlerMethod handlerMethod = (HandlerMethod) o; 
     Class type = handlerMethod.getBeanType(); 
     Annotation[] annotations = type.getAnnotationsByType(Inject.class); 
     for(Annotation annotation: annotations){ 
      Inject inject = (inject) annotation; 
      for(Field field :type.getDeclaredFields()){ 
       if(field.getType().equals(inject.thisType())){ 
        field.setAccessible(true); 
        field.set(handlerMethod.getBean(), Services.find(inject.thisType())); 
       } 
      } 
      .... 
     return true; 
    } 
    ... 
} 
+2

Was würden wir mit dieser Art von Dependency Injection erreichen? –

+0

Und das willst du im Frühling machen, wo du schon DI hast? Warum? Du weißt, dass du '@ Autowired' richtig benutzen kannst? – Antoniossss

+0

@Antoniossss: Autowired ist so nutzlos, wie können Sie sagen, auf welchen Typ eine Schnittstelle gebunden werden muss und was, wenn es Singleton oder instanziiert einmal pro Sitzung sein muss. – Arrrr

Antwort

1

Eine Bohne kann 4 Bereiche haben.

  1. Singleton Nur eine freigegebene Instanz der Bohne wird verwaltet und alle Anforderungen für Bohnen mit einer ID oder IDs, die Bohne Definition entsprechen, daß eine bestimmte Bean-Instanz führen wird durch die Federbehälter zurückgeführt wird.

    Dies ist der Standardbereich einer Bean.

  2. Prototyp Neue Instanz wird vom Container zurückgegeben, wenn Bean mit der angegebenen ID angefordert wird.

    Ex: Wenn Sie eine Bohne mit der ID als „Mitarbeiter“ im Frühjahr Behälter haben, dann jedes Mal tun Sie ein

    Employee emp = context.getBean("employee");

    Eine neue Instanz zurückgegeben wird.

Anfrage, Sitzungs- und globale Session ist nur für die Verwendung in Web-basierten Anwendungen

  1. Anfrage Eine neue Instanz wird für jeden einzelnen HTTP erstellt anfordern. Beispiel: Login benötigt jedes Mal eine andere Instanz.

  2. Sitzung Es wird eine neue Instanz der Bean erstellt, die die Bean-Definition für die Lebensdauer einer einzelnen HTTP-Sitzung verwendet.

  3. global Der globale Sitzungsbereich ist ähnlich den Standard-HTTP-Sitzungsbereich und wirklich nur dann sinnvoll im Zusammenhang mit den Portlet-basierten Web-Anwendungen

Sie den Umfang einer Bohne in zwei angeben Wege

  1. Verwendung von XML:

<bean id="employee" class="com.company.Employee" scope="singleton"/>

  1. Annotation verwenden.

    markieren Sie die Klasse mit @Scope("prototype")

Sie mehr über Bereiche verfügbar here

Beispielcode als Referenz lesen kann, ist here