Podział aplikacji na warstwy + Spring

0

Witam. Czy za pomocą Javy i Springa da się stworzyć wspólny interfejs Dao dla różnych implementacji np.

public interface RecordDao {
	List<Record> getAll() throws Exception;
	void save(Record r) throws Exception;
}

a później klasy,implementacje np. RecordDaoHibernateImpl oraz RecordDaoTxtImpl. Zastanawia mnie to, bo zrobiłam sobie widok (korzystam z JFrame) z polem JTextField na ścieżkę pliku, który potem aplikacja będzie ładować. W warstwie Dao zrobiłam właśnie taki interfejs i implementacje korzystająca z plików txt/csv z polem private String filename;. I teraz gdy kontroler za pomocą actionListenera "wychwyci" ,że w widoku kliknięto przycisk ładuj, pobierze z widoku wpisaną ścieżkę -> nie mam pomysłu jak tą ścieżkę z kontrolera przekazać dalej. aby finalnie na samym dole użyć tekstowej implementacji RecordDaoTxtImpl skoro interfejs nie zawiera metody np. void setFilename(String filename);.

<bean id="RecordDao" class="dao.RecordDaoTxtImpl">
	<property name="filename" value="#{view.MainWindow}" />
</bean>

czy to wgl ma sens? proszę o wyrozumiałość, jestem newbie ;p

1

Ale jaki dokładnie jest cel tego interface'u ? Bo jego zachowanie(tego dao ?) powinno zależeć od implementacji a nie od tego jakiej klasy jest.

1

@karolinaa no wstrzyknąć w ten sposób to ty nie możesz. Wstrzykiwanie dzieje się w trakcie tworzenia obiektów a ty chcesz ustawić property dużo później.
Poza tym:

  1. Zrób osobny interfejs dla każdej encji. Inaczej ten twój interfejs będzie mało przydatny bo wstrzykiwanie obiektów które go implementują będzie trudniejsze. No i utrudni to stosowanie na przykład @Transactional
  2. Czemu piszesz jakieś własne datasource oparte o txt/csv? Nie mogłaś użyć HSQL?
0

Dobra: aplikacja pozwala wczytać studentów z pliku bądź z bazy MySQL i mam w dao dwie klasy np.: StudentDaoImpl która obsługuje baze MySQL (z pomocą hibernate) oraz StudentDaoMyFormatImpl implementację używającą plik mojego formatu. Te klasy powinny implementować jeden wspólny interfejs (np. StudentDao) np;

package dao;
import model.Student;
import java.util.List;

public interface StudentDao {
	void save(Student student);
	Student get(final int id);
	List<Student> getAll();
	void delete(Student student);
	void update(Student student);
}

czy powinnam zrobić do tego dwa osobne interfejsy? Z tego co zrozumiałam to drugie, ale chcę się upewnić. myślałam, że robi się jeden interfejs żeby można było używać różnych implementacji nie naruszając reszty aplikacji wyżej, ale o ile parametry dot. bazy danych mogę wstrzyknąć to ścieżki do pliku aby użyć StudentDaoMyFormatImpl (którą to pobieram od użytkownika z widoku) nie ;c do tego dochodzi jeszcze, że chce żeby użytkownik sobie wybrał w jaki sposób chce wczytać studentów.

@Shalom to bardzo mała apka jako ćwiczenie i chcę mieć format, który mogę sobie edytować w notatniku. bardziej chodzi mi właśnie o takie problemy niż samo działanie aplikacji.

1

Pytanie czy chcesz mieć aktywne w aplikacji oba DAO naraz czy tylko jedną wersję.
Jeśli dwa, to raczej powinnaś stworzyć fabrykę / budowniczego który zwraca odpowiednie DAO w zależności od typu żądania.
Jeśli tylko jedno DAO jest aktywne, to robisz tak pewnie jak robiłaś - bean o typie *Impl, filename ustawione przez wstrzykiwanie, kod kliencki czyta beana jako Object i castuje na interfejs.

(tak mi się wydaje)

1

@karolinaa nie no dwa interfejsy byłyby bez sensu, ale w takiej sytuacji musisz INICJALIZOWAĆ źródło danych analogicznie. Skoro w przypadku korzystania z bazy danych robisz to od razu przy starcie to rób tak samo w przypadku tego pliku. Na przykład przez parametr uruchomienia programu albo plik konfiguracyjny.
Bo chcesz mieć spójny interfejs a jednocześnie masz różne zachowanie, a tak sie nie da.

0

Chciałabym właśnie aby głównie appka obsługiwała ładowanie z pliku, żeby użytkownik w widoku z JFrame mógł sobie kliknąć File->Load Students from file i załadować studentów z wybranego pliku. nie znam ścieżki wcześniej, więc wstrzyknąć tak jak jdbc.properties nie mogę ;. jeżeli Springiem nie mogę się poratować to coś jeszcze mi zostaje oprócz stworzenia osobnego interfejsu (tak aby przekazać ścieżkę do tego Dao) ? (nie zależy mi na najmniej czasochłonnym rozwiązaniu tylko najlepszym)

+mam jeszcze pytanie z innej beczki:
jeżeli widok może korzystać z różnych serwisów to czy do widoku wstrzykiwać je Springiem czy raczej w widoku powinnam użyć konstrukcji typu StudentService studentService = (StudentService)appCtx.getBean("studentService"); ? bo póki co tylko raz wykorzystałam tą konstrukcję w main'ie, który wygląda tak <facepalm>

ApplicationContext appCtx =
				new ClassPathXmlApplicationContext("resources/applicationContext.xml");
		MainWindow mainWindow = (MainWindow)appCtx.getBean("mainView");
		mainWindow.setVisible(true);

(oczywiście zaznaczam, że mam widok okienkowy JFrame a nie "webowy". trochę zerknęłam na tutoriale w internecie i wszędzie pokazują bodajże widok "webowy". Póki co przez to mam same problemy, muszę chyba zacząć od czytania jakiś mądrych książek, bo chce nauczyć się podstaw robiąc aplikację desktopową zarządzającą grupą studentów a przez brak tutka z MVC && Spring && JFrame View mam mindfucka

1

No możesz jeszcze zrobić taki myk:

  • Springowy Singleton bean "Configuration"
  • a w interfejsie coś w stylu "initializeDataSource" które dla tej plikowej bazy pobierze sobie dane z Configuration ;]

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