Aplikačný rámec Spring. Róbert Novotný.

Similar documents
VYLEPŠOVANIE KONCEPTU TRIEDY

Databázové systémy. SQL Window functions

Databázy (1) Prednáška 11. Alexander Šimko

Aplikačný dizajn manuál

Obsah. SOA REST REST princípy REST výhody prest. Otázky

Spájanie tabuliek. Jaroslav Porubän, Miroslav Biňas, Milan Nosáľ (c)

Informatika 2. Generiká

SPRING MOCK TEST SPRING MOCK TEST I

A Lightweight Java Container

Továrne na všetko ÚINF/PAZ1c (Róbert Novotný) a asociácie

1 Komplexný príklad využitia OOP

4. Interfejsy, továrne

Registrácia účtu Hik-Connect

Entity Framework: Úvod

Inversion of Control (IoC) and Dependency Injection (DI) in Spring

CONFIGURING A SPRING DEVELOPMENT ENVIRONMENT

Spring Interview Questions

kucharka exportu pro 9FFFIMU

Fast Track. Evaluation Copy. to Spring 3.x. on Eclipse/Tomcat. LearningPatterns, Inc. Courseware. Student Guide

Anycast. Ľubor Jurena CEO Michal Kolárik System Administrator

Chapter 13. Hibernate with Spring

TP-LINK 150Mbps Wireless AP/Client Router Model TL-WR743ND Rýchly inštalačný sprievodca

Dan Hayes. October 27, 2005

Sitesbay.com. A Perfect Place for All Tutorials Resources. Java Projects C C++ DS Interview Questions JavaScript

Copyright Descriptor Systems, Course materials may not be reproduced in whole or in part without prior written consent of Joel Barnum

Copyright 2016 by Martin Krug. All rights reserved.

systemove programovanie win32 programovanie

package balik; public class TopLevel1 {... }

Spring Framework. Christoph Pickl

Výnimky znovu útočia

Just Spring Madhusudhan Konda

Spring framework was initially written by Rod Johnson and was first released under the Apache 2.0 license in June 2003.

Introducing the Spring framework

Core Capabilities Part 3

prest framework pre webové aplikácie a služby

Advanced Web Systems 5- Designing Complex Applications. -The IOC Pattern -Light Weight Container. A. Venturini

Triedy v C++ 1. Úvod do tried

Xamarin písanie Android a ios aplikácií v C#

Dependency Injection and Spring. INF5750/ Lecture 2 (Part II)

Fast Track to Spring 3 and Spring MVC / Web Flow

XML SCHEMA BASED AOP WITH SPRING

