Spring XML namespaces: Hoe vind ik wat zijn de implementatieklassen achter hen?

In mijn Spring 3.1-toepassing moet ik soms het standaardgedrag van sommige Spring-naamruimten in mijn contextbestanden wijzigen. Om dat te doen, maak ik aangepaste klassen die sommige interfaces implementeren of die de standaardklassen die Lente gebruikt, uitbreiden.

Maar ik vind het moeilijk om precies te weten wat de klassen zijn die Spring gebruikt achter zijn naamruimten! Welke stappen moet ik doen om ze te vinden?

De beveiligingsnaamruimte bijvoorbeeld:


en zoiets als:


    ...
    

How do I find what classes are used by the "" namespace? I don't find the information by looking at http://www.springframework.org/schema/security/spring-security-3.1.xsd !

Waar moet ik kijken?

26
Voor zover ik weet, hebben XML-naamruimten niet noodzakelijkerwijs iets te maken met klassen.
toegevoegd de auteur duffymo, de bron

4 antwoord

Elke Spring-naamruimte heeft een bijbehorende NamespaceHandler implementatie. De namespace-schema's worden toegewezen aan schemabestanden in Spring JAR's in verschillende spring.schemas bestanden (zie ook Spring DI applicationContext.xml hoe precies is xsi: schemaLocation gebruikt? ).

De naamruimten van het XML-schema worden ook toegewezen aan handlerklassen in spring.handlers -bestanden (verschillende aangezien elke voorjaarsjAR verschillende naamruimten kan introduceren). Voor uw gemak is hier een lijst met meest voorkomende naamruimten:

Lente kern

Lente Beveiliging

Lente integratie

Als u naar de bron van elk van deze klassen bladert, zult u snel verschillende BeanDefinitionParser -implementaties ontdekken die verantwoordelijk zijn voor het parseren van de werkelijke XML-definities.

46
toegevoegd
Bedankt Tomasz! Dit, gemengd met enkele van de trucs door ericacm, heeft me een stuk geholpen. Bij verduistering (voor degenen die het gebruiken) helpt het ook om de "Type-hiërarchie" voor NamespaceHandler en BeanDefinitionParser te openen.
toegevoegd de auteur electrotype, de bron
Voor lente batch: batch - CoreNamespaceHandler
toegevoegd de auteur Abdull, de bron
toegevoegd de auteur Kaszaq, de bron

Almost all of them are named *BeanDefinitionParser. First step is, using your browser, bring up the Spring JavaDocs and hit -F (or -F). Search for BeanDefinitionParser. Of the classes that match, one or two will, by their names, look like they handle the namespace elements you are researching. It may take a bit of looking at the source code to those classes but you'll ultimately find what you want.

U kunt ook in uw IDE naar BeanDefinitionParser.java bladeren en vervolgens "Find Usages" (IntelliJ) of "Type Hierarchy" (Eclipse) gebruiken om alle implementeerders van die interface te vinden. Er zijn een handvol klassen die de naamgevingsconventie * BeanDefinitionParser niet volgen. Je IDE geeft je een uitgebreide lijst.

Ik denk dat Spring in het gedeelte Naamruimte van hun referentiedocumenten de klassen van elk element daadwerkelijk moet documenteren.

2
toegevoegd

Elke XML-naamruimte wordt geparseerd door zijn NamespaceHandler . De handlerklasse voor beveiligingsnaamruimte is SecurityNamespaceHandler , dat is gespecificeerd in spring.handlers-bestand binnen META-INF van spring-security-config-XXX.jar-bestand.

Het http-element wordt geparseerd door HttpSecurityBeanDefinitionParser en de afmelding van het onderliggende element wordt geparseerd door org.springframework.security.config.http.LogoutBeanDefinitionParser (pakketbeveiliging).

Zie ook de aantekeningen in Coding a NamespaceHandler en advies in Welke bonen worden geregistreerd door de naamruimte met de lentebeveiliging? als u van plan bent deze aan te passen.

1
toegevoegd

In the case of Spring Security, it's well documented: see Appendix B. The Security Namespace

See also this blog post: BEHIND THE SPRING SECURITY NAMESPACE

0
toegevoegd