#Niezbędnik Juniora. Adnotacje

By 15 kwietnia 2015Niezbędnik Juniora

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

#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 oznacza­my.

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 pro­gra­mu.

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że­cie).



@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 adno­tac­ja.

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 val­ue.

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 adno­tacji.


@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 stereo­typy:

  • @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 .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 biz­ne­sowej
@Repository — wskazu­je DAO w warst­wie prze­chowywa­nia danych
@Controller — wskazu­je kon­trol­er w warst­wie prezen­tacji

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 DataAc­ces­sEx­cep­tions.

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 pochodze­nie:

  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 frame­work.

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 adno­tacji:


@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 inter­fe­jsó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 prob­lemach

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

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

@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ę kon­trol­era

@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 zmi­en­nej

@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 uruchami­a­nia

@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ą wyco­fane.

@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 adno­tac­ja­mi.

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!

  • 3
  •  
  •  
  • 9
  •  
  • Heheszek

    Bard­zo pomoc­ne:)

  • Gosc

    Mam pytanie, co tak na prawdę robi Autowired? Rozu­miem ze w przy­pad­ku kon­fig­u­racji xmlowej pozwala to troche skro­cic kod i zau­tomaty­zowac wstrzyki­wanie, ale moza to jakos wytlumaczyc?
    Poz­draw­iam

    • Autowired ‘infor­mu­je’ Springa, że to pole lub kon­struk­tor powin­no zostać przez niego uzu­pełnione odpowied­nim obiek­tem. Dzi­ała to zarówno do kon­fig­u­racji XMLowej jak i za pomocą kodu w Javie. W lekcji powyżej trochę bliżej opisu­je­my jak dzi­ała ta adno­tac­ja, ale zachę­camy też do prze­jrzenia doku­men­tacji Springa o IoC — tam zna­jdziesz dokład­ną zasadę dzi­ała­nia wraz ze wszys­tki­mi szczegóła­mi tech­niczny­mi. Czy to trochę roz­jaś­nia ideę? :)

  • Ola

    Fajny wpis :) Moim zdaniem ten blog jest najlep­szy nie tylko w “pol­skim internecie” ale również zagranicznym. Poma­ga zacząć przy pro­gramowa­niu aplikacji webowych. Później już mając pod­stawy moż­na samemu szukać bardziej zaawan­sowanych aspek­tów.

  • Michał

    super blog, super kurs — nie tylko dla kobi­et :P

    • Dzię­ki! A kurs jak i samo pro­gramowanie jest dla wszys­t­kich, jak to kiedyś ktoś ład­nie powiedzi­ał kod nie ma płci! Powodzenia w pro­gramisty­cznym roz­wo­ju!