Základná(umelecká(škola(Jána(Albrechta Topoľčianska(15

Spôsoby zistenia ID KEP

Dependency Injection. Kenneth M. Anderson University of Colorado, Boulder Lecture 30 CSCI 4448/ /08/11

Metadata driven component development. using Beanlet

Spring JavaConfig. Reference Documentation. version 1.0-m Rod Johnson, Costin Leau. Copyright (c) Interface21

New Features in Java language

Poradové a agregačné window funkcie. ROLLUP a CUBE

Spring and Coherence Recipes

is Introduction to Spring 5 and JPA 2

Analýza Java 0-day (CVE )

7 Reasons to use Spring. Arjen Poutsma SpringSource

SPRING FRAMEWORK ARCHITECTURE

ADVANCED JAVA TRAINING IN BANGALORE

Embrace Factories Factories. By Rob Gonda

Microsoft Azure platforma pre Cloud Computing. Juraj Šitina, Microsoft Slovakia

Programovanie v jazyku Python. Michal Kvasnica

Desarrollo de Aplicaciones Web Empresariales con Spring 4

Spring Soup with OC4J and MBeans

LL LED svietidlá na osvetlenie športovísk. MMXIII-X LEADER LIGHT s.r.o. Všetky práva vyhradené. Uvedené dáta podliehajú zmenám.

JAVA. Aspects (AOP) AspectJ

Ochrana koncových staníc pomocou Cisco Security Agent 6.0. Ľubomír Varga.

Objektovo-orientované programovanie

Návrhové vzory. Poznámky k prednáškam z predmetu Objektovo-orientované programovanie. Valentino Vranić.

Web Application Development Using Spring, Hibernate and JPA

Princípy tvorby softvéru Dizajnové princípy

Rýchlosť Mbit/s (download/upload) 15 Mbit / 1 Mbit. 50 Mbit / 8 Mbit. 80 Mbit / 10 Mbit. 10 Mbit / 1 Mbit. 12 Mbit / 2 Mbit.

Využití technologie Angular2 při vývoji webových aplikací. Bc. Juraj Štefan

Introduction to Web Application Development Using JEE, Frameworks, Web Services and AJAX

Databázy (1) Prednáška 08. Alexander Šimko

Java Persistence API v príkladoch z Hibernate

Portál pre odborné publikovanie ISSN

Prednáška 4: Modelovanie štruktúry v UML

Spring Framework 2.5: New and Notable. Ben Alex, Principal Software Engineer, SpringSource

Web Application Development Using Spring, Hibernate and JPA

Jazyk SQL. Jaroslav Porubän, Miroslav Biňas, Milan Nosáľ (c)

UINF/PAZ1c epizóda 6

Komunikačné protokoly 2005 KP 2005 #3 - IP v02.doc

@ASPECTJ BASED AOP WITH SPRING

D.Signer prostriedok pre vytváranie zaručeného elektronického podpisu. Inštalačná príručka

OLYMP na MS SQL OBSAH 1 AKO POSTUPOVAŤ. 2 INŠTALÁCIA Microsoft SQL Servera 2008 R2 3 PREVOD DATABÁZY OLYMPU NA SQL

1 História Web aplikácií

Web Application Development Using Spring, Hibernate and JPA

Algoritmy deterministickej a stochastickej optimalizácie a ich počítačová realizácia

Struts: Struts 1.x. Introduction. Enterprise Application

Modelovanie štruktúry

SYSTÉM NA EVIDENCIU A KATEGORIZÁCIU

Introduction to Spring Framework: Hibernate, Spring MVC & REST

Spring Dependency Injection & Java 5

Java EE Application Assembly & Deployment Packaging Applications, Java EE modules. Model View Controller (MVC)2 Architecture & Packaging EJB Module

Introduction to Spring 5, Spring MVC and Spring REST

OSGi & Spring combined

VYHLÁSENIE O PARAMETROCH

Business Logic and Spring Framework

SPEL INJECTION. Alexandr (WebR0ck) Romanov

What is Dependency Injection (DI) and. Inversion of Control (IoC)?

REPORT DESIGNER 1 VYTVORENIE A ÚPRAVA FORMULÁRA. úprava formulárov v Money S4 / Money S Vytvorenie formulára

Introduction to the Spring Framework

Refaktorovanie jazyka JavaScript a DHTML

JAVA. 1. Introduction to JAVA

Transcription:

Róbert Novotný robert.novotny@upjs.sk

Krátka história Springu Rod Johnson Expert One on One: J2EE Design and Development (2001) ako sa vysporiadať s problémami vývoja enterprise aplikácií? dajú sa problémy riešené pomocou J2EE technológií implementovať inak?

Spring riešenie problémov J2EE Riešenie: Spring Framework 2001 prvá verejná verzia 2008 verzia 2.5 plán 2009 verzia 3.0 čistá Java 5, prekopanie MVC

Čo je vlastne Spring? kontajner pre komponenty tvoriace systém podpora konfigurácie a životného cyklu komponentov aplikačný rámec vzťahy medzi komponentami deklaratívna konfigurácia,,švajčiarsky armádny nôž"

Čo je vlastne Spring? podpora dependency injection asociácie a väzby medzi objektami sú konfigurované zvonku podpora aspektovo orientovaného programovania nebudeme sa venovať dôraz na malú veľkosť a neintruzívnosť prítomnosť Springu by mala byť v systéme čo najnenápadnejšia pokiaľ možno, používať POJO

Základné moduly Springu

Návrhový vzor dependency injection pivný bar čapuje pivo komponenty systému: pivné sudy ako poskytovateľ piva pípa priamy dodávateľ piva do pohárov

Návrhový vzor dependency injection Bar potrebuje na načapovanie piva službu, ktorá mu bude dodávať pivo. V implementácii si ju môže nájsť sám.

Návrhový vzor dependency injection public class Bar { private KegBeerProvider provider; public Bar() { provider = new KegBeerProvider(); public Beer tapbeer() { provider.fetchbeer(); Bar si nájde poskytovateľa piva sám.

Návrhový vzor dependency injection problémy: krčma chce prejsť na pivo čapované z tanku (väčšia kvalita piva, netreba meniť sudy...) všetky výskyty KegBeerProvider je treba nahradiť TankBeerProvider om riešenie: inversion of control Bar si nebude hľadať,,službu", čo mu bude dodávať pivo, sám, ale bude mu nastavená zvonku

Návrhový vzor dependency injection public static void main(...) { KegBeerProvider provider = new KegBeerProvider(); Bar bar = new Bar(); bar.setprovider(provider); hollywoodsky princíp nevolajte nás, my vám zavoláme. komponent (bar), ktorý potrebuje nejakú službu (pivo) si ju nenastaví sám, ale nastaví mu ju niekto iný

Návrhový vzor dependency injection public static void main(...) { KegBeerProvider provider = new KegBeerProvider(); Bar bar = new Bar(); bar.setprovider(provider); Čo ak chceme prejsť na pivo z tanku? public static void main(...) { TankBeerProvider provider = new TankBeerProvider(); Bar bar = new Bar(); bar.setprovider(provider); syntaktická chyba

Programovanie cez interfejsy Čo ak chceme prejsť na pivo z tanku? Zásada: pokiaľ je to možné, využívame interfejsy, nie konkrétne implementácie program to interfaces List alist = new ArrayList(); AServiceInterface service = new ServiceImplementation();

Programovanie cez interfejsy program to interfaces vytvoríme interface BeerProvider «interface» BeerProvider +fetchbeer() KegBeerProvider TankBeerProvider

Programovanie cez interfejsy public class Bar { private BeerProvider provider; public void setbeerprovider(beerprovider p) { public static void main(...) { BeerProvider provider = new KegBeerProvider(); Bar bar = new Bar(); bar.setbeerprovider(provider); interfejs implementácia

Spring aplikačný kontext aplikačný kontext: reprezentuje množinu vzájomne prepojených komponentov manažovaných kontajnerom komponenty sú definované a špecifikované deklaratívne, typicky pomocou XML

Spring aplikačný kontext <beans> <bean id="beerprovider" class="sk.beer.kegbeerprovider" /> <bean id="bar" class="sk.beer.bar"> <property name="provider" ref="beerprovider" /> </bean> </beans> definujeme 2 komponenty a ich vzájomné prepojenie komponenty odteraz nazývané beanami (beans) prepájanie wiring

Základné triedy pre aplikačný kontext org.springframework.beans.factory.beanfactory kontajner pre beany, podpora ich životného cyklu toto je interfejs, existuje viacero užitočných implementácií org.springframework.context.applicationcontext konfigurácia kontajneru na základe XML a pod., načítavanie prostriedkov (konfiguračné súbory,.properties súbory...) z ľubovoľného zdroja, rozosielanie udalostí, internacionalizácia org.springframework.context.support.classpathxmlapplicationcontext načítavanie XML z CLASSPATH, naštartovanie kontajnera

Príklad použitia kontajneru Spring ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); Bar bar = (Bar) ctx.getbean("beerprovider"); ctx.close(); //zatvorenie kontextu bean vytiahneme z kontextu pomocou getbean() Spring automaticky dodá do baru inštanciu beerprovider a

Spring aplikačný kontext ak chceme prejsť na pivné tanky, stačí zmeniť názov triedy v XML aplikačného kontextu programujeme do interfaceov, zmenou triedy sa vymení implementácia v kóde netreba zmeniť nič <bean id="beerprovider" class="sk.beer.kegbeerprovider" /> <bean id="beerprovider" class="sk.beer.tankbeerprovider" />

Spring aplikačný kontext <beans> <bean id="beerprovider" class="sk.beer.kegbeerprovider" /> <bean id="bar" class="sk.beer.bar"> <property name="provider" ref="beerprovider" /> </bean> </beans> Spring vytvorí pre každú triedu jeden objekt (zavolá implicitný konštruktor) a zaregistruje ich v kontajneri pre bar navyše zavolá setprovider(), kde do parametra dosadí inštanciu KegBeerProvider a

Wiring pevných konštánt <bean id="bar" class="sk.beer.bar"> <property name="name" value="u Slováka" /> </bean> vlastnosti je možné konfigurovať aj pevnými hodnotami konfigurácia vykoná setname("u Slováka") prebieha automatická konverzia typov (reťazce na čísla, booleany...) analogická syntax: <bean id="bar" class="sk.beer.bar"> <property name="name"> <value>u Slováka</value> </property> </bean>

Wiring cez parametrické konštruktory public class Bar { public Bar(String name, int capacity) { inštancie môžu byť vytvárané aj s využitím parametrických konštruktorov <bean id="bar" class="sk.beer.bar"> <constructor-arg value="u Slováka" /> <constructor-arg value="250" /> </bean> Spring vytvorí inštanciu beanu bar pomocou vyššie uvedeného konštruktora

Wiring beanov cez konštruktory public class Bar { public Bar(String name, BeerProvider p) { do konštruktorov možno vkladať aj existujúce beany <bean id="bar" class="sk.beer.bar"> <constructor-arg value="u Slováka" /> <constructor-arg ref="beerprovider" /> </bean> takýto wiring: constructor injection

Nejednoznačnosti v konštruktoroch public class Bar { public Bar(String name, int capacity) { public Bar(String name, String address { konštruktor, ktorý sa zavolá, sa odvodí z typov argumentov. Niekedy však treba predísť nejednoznačnosti <bean id="bar" class="sk.beer.bar"> <constructor-arg value="u Slováka" /> <constructor-arg type="int" value="250" /> </bean>

Autowiring <beans> <bean id="beerprovider" class="sk.beer.kegbeerprovider" /> <bean id="bar" class="sk.beer.bar" autowire="byname" /> </beans> autowiring umožňuje automatické prepájanie beanov bez explicitnej deklarácie byname prepájanie na základe zhody ID bytype zhoda dátových typov constructor zhoda dátových typov v konštruktore

Autowiring podľa mena byname nastaví sa na beane, pre ktorý sa majú nastaviť závislosti automaticky prejdú sa všetky settery beanu a hľadá sa bean, ktorý má rovnaké ID ako názov setteru public class Bar {... public void setbeerprovider(beerprovider p) { hľadá sa bean s ID beerprovider ak sa nenájde, závislosť nebude nastavená

Autowiring podľa typu bytype prejdú sa všetky settery beanu a hľadá sa bean, ktorého trieda zodpovedá dátovému typu v setteri public class Bar {... public void setbeerprovider(beerprovider p) { hľadá sa bean typu BeerProvider (čiže trieda implementujúca tento interface) ak sa nenájde, nič sa nedeje ak existuje viacero beanov s daným typom, hádže sa výnimka

Autowiring konštruktora constructor autowiring prebieha na parametroch konštruktora na základe typu public class Bar { public Bar(BeerProvider p) { hľadá sa bean s ID beerprovider ten sa vloží do konštruktora ako v prípade <constructor arg...> v prípade nejednoznačnosti nastáva výnimka

Globálny autowiring autowiring možno nastaviť aj na koreňovom elemente <beans> treba sa zamyslieť nad použitím autowiringu veci sa dejú automaticky vhodné pre malé projekty ale v prípade veľkých projektov / viacerých vývojarov môžu nastať zmätky čo sa autowiruje automaticky? čo sa autowiruje manuálne? prípadne zvoliť vhodný konzistentný prístup

existuje špeciálna podpora pre konfiguráciu zoznamov, množín, máp... public class Bar { void setmenu(list menuitems); <bean id="bar" class="sk.beer.bar"> <property name="name"> <list> <value>hoegaarden</value> <value>šariš</value> </list> </property> </bean> Wiring kolekcií odkazy na beany pomocou <ref bean="idbeanu" />

Wiring množín public class Bar { void setmenu(set menuitems); <bean id="bar" class="sk.beer.bar"> <property name="name"> <set> <value>hoegaarden</value> <value>šariš</value> </set> </property> </bean> odkazy na beany pomocou <ref bean="idbeanu" />

Wiring java.util.properties public class Bar { void setmenuprices(properties prices); <bean id="bar" class="sk.beer.bar"> <property name="name"> <props> <prop key="hoegaarden">55</prop> <prop key="šariš">30</prop> </props> </property> </bean>

Vnorené beany v jednoduchých prípadoch je možné referencie medzi beanami uviesť aj priamo <bean id="bar" class="sk.beer.bar"> <property name="beerprovider> <bean id="beerprovider" class="sk.beer.kegbeerprovider" /> </property> </bean> deklarácia beanu priamo vo vnútri property

Väzba s kontajnerom Springovský kontajner poskytuje komponentom podporu pre životný cyklus štart stop prístup k útrobám Springu prístup k objektu aplikačného kontextu prístup k identifikátoru beanu v kontajneri možnosť rozposielať udalosti

Životný cyklus štart kontajner môže upovedomiť bean o dokončení jeho inicializácie volaním jeho metódy príklad: štart embedded databázy <bean id="bar" class="sk.beer.bar" init-method="open" /> potom, čo je vytvorená a inicializovaná inštancia beanu, sa zavolá metóda open()

Životný cyklus stop v prípade ukončenia kontajneru možno o tom upovedomiť beany príklad: ak treba uvoľniť databázové pripojenia v beane <bean id="bar" class="sk.beer.bar" destroy-method="close" /> pred ukončením kontajnera sa zavolá metóda close() kontajner treba ukončiť slušne ctx.registershutdownhook() zastaví kontajner pri ukončení JVM

Viditeľnosť vnútorností niekedy (zriedka) chceme v beane vidieť do vnútorností Springu. Na to stačí implementovať v beane vhodný interfejs znalosť identifikátora beanu: org.springframework.beans.factory.beannameaware metóda setbeanname(string) prístup k objektu aplikačného kontextu org.springframework.context.applicationcontextaware metóda setapplicationcontext(applicationcontext) trieda beanu je však úzko zviazaná s kontajnerom. Treba zvážiť!

Zneužitie dependency injection public class Bar implements ApplicationContextAware { private ApplicationContext ctx; private void getbeerprovider() { this.beerprovider = (BeerProvider) ctx.getbean("beerprovider"); takýto kód znamená skoro vždy nepochopenie dependency injection odkaz na beerprovidera môžeme predsa špecifikovať v popisovači aplikačného kontextu!

Singletony a nie singletony pre každý deklarovaný bean v aplikačnom kontexte vytvorí Spring jedinú inštanciu pri zavolaní getbean() získate od Springu stále jeden a ten istý objekt niekedy to však nie je žiadúce príklad: ThrowAwayController z webovej vrstvy pre každú požiadavku chceme získať novú inštanciu (inak by si klienti vzájomne prepisovali dáta) <bean id="bar" class="sk.beer.bar singleton="false" />