Spring Beans - Grundsatzfrage

Status
Nicht offen für weitere Antworten.

reibi

Top Contributor
Hallo zusammen,

ich habe eben mal die einfachen Beispiele vom TorstemHorn über die SpringBens gemacht.

Nur zur Info: http://www.torsten-horn.de/techdocs/jee-spring.htm

was für mich immer noch nicht klar ist, ist für was das ganze gut sein soll. Es muss für irgendwas gut sein, sonst würde es das ja nicht geben und so häufig heut zu tage verwendet werden. Nur ich habs irgendwie nicht geschnallt.

vielen Dank fürs erklären Grüssli ;-)
 

reibi

Top Contributor
Jep, nur versteh ich die auch nicht. Was gibts denn für n Vorteil ne Instanz von nem ApplicationContext zu holen anstatt sie a.) Durch nen Konstruktor selber zu erzeugen oder b.) Durch ne Factory erzeugen zu lassen?
 

ms

Top Contributor
reibi hat gesagt.:
Jep, nur versteh ich die auch nicht. Was gibts denn für n Vorteil ne Instanz von nem ApplicationContext zu holen anstatt sie a.) Durch nen Konstruktor selber zu erzeugen oder b.) Durch ne Factory erzeugen zu lassen?
Ok, jetzt weis ich was gemeint war. Das Springframework besteht ja aus vielen nützlichen Dingen.

Der Vorteil, dass man ein Bean über ein Xml-File konfiguriert liegt darin, dass man Abhängigkeiten zu anderen Klassen bewußt vermeidet. Die einzige Abhängigkeit besteht über ein Interface.

Gehen wir von einer klassischen Enterpriseapplikation aus, dann finde ich es z.B. sehr praktisch die eigentliche Kernfunktionalität als ganz einfache Klassen zu Implementieren und zu Testen. Also keine Abhängigkeit z.B. zu einer Datenbank. Es verwendet lediglich ein allgemeines Interface der Persistenzschicht.

Folgendes Beispiel:
Es gibt eine Klasse Person welche eine Person repräsentiert, eine Klasse PersonService die eine Funktion zur
Bewertung einer Person zur Verfügung stellt und ein Interface PersonDao, welches eine Schnittstelle zur Datenbank repräsentiert.

Code:
package com.ms.bsp.spring.model;

/**
 * @author ms
 *
 */
public class Person {

	private Long id = null;
	private String name = null;
	private int punkte = 0;
	
	/**
	 * @return the id
	 */
	public Long getId() {
		return id;
	}
	/**
	 * @param id the id to set
	 */
	public void setId(Long id) {
		this.id = id;
	}
	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}
	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * @return the punkte
	 */
	public int getPunkte() {
		return punkte;
	}
	/**
	 * @param punkte the punkte to set
	 */
	public void setPunkte(int punkte) {
		this.punkte = punkte;
	}
	
}
Code:
package com.ms.bsp.spring;

import com.ms.bsp.spring.dao.PersonDao;
import com.ms.bsp.spring.model.Person;


/**
 * @author ms
 *
 */
public class PersonService {

	private PersonDao personDao = null;
	
	public boolean bewerten(Long id, int punkte) {
		Person person = personDao.suchen(id);
		if (person == null)
			return false;
		
		// hier der code zum bewerten
		person.setPunkte(punkte);
		
		personDao.update(person);
		return true;
	}
	/**
	 * @return the personDao
	 */
	public PersonDao getPersonDao() {
		return personDao;
	}

	/**
	 * @param personDao the personDao to set
	 */
	public void setPersonDao(PersonDao personDao) {
		this.personDao = personDao;
	}

}
Code:
package com.ms.bsp.spring.dao;

import com.ms.bsp.spring.model.Person;

/**
 * @author ms
 *
 */
public interface PersonDao {

	public Person suchen(Long id);
	
	public void update(Person person);
	
}

Zur Entwicklungszeit der Klasse PersonService kann man nun den Fokus ganz auf die eigentliche Funktionalität legen
und hat bis auf das Interface PersonDao keine Logik zum Persistieren. Zum Testen könnte ich jetzt ganz einfach eine
Klasse PersonMockDao schreiben (Mock-Objekt), welches nur für diesen Test eine Person zurückliefert:

Code:
package com.ms.bsp.spring.test;

import com.ms.bsp.spring.dao.PersonDao;
import com.ms.bsp.spring.model.Person;

/**
 * @author ms
 *
 */
public class PersonMockDaoImpl implements PersonDao {

	private Person person = null;
	
	/* (non-Javadoc)
	 * @see com.ms.bsp.spring.dao.PersonDao#suchen(java.lang.Long)
	 */
	public void init() {
		person = new Person();
		person.setName("ms");
		person.setId(new Long(1000));
		person.setPunkte(23);
	}

	public Person suchen(Long id) {
		if (id != null && id.longValue() == 1000)
			return person;
		return null;
	}

	/* (non-Javadoc)
	 * @see com.ms.bsp.spring.dao.PersonDao#update(com.ms.bsp.spring.model.Person)
	 */
	public void update(Person person) {
		// TODO Auto-generated method stub

	}

	/**
	 * @return the person
	 */
	public Person getPerson() {
		return person;
	}

}

Das Context-File zum Testen könnte dann so aussehen:
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-2.0.xsd">

	<bean id="personService" class="com.ms.bsp.spring.PersonService">
		<property name="personDao" ref="personMockDao"/>
	</bean>
	
	<bean id="personMockDao" class="com.ms.bsp.spring.test.PersonMockDaoImpl" init-method="init">
	</bean>

</beans>
Und zu guter Letzt noch der TestCase selbst:
Code:
package com.ms.bsp.spring.test;

