java spring - Wie definiert man eine List Bean im Frühling?



tutorial boot (9)

Eine andere Option ist die Verwendung von JavaConfig. Vorausgesetzt, dass alle Stufen bereits als Frühling Bohnen registriert sind, müssen Sie nur:

@Autowired
private List<Stage> stages;

und Frühling wird sie automatisch in diese Liste einspritzen. Wenn Sie die Reihenfolge beibehalten müssen (die obere Lösung tut das nicht), können Sie das auf folgende Weise tun:

@Configuration
public class MyConfiguration {
  @Autowired
  private Stage1 stage1;

  @Autowired
  private Stage2 stage2;

  @Bean
  public List<Stage> stages() {
    return Lists.newArrayList(stage1, stage2);
  }
}

Die andere Lösung, um die Reihenfolge zu erhalten, ist eine @Order Annotation für Beans. Die Liste enthält dann Beans, sortiert nach ansteigendem Anmerkungswert.

@Bean
@Order(1)
public Stage stage1() {
    return new Stage1();
}

@Bean
@Order(2)
public Stage stage2() {
    return new Stage2();
}

Ich verwende Spring, um Phasen in meiner Anwendung zu definieren. Es ist konfiguriert, dass die erforderliche Klasse (hier Configurator ) mit den Stufen injiziert wird.
Jetzt brauche ich die Liste der Stufen in einer anderen Klasse namens LoginBean . Der Configurator bietet keinen Zugriff auf seine Stage-Liste.

Ich kann den Klassenkonfigurator nicht ändern.

Meine Idee:
Definieren Sie eine neue Bean namens Stages und injizieren Sie sie in Configurator und LoginBean . Mein Problem mit dieser Idee ist, dass ich nicht weiß, wie man diese Eigenschaft transformiert:

<property ...>
  <list>
    <bean ... >...</bean>
    <bean ... >...</bean>
    <bean ... >...</bean>
  </list>
</property>

in eine Bohne.

So etwas funktioniert nicht:

<bean id="stages" class="java.util.ArrayList">

Kann mir jemand dabei helfen?


<bean id="someBean"
      class="com.somePackage.SomeClass">
    <property name="myList">
        <list value-type="com.somePackage.TypeForList">
            <ref bean="someBeanInTheList"/>
            <ref bean="someOtherBeanInTheList"/>
            <ref bean="someThirdBeanInTheList"/>
        </list>
    </property>
</bean>

Und in SomeClass:

class SomeClass {

    private List<TypeForList> myList;

    @Required
    public void setMyList(List<TypeForList> myList) {
        this.myList = myList;
    }

}

Ich denke, dass Sie nach org.springframework.beans.factory.config.ListFactoryBean suchen.

Sie deklarieren eine ListFactoryBean-Instanz, indem Sie die Liste als Eigenschaft mit einem <list> -Element als Wert instanziieren und der Bean ein id Attribut zuweisen. Jedes Mal, wenn Sie die deklarierte id in einer anderen Bean-Deklaration als ref oder ähnlich verwenden, wird eine neue Kopie der Liste instanziiert. Sie können auch die zu verwendende List Klasse angeben.


 <bean id="student1" class="com.spring.assin2.Student">  
<property name="name" value="ram"></property>  
<property name="id" value="1"></property> 
<property name="listTest">
        <list value-type="java.util.List">
            <ref bean="test1"/>
            <ref bean="test2"/>
        </list>
    </property>
</bean>  

Definiere diese Beans (test1, test2) danach :)


Verwenden Sie den UUIL-Namespace, und Sie können die Liste als Bean in Ihrem Anwendungskontext registrieren. Sie können die Liste dann erneut verwenden, um sie in andere Bean-Definitionen einzufügen.


Importieren Sie den SpringUtil-Namespace. Dann können Sie eine Listen-Bean wie folgt definieren:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                    http://www.springframework.org/schema/util
                    http://www.springframework.org/schema/util/spring-util-2.5.xsd">


<util:list id="myList" value-type="java.lang.String">
    <value>foo</value>
    <value>bar</value>
</util:list>

Der Werttyp ist der zu verwendende Generikentyp und optional. Sie können die List-Implementierungsklasse auch mit dem Attribut list-class angeben.


Stacker hat eine großartige Antwort gegeben, ich würde einen Schritt weiter gehen, um es dynamischer zu machen und Spring 3 EL Expression zu verwenden.

<bean id="listBean" class="java.util.ArrayList">
        <constructor-arg>
            <value>#{springDAOBean.getGenericListFoo()}</value>
        </constructor-arg>
</bean>

Ich versuchte herauszufinden, wie ich das mit der util: -Liste machen konnte, konnte aber aufgrund von Konvertierungsfehlern nicht funktionieren.


Als Ergänzung zu Jakubs Antwort können Sie, wenn Sie JavaConfig verwenden möchten, auch auf diese Weise autowire:

import com.google.common.collect.Lists;

import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;

<...>

@Configuration
public class MyConfiguration {

    @Bean
    public List<Stage> stages(final Stage1 stage1, final Stage2 stage2) {
        return Lists.newArrayList(stage1, stage2);
    }
}

Weißt du was ein Servlet Filter ist und wie er funktioniert? Es ist ein sehr nützliches Teil der Servlet-Spezifikation, die es uns ermöglicht, AOP-ähnliche Konzepte auf die Verarbeitung von HTTP-Anfragen anzuwenden. Viele Frameworks verwenden Filterimplementierungen für verschiedene Dinge, und es ist nicht ungewöhnlich, benutzerdefinierte Implementierungen von ihnen zu finden, weil sie sehr einfach zu schreiben und nützlich sind. In einer Spring-App sind die meisten Dinge, die Ihre App erledigen kann, in Ihren Spring-Beans enthalten. Eine Filter-Instanz wird jedoch vom Servlet-Container gesteuert. Der Container instanziiert, initialisiert und zerstört sie. Die Servlet-Spezifikation erfordert jedoch keinerlei Spring-Integration, sodass Ihnen ein wirklich nützliches Konzept (Filter) zur Verfügung steht, ohne dass Sie es bequem an Ihre Spring-App und die Beans, die die Arbeit erledigen, binden können.

Geben Sie den DelegatingFilterProxy ein. Sie schreiben eine Filterimplementierung und machen sie zu einer Spring-Bean, aber statt Ihre eigene Filter-Klasse zur web.xml hinzuzufügen, verwenden Sie den DelegatingFilterProxy und geben Sie ihm den Namen des Filters im Spring-Kontext. (Wenn Sie keinen Namen explizit angeben, wird der Name "filter-name" verwendet.) Zur Laufzeit verarbeitet DelegatingFilterProxy die Komplexität der Suche nach der echten Implementierung, die Sie im Frühjahr geschrieben und konfiguriert haben, und leitet Anforderungen an sie weiter . Zur Laufzeit ist es so, als hätten Sie Ihren Filter in der Datei web.xml aufgelistet, aber Sie können ihn wie jede andere Spring Bean verbinden.

Wenn Sie dieses Filter-Mapping aus Ihrer web.xml entfernen, funktioniert alles weiterhin, aber keine Ihrer URLs wird gesichert. (Dies bedeutet, dass der Name "springSecurityFilterChain" genau beschreibt, was er tut.) Das liegt daran, dass diese Zuordnung jede eingehende Anfrage filtert und sie an einen Sicherheitsfilter weitergibt, der in Ihrem Spring-Kontext definiert ist.





java spring