#Niezbędnik Juniora. Adnotacje

By 15 April 2015 September 1st, 2015 Niezbędnik Juniora

No to zaczy­namy! Dzisiejszy niezbęd­nik odpowie na najważniejsze pyta­nia związane z adnotacjami.

#Niezbędnik Juniora

Niezbęd­nik junio­ra to seria, która ma pomóc Ci w uporząd­kowa­niu i sprawdze­niu wiedzy np. przed roz­mową kwal­i­fika­cyjną. Staramy się w prosty sposób odpowiedzieć na potenc­jalne pyta­nia, a także dać Ci odpowied­nie odnośni­ki do bardziej szczegółowych artykułów. W cyk­lu postaramy się prze­jść przez najważniejsze zagad­nienia związane z Javą, Springiem i aplikac­ja­mi webowy­mi, pod­stawa­mi pra­cy z baza­mi danych czy repozy­to­ri­a­mi na git. Nie będą to jed­nak pełne lekc­je, a raczej pigułkowe opra­cow­a­nia w sam raz na uporząd­kowanie wiedzy.

Każdy odcinek skła­da się z pytań, na które postaramy się odpowiedzieć, a cza­sem kilku zadań dla Ciebie związanych z zagad­nie­niem. Zachę­camy do zadawa­nia dodatkowych pytań w komen­tarzach postaramy się na nie odpowiedzieć.

#Adnotacje

Co to jest adnotacja?

Za doku­men­tacją Javy: Adno­tac­je to metadane (a więc dane o danych — w naszym przy­pad­ku dane o kodzie), która dostar­cza­ją nam takich infor­ma­cji o pro­gramie, które nie są częś­cią tego pro­gra­mu (same w sobie). Adno­tac­je nie mają bezpośred­niego wpły­wu na kod, który nimi oznaczamy.

Są one uży­wane np. przez frame­work przy uruchami­a­n­iu naszego pro­gra­mu by w odpowied­ni sposób inter­pre­tować nasz kod.

Dzi­ałanie adno­tacji opiera się na mech­a­nizmie reflek­sji, czyli pro­ce­sowi, który pozwala m.in. na zdoby­wanie infor­ma­cji o klasach w trak­cie wyko­na­nia programu.

Jak wyglądają adnotacje w Javie?

Przykład­owy kod z adno­tac­ja­mi zna­jdziecie poniżej (jeśli widzieliś­cie nasze lekc­je Javy na pewno bez prob­le­mu je wskażecie).



@Controller
public class LoginController
{
    @RequestMapping( value = "/login", method = RequestMethod.GET )
    public String login()
    {
        return "login";
    }
}

Adno­tac­je zaczy­na­ją się od @, która wskazu­je kom­pi­la­torowi — że to adnotacja.

Adno­tac­je mogą zaw­ier­ać w sobie dodatkowe infor­ma­c­je np. (name=„books”), które poda­je­my w naw­iasie, na zasadzie nazwa=wartość, a jeśli mamy ich kil­ka, to może­my je podać po przecinkach. Jeśli podamy samą wartość to Java uzna, że chodz­iło nam o pole o nazwie value.

Java 8 wspiera umieszczanie adno­tacji „wszędzie”(tj. nad klasa­mi, meto­da­mi, nad pola­mi oraz przed argu­men­ta­mi metod). Poniżej przykład­owe umieszczenia adnotacji.


@NotNull String name;
List<@NotNull String> names;
class UnmodifiableList implements @Readonly List<@Readonly T> {...}
email = (@Email String) input;
new @Information MyObject();
void doSomething() throws @ImportantForMe MyException { ... } 

 

Jak działają adnotacje w Springu?

W najprost­szym rozu­mie­niu adno­tac­je to wskazów­ki dla Springa w jaki sposób ma trak­tować poszczególne metody, klasy, pola i  dzię­ki temu jest w stanie samodziel­nie tworzyć beany (czyli obiek­ty, który­mi zarządza — więcej o beanach poczy­tasz w naszej lekcji), wstrzyki­wać je (czyli to, co robi @Autowired), wery­fikować zabez­pieczenia (@Secured, @PreAuthorize, @PostAuthorize).

Adno­tac­je które doda­je­my przed klasę nazy­wamy w Springu stereo­ty­pa­mi i są one swego rodza­ju “flagą”, która mówi Springowi, że obiekt danej kasy ma być zarządzany przez niego jako bean, a poszczególne typy stere­po­typów mogę mieć też spec­jalne znacze­nie dla Springa.

Wyróz­ni­amy cztery pod­sta­wowe stereotypy:

  • @Component,
  • @Service
  • @Repository
  • @Controller

Jaka jest różnica pomiędzy @Component, @Service, @Repository, @Controller?

@Component  jest pod­sta­wowym stereo­typem dla każdego z kom­po­nen­tów, który­mi ma zarządzać Spring. Adno­tac­ja ta jest równoważ­na z <bean>.Każdy inny stereo­typ dziedz­iczy włas­nie po @Component.

Oznacza to, że @Service, @Repository, @Controller to tak naprawdę adno­tac­ja @Component z dodatkowy­mi infor­ma­c­ja­mi. I tak:

@Service — wskazu­je ser­wis w warst­wie logi­ki biznesowej
@Repository — wskazu­je DAO w warst­wie prze­chowywa­nia danych
@Controller — wskazu­je kon­trol­er w warst­wie prezentacji