import junit.framework.TestCase;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.ms.bsp.spring.PersonService;
import com.ms.bsp.spring.model.Person;

/**
 * @author ms
 * 
 */
public class PersonServiceTestCase extends TestCase {

	private static ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
			"testContext.xml");

	public void testPersonService() {
		PersonService personService = (PersonService)ctx.getBean("personService");
		PersonMockDaoImpl personDao = (PersonMockDaoImpl)ctx.getBean("personMockDao");
		assertFalse(personService.bewerten(new Long(500), 20));
		assertTrue(personService.bewerten(new Long(1000), 20));
		Person person = personDao.getPerson();
		assertNotNull(person);
		assertEquals(20, person.getPunkte());
		
	}

}

Nun könnte man eine konkrete Implementierung für PersonDao schreiben, welche auf eine "echte" Datenbank zeigt und dies im Context-file einfach festlegen ohne etwas am Code zu ändern. Die Klasse PersonService "weis" also gar nicht, was sich hinter PersonDao verbirgt. Braucht es auch nicht, es soll sich unabhängig von der Persistenzschicht um die eigentliche Logik kümmern. Das Persistieren übernimmt das Dao selbst für welches wir wiederum einen eigenen Testcontext bauen könnten. Als "echte" Datenbank im Testcontext könnte z.B. eine hsqldb dienen, die nur zur Laufzeit des Testcases im Speicher existiert um z.B. komplexere Abfragen zu testen. Aber nicht nur zum Testen ist es hilfreich. Man könnte ein und dieselbe Klasse in einem Richclient, einer Webapplikation oder einem Webservice laufen lassen und dabei je nach Umgebung konfigurieren.

Man kann das Beispiel jetzt noch weiter ausbauen. Z.B. läge es auf der Hand, die Businesmethoden von PersonService auch in ein Interface auszulagern und über die echte Implementierung im Contextfile einen Transaktionslayer einziehen.

Das Beispiel ist natürlich sehr einfach, aber ich hoffe man kann daraus erkennen in welche Richtung es geht. Auch größere Anwendungen mit vielen Entwicklern können mithilfe von Spring IoC/Di in sehr kleine Häppchen unterteilt werden und so den Überblick von überschaubarer Logik schaffen.

Ich hoffe, ich konnte ein wenig helfen.
Der Code ist übrigens getestet.

ms
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
MQue Spring beans Application Tier 10
M Spring DM: Problem mit Tomcat als OSGI-Service Application Tier 1
G Spring/Hibernate exception Application Tier 17
S Spring: Klassen in anderer "Anmelden" Application Tier 16
RaoulDuke Spring - Bugfixes in 2.5.x Application Tier 4
G Spring rollbackFor Application Tier 8
MQue Spring Security Form Application Tier 3
D Spring konfigurieren mit XML, Annotionen oder Java? Application Tier 2
MQue Spring in Zukunft Application Tier 5
I Passwort verschlüsseln in DB mit Spring Application Tier 5
MQue Spring https Application Tier 7
I Security bei Spring? Application Tier 31
I Wieviel Projekte bei Spring? Webprojekt Application Tier 2
G Transaktionen Spring Application Tier 58
Y Spring und Hibernate Application Tier 2
K Spring DI existierendes Objekt übergeben Application Tier 2
G Spring applicationContext Application Tier 3
MQue Spring Autowired Application Tier 7
MQue Spring Proxys Application Tier 2
D Problem beim Testen von einer Spring-Anwendung Application Tier 8
MQue Spring BeanFactoryPostProcessor Application Tier 3
MQue Spring ApplicationContext Application Tier 20
S Spring util:list in eine andere importieren Application Tier 15
MQue Einsatz von Spring Application Tier 13
M Konfiguration WebApp/Spring Host-abhängig Application Tier 5
E Migration altes Framework (SOFIA) auf Spring Application Tier 3
D Automatische Typkonvertierung in Spring Application Tier 5
D Spring und Hbernate konfigurieren bzw. verschalten Application Tier 5
A Spring: JSP nimmt style.css nicht an Application Tier 3
G Spring Security Frage fuer Fortgeschrittene Application Tier 2
Y Spring + MyFaces - Exception bei Serverstart Application Tier 1
Y Maven MyFaces Hibernate Spring - Projekt Application Tier 1
byte [Spring] Referenced Bean not found Application Tier 2
M Spring - Leichtgewichtiger als JBoss? Application Tier 4
D Spring: setter injection von statischer Methode? Application Tier 1
thE_29 Spring und XFire Frage Application Tier 3
H spring Application Tier 2
R Spring und Hibernate3 - CGLib Enhancement failed Application Tier 2
S Spring 2.0 Tutorial gesucht Application Tier 2
M JBoss Seam - Spring Application Tier 11
G [Spring+JSF]: VariableResolver und Scopes? Application Tier 1
L dynamisches Instanziieren von Beans Application Tier 6
N Asynchrone Services mit Message Driven Beans? Application Tier 5
M App auf EJB Stateless Beans umstellen - NPE Application Tier 4
S Context hochfahren, Beans ändern, Server starten?? Application Tier 4
D JSF Frage zu Synchronisation zwischen SessionScoped beans Application Tier 11
M EJB3 Annotations für Session Beans mit einem Parameter ? Application Tier 5
M Deployment Error: Verification of Enterprise Beans failed Application Tier 1
A 2 Stateless Beans 1 Local Interface? Application Tier 4
K Benutzer-Daten über mehrere Session-Beans Application Tier 14
F Lose Kopplung zwischen Session Beans Application Tier 4

Ähnliche Java Themen

Neue Themen


Oben