Spring Autowire innerhalb von abstrakten Klassen

Dieses Thema Spring - Autowire innerhalb von abstrakten Klassen im Forum "Application Tier" wurde erstellt von Tunguska, 14. Okt. 2013.

Thema: Autowire innerhalb von abstrakten Klassen Hallo zusammen Ich möchte gerne diverse DAO- und Service Klassen innerhalb einer abstrakten Superklasse...

  1. Hallo zusammen

    Ich möchte gerne diverse DAO- und Service Klassen innerhalb einer abstrakten Superklasse "autowiren".

    AbstractFactory (com.app.factory)
    Code (Java):

    public abstract class AbstractFactory{
       
        @Autowired protected UserService userService;
        @Autowired protected TenantDao<Material> materialDao;
       
        public static AbstractFactory getFactory(Company company) throws Exception {
           
            Integer companyNumber = new Integer(company.getCompanyNumber());
           
            if (companyNumber.equals(SystemGlobals.COMPANY_NUMBER_GERMANY)) {
                return new FactoryGermany();
            }
            else if (companyNumber.equals(SystemGlobals.COMPANY_NUMBER_US)) {
                return new FactoryAmerica();
            }
            else {
                throw new CompanyNotExistsException();
            }
        }
    }
     
    GermanFactory (com.app.factory.germany)
    Code (Java):

    @Component
    public class FactoryGermany extends AbstractFactory {
     // implementation
    }
     
    servlet.xml
    [XML]
    <context:annotation-config />
    <context:component-scan base-package="com.app.factory.germany"/>
    [/XML]

    Leider bleiben die Instanzvariablen innerhalb der zurückgegebenen Kinder-Factories jeweils null.
    Die beiden Klassen (Service und DAO) können in anderen "normalen" Klassen ohne Problem mit @autowired eingefügt werden.
    Einzig mit den abstrakten Klassen funktioniert das leider nicht.

    Vielen Dank für eure Hilfe!
     
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. Erstens: warum new Integer(company..) ?

    Zweitens: DI funktioniert nur wenn die Klassen über Spring (vom "IOC-Container") erzeugt werden.

    Bei new XXX kann der SpringIoC-Container natürlich nichts injecten weil er das Objekt und die Erzeugung gar nicht kennt.

    Um das zu lösen kannst du folgendes tun:

    - du definierst die Factories in deinem ApplicationContext oder wo auch immer (Annotations)
    - in den IFs lässt du die entsprechende Factory über Spring erzeugen (if(..) return applicationContext.getBean(MyCustomFactory.class)

    Um an den ApplicationContext zu kommen muss deine AbstractFactory lediglich das Interface ApplicationContextAware implementieren. Evtl geht das aber auch über Annotations.

    Evtl kannst du auch das Objekt selbst erzeugen und Spring anweisen entsprechende Felder zu injecten..weiß aber nicht genau ob Spring das kann...ich meine aber schon...
     
    Zuletzt bearbeitet: 25. Okt. 2013
  4. Die companyNumber kommt als String daher. Würde ich keinen Integer draus machen, hätte ich weiter unten mit dem equals ein Problem.

    Das mit dem Erzeugen kann ich nun nachvollziehen. Danke für deine Hilfe!
     
  5. Kostenloses Java-Grundlagen Training im Wert von 39 €
    Schau dir jetzt hier das Tutorial an und starte richtig durch!