Spring Autowire innerhalb von abstrakten Klassen

Tunguska

Mitglied
Hallo zusammen

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

AbstractFactory (com.app.factory)
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)
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!
 

KSG9|sebastian

Top Contributor
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:

Tunguska

Mitglied
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!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Autowire Application Tier 9

Ähnliche Java Themen

Neue Themen


Oben