Dodatkowo, @Repository ze Spring-data  tworzy dynam­icznie klasę (bo ta adno­tac­ja jest nad inter­fe­jsem), która obsługu­je bazę danych wykonu­jąc zapy­ta­nia, które generu­je na pod­staw­ie nazw metod tego inter­fe­j­su. Powodu­je też, że wyjąt­ki związane z bazą danych są zamieni­ane na Springowe DataAccessExceptions.

Jaka jest różnica pomiędzy @Autowired, @Inject, @Resouces?

Wszys­tkie te adno­tac­je służą do wstrzyki­wa­nia obiek­tów. Pier­wszą różnicą między nimi jest ich pochodzenie:

  1. @Resource – zdefin­iowany w javax.annotation, który jest paki­etem Javy
  2. @Inject – zdefin­iowany w  javax.inject pack­age, który jest paki­etem Java
  3. @Autowired – zdefin­iowany w pakiecie org.springframework.bean.factory, który jest częś­cią Spring framework.

Spring wprowadz­ił obsługę adno­tac­je @Resouce i @Inject by umożli­wić pracę z aplikac­ja­mi Java EE.

@Autowired i @Inject dzi­ała­ją  dokład­nie tak samo.

Ist­nieje dyskret­na różni­ca pomiędzy dzi­ałaniem @Autowired(@Inject) i @Resource, a mianowicie róż­nia się one kole­jnoś­cia dobiera­nia pasu­ją­cych obiek­tów (po szczegóły odsyłam do mate­ri­ałów dodatkowych, bo to już trochę niuans [5]).

Jaka jest zależność pomiędzy @Autowired oraz xmlem?

Może­my stowrzyć plik bean.xml, w którym będziemy ręcznie tworzyć beany. Przykład­owa deklarac­ja beana zna­j­du­je się poniżej.

<bean id="teslaCat" class="teslaCat">
<property name="food" ref="food" />
</bean>

Co jest równoważne z umieszcze­niem następu­ją­cych adnotacji:


@Component
public class TeslaCat{
@Autowired
private Food food;
@Required
public void set Food(Food food) {
this.food = food;
}

Jakie jeszcze adnotacje możesz kojarzyć?

@Override — uży­wana do oznacza­nia imple­men­tacji metod z interfejsów

@Valid — uży­ta w kon­trol­erze przy atry­bu­cie metody powodu­je, że obiekt ten jest trak­towany jako for­mu­la­rz i uruchami­ana jest jego wal­i­dac­ja (np. na pod­staw­ie poniższych adno­tacji). Kole­jny argu­ment metody po tym musi być typu Bind­in­gRe­sult — tam Spring umieś­ci infor­ma­c­je o problemach

@NotNull — pole musi mieć wartość(nie może być nullem)

@NotBlank — pole nie może być czyste (np. wypełnione tylk biały­mi znakami)

@NotEmpty — pole nie może być puste

@Email — pole zaw­iera poprawny (od strony skład­ni, niekoniecznie ist­nieją­cy!) adres email

@RequestMapping — mapu­je adres URL i/lub metodę HTTP na metodę kontrolera

@ResponseBody — Spring stara się przek­sz­tał­cić zwró­cone wartoś­ci w odpowiedź http (np. kon­wer­tu­jąc obiekt na for­mat JSON lub XML)

@RequestBody, Spring  stara się przek­sz­tał­cić treść przy­chodzącego żąda­nia w obiekt, np. kiedy chce­my otrzy­mać dane JSON i automaty­cznie je zamienić na obiekt.

@RequestParam — pozwala pobrać wartość para­metru przekazy­wanego w adresie url np. “?userId=5”, do zmiennej

@PathVariable — obsługu­je zmi­en­ną przekazaną w postaci frag­men­tu adresu url np. user/5 (user/{userId})

@Required — sprawdza, czy dane pole zostało ustaw­ione (czy Spring wstrzyknął mu wartość) pod­czas uruchamiania

@Transactional — Pozwala zgrupować wiele czyn­noś­ci w ramach jed­nej transakcji bazy danych. Dzię­ki temu w przy­pad­ku niepowodzenia jed­nej z nich, pozostałe zostaną wycofane.

@Entity — Adno­tac­ja, która mówi o tym, że ta klasa jest zarządzana przez JPA i odpowia­da tabeli w bazie danych

@Table — Dzię­ki tej adno­tacji może­my określić dodatkowe para­me­try związane z tabelą bazy danych, którą ta klasa reprezen­tu­je. Może­my określić np. nazwę.

@Column — Ana­log­icznie do @Table, ale pozwala nam określać atry­bu­ty kol­umn w tabeli w bazie danych, np. ich typ, dłu­gość, nazwę.

Na dziś to tyle…

Zachę­camy do zadawa­nia dodatkowych pytań związanych z adnotacjami.

Licencja Creative Commons

Jeśli uważasz powyższą lekcję za przy­dat­ną, mamy małą prośbę: pol­ub nasz fan­page. Dzię­ki temu będziesz zawsze na bieżą­co z nowy­mi treś­ci­a­mi na blogu ( i oczy­wiś­cie, z nowy­mi częś­ci­a­mi kur­su Javy). Dzięki!