Prośba o wyjaśnienie kodu.

0

Działam sobie pewien tutorial i zastanawia mnie jedna rzecz. Wrzuce dwie klasy i interfejs i jakby ktoś był tak miły i wyjaśnił mi :
Dlaczego w klasie StudentBean powstała zmienna

 private StudentService studentService;

gdzie StudentService jest tylko interfejsm w którym są dwie metody.

Interfejs StudentService:

 
package pl.konrad.student.service;

import java.util.List;

import pl.konrad.student.model.Student;

public interface StudentService {

public void addStudent(Student student);
public List<Student> findAll();
}

Klasa StudentServiceImple:

package pl.konrad.student.service;


@Service("studentService")
@Transactional
public class StudentServiceImpl implements StudentService
{
	
	@Autowired
	private SessionFactory sessionFactory;

	@Override
	public void addStudent(Student student) {
		sessionFactory.getCurrentSession().save(student);	
		
	}

	@Override
	public List<Student> findAll() {
		
		return sessionFactory.getCurrentSession().createQuery("fron Student").list();
	}

}
 

StudentBean:

package pl.konrad.beans;

import java.util.List;

import javax.faces.bean.ManagedBean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;

import pl.konrad.student.model.Student;
import pl.konrad.student.service.StudentService;

@ManagedBean
@Scope
public class StudentBean {

@Autowired
private StudentService studentService;
	
	
private List<Student> listStudents;

public List<Student> getListStudents() {
	listStudents = studentService.findAll();
	return listStudents;
}

public void setListStudents(List<Student> listStudents) {
	this.listStudents = listStudents;
}	
	


}

 
0

Kontener IOC (w tym przypadku Spring) automatycznie tworzy obiekty opatrzone odpowiednimi adnotacjami (np. Service) a następnie we wszystkich zarządzanych obiektach (czyli innych serwisach, managed beanach itd) szuka adnotacji autowire/inject i ustawia wartości dla takich referencji. Jeśli Spring zna tylko jeden obiekt implementujący dany interfejs to go tam wstrzyknie. Jakbyś miał więcej niż jeden taki obiekt to wysypie sie z informacją że nie wie który należy tam ustawić.

0

Czyli zamiast tworzyc nowy obiekt

 public class StudentServiceImpl implements StudentService

można oznaczyć ta klasę @Service i wstrzykiwać do innych klas, managed beanow itp... wystarczy wrzucic zmienna do innej klasy i oznaczyc

 
@Autowired
private ....

Dobrze ja to rozumiem ?

0

Tak. Niemniej bierz pod uwagę że NIE KAŻDY obiekt nadaje się na takiego wstrzykiwanego beana. Nadają się głównie singletonowe serwisy / repozytoria. Na przykład klasy DAO umożliwiające dostęp do bazy danych etc.

Przy okazji: warto używać standardowych javowych adnotacji, tzn np. @Named i @Inject.

0

Pozwolę sobie podpiąć się pod temat

@Shalom - napisałeś, że nie każdy obiekt nadaje się na takiego wstrzykiwanego beana [...] Na przykład klasy DAO umożliwiające dostęp do bazy danych etc. - dlaczego DAO się nie nadaje?

Pytam, bo jestem na etapie projektowania aplikacji na zaliczenie z Technologii Obiektowych i mój misterny plan przewidywał właśnie wstrzykiwanie DAO w różne miejsca:) Chciałbym wiedzieć dlaczego się tego nie robi.

Aplikacja, którą projektuje to ma być desktopowy system do rejestracji czasu pracy członków grupy projektowej. Poza klasami reprezentującymi encje biznesowe (Projekt, Zadanie, Aktywność, itp...) i właśnie DAO do zapisu/odczytu z bazy danych chciałem logikę biznesową wrzucić do jakichś klas typu Service, np. ProjectService, i tam właśnie wstrzyknąć DAO - czy takie podejście ma sens, czy to nie jest nadmierne mnożenie klas? Jeśli to bez sensu to prosiłbym o jakąś podpowiedź gdzie umieszcza się logikę biznesową w tego typu aplikacji?

1

Źle mnie zrozumiałeś ;) DAO się nadają właśnie. Nie nadaja się "zwykłe" obiekty. A wiem że czasem ludzie wpadają w taki "szał IOC" i wszystko chcą wszędzie wstrzykiwać. Co oczywiście można czasem zrobić, ale jeśli wszystko jest stateless a wszystkie dto są immutable ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1