Spring Dependency Injection Problem

lieschen89

Mitglied
Hi,

ich habe Spring schon in einigen Web-Projekten eingesetzt und wolle jetzt eine 'normale' Java-Anwendung mit Spring basteln. Allerdings funktioniert hier die Dependency Injection nicht. Ich bekomme immer eine Nullpointer wenn in meinem Code das Objekt, was eigenlicht injected werden soll, aufgerufen wir.

Hier meine Javaklasse:
Code:
public class DatenSammler {
	
	private DatenService datenService;

	public void sammleDaten() {
		...
		datenService.doSomethin();		//Nullpointer
		...
	}
	
	public void setDatenService(DatenService datenService) {
		this.datenService = datenService;
	}
	
}


Und meine Spring-Konfiguration:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

	<import resource="databaseContext.xml"/>

    <bean id="datenDao" class="com.daten.dao.DatenDao">
        <property name="hibernateTemplate" ref="hibernateTemplate"/>
    </bean>

	<bean id="datenService" class="com.daten.service.DatenService">
		<property name="datenDao" ref="datenDao"/>
    </bean>

	<bean id="datenSammler" class="com.daten.sammler.DatenSammler">
		<property name="datenService" ref="datenService"/>
    </bean>    
</beans>


Er kommt auch gar nicht in den Setter rein.

Kann mir vielleicht jemand sagen, was ich falsch gemacht habe?
Dachte eigentlich Bean in der conifg definieren und gut ist.
 

diel2001

Mitglied
Dir fehlt wahrscheinlich das drum herum. Irgendeine Klasse muss sich ja um die Injection kümmern.
Bei der Serveranwendung kümmert sich der Server um die Initialisierung des Containers und der Komponente, welche sich um die DI kümmert. Also ist nicht nur einfach Xml bearbeiten und fertig.
 

lieschen89

Mitglied
ok danke, so was hatte ich befürchtet^^
Hatte mir eigentlich schon einige Beispiel angeschaut (Bsp: http://www.frank-rahn.de/spring-einem-einfachem-beispiel.html), allerdings fand ich da auch nur Konfigurationen über xml aber sonst nichts.

Jetzt im Bezug auf deine Antwort habe ich noch einmal gezielt danach geschaut aber auch nichts gesehen. In anderen Beipielen auch nicht. Die holen sich die Beans in den Beispielen allerdings auch meistens mit: context.getBean("mybean");

Hast du mir vll ein Beispiel? Bzw. ein Schlagwort, hat die Klasse einen bestimmten Namen? Dass ich gezielter googlen kann.
 

Writtscher

Mitglied
Da fehlt die @Autowired Annotation auf der Setter Methode. Bitte auch mal die main zeigen bzw. wie dein ApplicationContext gestartet wird.

Code:
public class DatenSammler {
    
    private DatenService datenService;
 
    public void sammleDaten() {
        ...
        datenService.doSomethin();      //Nullpointer
        ...
    }
    
    @Autowired
    public void setDatenService(DatenService datenService) {
        this.datenService = datenService;
    }
    
}

So müsste das aussehen:

Code:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application-context.xml");
DatenSammler datenSammler = applicationContext.getBean(DatenSammler.class);
datenSammler.doSomethin();
 
Zuletzt bearbeitet:

lieschen89

Mitglied
wuhu, die Zeile wars:

Code:
DatenSammler datenSammler = applicationContext.getBean(DatenSammler.class);

Ich hatte den einfach mit new DatenSammler () erzeugt. Dachte schon dass der ApplicationContext drüber ein wenig verloren aussieht wenn der gar nicht benutzt wird^^

Jetzt gehts. Super danke.

Zu den Annotationen: @Autowired und @Component.
Da hab ich noch nie wirklich durchgeblickt, weils iwie auch immer ohne geht (wie jetzt zum Beispiel).
Dachte eigentlich @Autowired braucht man nur, wenn man die Beans nicht in der .xml defniert hat sondern da dieses package scan aktiviert hat.
 

Writtscher

Mitglied
wuhu, die Zeile wars:

Code:
DatenSammler datenSammler = applicationContext.getBean(DatenSammler.class);

Ich hatte den einfach mit new DatenSammler () erzeugt. Dachte schon dass der ApplicationContext drüber ein wenig verloren aussieht wenn der gar nicht benutzt wird^^

Jetzt gehts. Super danke.

Zu den Annotationen: @Autowired und @Component.
Da hab ich noch nie wirklich durchgeblickt, weils iwie auch immer ohne geht (wie jetzt zum Beispiel).
Dachte eigentlich @Autowired braucht man nur, wenn man die Beans nicht in der .xml defniert hat sondern da dieses package scan aktiviert hat.

Wenn du Beans mit new erzeugst, hat Spring keine Chance, denn dann arbeitest du am Context vorbei. Mit Autowired und Component hast du recht. Das benutzt man wenn man AnnotationBaseApplicationContext benutzt also mit packages to scan. Aber läuft ja jetzt.