2010-11-15 17 views
5

W innym numerze question zadałem pytanie, że struktura wiosna nie jest bezpieczna. Czy jest to prawda, czy naprawione i czy możesz podać przykład, co to dokładnie oznacza?to wiosenna wersja 3.0, bezpieczna dla typów

+0

To pytanie byłaby dużo bardziej pomocne, jeśli lepiej zdefiniowane, co oznaczało według typu bezpieczny, czego szukasz w ramach DI itp –

+0

@matt B - prosił pytanie ("to, co jest typu-safe ") do osoby, która powiedziała, że ​​wiosna nie jest bezpieczna, w połączonym pytaniu. Ale odpowiedź nie została otrzymana, stąd to pytanie. – Bozho

+0

ah Widzę, teraz ma więcej sensu. Usunąłem moje poparcie –

Odpowiedz

7

Przede wszystkim, co oznacza "bezpieczny dla typu" oznacza dla schematu wtrysku zależności. Mogę myśleć o tym, że można pobrać komponent bean z kontekstu, określając typ, a nie tylko nazwę komponentu bean. Spring 3 pozwala na to.

W przeciwnym razie, bezpieczeństwo typu oznacza, że ​​kiedy można zdefiniować zależności według ich typu. I możesz to zrobić we wszystkich wersjach wiosny.

Kolejną kwestią jest bezpieczeństwo podczas kompilacji. Ze sprężyną pre-3.0, kiedy trzeba było rozróżnić dwa ziarna, które mają ten sam interfejs (lub nadmiarowy), używając nazwy opartej na łańcuchach. Wiosną 3.0 można używać kwalifikatorów opartych na adnotacjach (przy użyciu javax.inject.Qualifier), więc jest to również bezpieczniejsze w czasie kompilacji.

Należy jeszcze wspomnieć o zastosowaniu leków generycznych. Możesz mieć na przykład wiosnę @Inject List<MyService>.

1

To zależy od tego, jak go używasz i co masz na myśli, mówiąc o bezpiecznym typie (patrz odpowiedź Bozho, aby uzyskać więcej informacji na temat tego ostatniego): jeśli użyjesz konfiguracji xml do produkcji swoich ziaren, to prawdopodobnie będziesz bezpieczny po uruchomieniu.

Jeśli jednak używasz nowej konfiguracji Java Bean (która ma swoje własne ograniczenia), uzyskasz bezpieczeństwo podczas kompilacji.

Nie jestem zwolennikiem tego drugiego nad pierwszym, ale jest to coś do rozważenia.

2

Definiowanie niestandardowego adnotacji przy użyciu @Qualifier

Aby zidentyfikować wstrzykuje fasoli bez określania nazwy, musimy utworzyć niestandardowe adnotacji. Jest to procedura równoważna z użyciem adnotacji JSR 330 (Inject) w CDI.

@Target({ElementType.Field, ElementType.Parameter}) 
@Retention(RetentionPolicy.RUNTIME) 
@Qualifier 
public @Interface Student { 
} 

teraz przypisać ten niestandardowy adnotacji do realizacji EntityDao interfejsu

@Component 
@Student 
public class StudentDao implements EntityDao { 
} 

@Component mówi sprężynę tej definicji fasoli. @ Adnotacja studyjna jest używana przez Spring IoC do identyfikacji realizacji StudentDao jako EntityDao przy każdym użyciu odwołania do EntityDao. Wstrzyknij fasolę za pomocą @Autowired i custom qualifier Coś takiego.

@Autowired 
@Student 
private EntityDao studentDao; // So the spring injects the instance of StudentDao here. 

W ten sposób mniej używa się nazw łańcuchów, które mogą być błędnie napisane i trudniejsze w utrzymaniu. - Uważam, że ten post jest bardzo przydatny. http://www.coolcoder.in/2011/08/how-to-use-type-safe-dependency.html

Powiązane problemy