Wprowadzenie. Spring 2.5. Norbert Potocki. 3 lutego Norbert Potocki Spring 2.5

Podobne dokumenty
mgr inż. Michał Paluch

Tworzenie aplikacji internetowych z wykorzystaniem szkieletu Spring. Paweł Ociepa, Paweł Pierzchała

Tomasz Dobek.

Szkolenie wycofane z oferty

Podstawy frameworka Spring

Contexts and Dependency Injection (CDI) Autor wykładu: Marek Wojciechowski

Java Server Faces narzędzie do implementacji w wy prezentacji

Zagadnienia Programowania Obiektowego Agata Hejmej

Programowanie komponentowe 5

Programowanie obiektowe

Zaawansowane Aplikacje Internetowe

Spring framework. Paweł Kędziora. Marek Lewandowski

Wprowadzenie. Narzędzia i środowiska programistyczne. Laboratorium 1. Prowadzący: Kierunek: Semestr: Rok: Tomasz Gądek Informatyka Zimowy 2

1 Wprowadzenie do J2EE

Programowanie obiektowe

JBoss Seam: framework nowej generacji. Copyright Piotr Kochański & Erudis,

Nowoczesne aplikacje internetowe oparte na Spring Framework, JSF, JPA i AJAX

Spring Framework - wprowadzenie i zagadnienia zaawansowane

Serwery aplikacji. dr Radosław Matusik. radmat

JSF 1.2. w wykonaniu NetBeans IDE 6.1. Jacek Laskowski

Enterprise JavaBeans

Java Enterprise Edition spotkanie nr 1. Sprawy organizacyjne, wprowadzenie

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Projektowanie Aplikacji Internetowych. Wzorce projektowe warstwy usług

METODY PROGRAMOWANIA

Programowanie w języku Java. Wykład 13: Java Platform, Enterprise Edition (Java EE)

Szkolenie wycofane z oferty. Program szkolenia: Enterprise Java Beans 3.0/3.1

Projektowanie obiektowe Wzorce projektowe. Wprowadzenie do wzorców projektowych

Java EE: JSF + EJB + JPA + CDI + BV

Web frameworks do budowy aplikacji zgodnych z J2EE

Wstęp Budowa Serwlety JSP Podsumowanie. Tomcat. Kotwasiński. 1 grudnia 2008

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Zagadnienia projektowania aplikacji J2EE

Enterprise JavaBeans. 1. Architektura EJB: komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 2. Kontenery EJB JBoss.

Projektowanie i architektura frameworka w języku PHP. Tomasz P.F. Kowalczyk

Kontenery IoC dla Java Guice 3.0

Programowanie w Javie 2. Płock, 26 luty 2014 r.

Projektowanie oprogramowania: wzorce architektoniczne i projektowe

Produktywne tworzenie aplikacji webowych z wykorzystaniem Groovy i

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

Poznań Java User Group Java Server Faces. Wprowadzenie (Fakty i Mity)

Programowanie zorientowane obiektowo. Mateusz Kołecki

Wykład dla studentów Informatyki Stosowanej UJ 2012/2013

Serwery aplikacji. mgr Radosław Matusik. Wydział Matematyki i Informatyki Uniwersytetu Łódzkiego radmat radmat@math.uni.lodz.

Wzorce prezentacji internetowych

JAVA NA SERWERZE SPRING. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Ruby i Ruby on Rails. Mateusz Drożdżyński

Programowanie obiektowe

Analiza i projektowanie obiektowe 2016/2017. Wykład 11: Zaawansowane wzorce projektowe (1)

Wprowadzenie do technologii Web Services: SOAP, WSDL i UDDI

Enterprise JavaBeans (EJB)

Programowanie w języku Java WYKŁAD

Aplikacje w środowisku Java

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Aplikacje Internetowe, Servlety, JSP i JDBC

JAVA EE MODEL APLIKACJI. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

SZKOLENIE TWORZENIE SYSTEMÓW

Zaawansowane Techniki Bazodanowe

Dokumentacja techniczna. Młodzieżowe Pośrednictwo Pracy

JavaServer Faces (JSF)

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Java. Michał Wójcik.

Zaawansowane Aplikacje Internetowe

Komponenty sterowane komunikatami

Tworzenie aplikacji J2EE w oparciu o Spring Framework

Podstawy wzorca MVC MODEL KON- TROLER WIDOK. Odpowiada za wyświetlenie danych użytkownikowi. Zawiera dane aplikacji oraz jej logikę.

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Web frameworks do budowy aplikacji zgodnych z J2EE. Jacek Panachida

Kurs ASP.NET ASP.NET CORE APLIKACJE WEBOWE

Technologie internetowe ASP.NET Core. Paweł Rajba

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Przykłady tworzenia aplikacji komponentowych w technologii JavaServer Faces 2.1 na podstawie

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Zaawansowane Aplikacje Internetowe

Spring Web MVC, Spring DI

Konwersja danych. Programowanie komponentowe 4. wg bnaph.html

Wprowadzenie do programowania aplikacji mobilnych

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Java EE: JSF + EJB + JPA

Aplikacje RMI

Budowa aplikacji wielowarstwowych zastosowanie szablonów. Laboratorium 2 Programowanie komponentowe Zofia Kruczkiewicz

Testowanie aplikacji Java Servlets

Obiekty, aspekty, komponenty

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

EJB 3.0 (Enterprise JavaBeans 3.0)

Aplikacje w środowisku Java

Języki i metody programowania Java. Wykład 2 (część 2)

Tworzenie i wykorzystanie usług

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Google Web Toolkit Michał Węgorek ZPO 2009

JAX-RS czyli REST w Javie. Adam Kędziora

STRUTS 2. Krystyna Bury Katarzyna Sadowska Joanna Pyc Politechnika Wrocławska Wydział Informatyki i Zarządzania Informatyka, III rok

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Informacje wstępne Autor Zofia Kruczkiewicz Wzorce oprogramowania 4

Transkrypt:

Wprowadzenie 3 lutego 2009

Wprowadzenie Spring zrąb tworzenia aplikacji JEE (ale nie tylko) w języku Java (ale nie tylko :)) powstał jako alternatywa dla ociężałej technologii EJB 2 i jako alternatywa dla Struts, które uznano za źle zaprojektowane i zaimplementowane

Główne komponenty Spring kontener IoC zrąb AOP (programowanie aspektowe) zrąb dostępu do danych zrąb obsługujący transakcyjność operacji zrąb MVC zrąb autoryzacji (Spring Security) zrąb do testowania (Spring Testing)

Kontenery założenie programowania zorientowanego obiektowo: rozbicie systemu na grupy komponentów, które można w przyszłości ponownie wykorzystać problem: w klasycznym sposobie programowania obiekty muszą tworzyć i zarządać swoimi zależnościami, co powoduje ich niepotrzebne związanie z innymi obiektami rozwiązanie: użycie kontenera obiektów, który działa jako fabryka i rejestr obiektów dostępnych w systemie

Bez kontenera public interface ReportGenerator { public void generate(string[][] table); public class HtmlReportGenerator implements ReportGenerator { public void generate(string[][] table) { System.out.println("Generating HTML report..."); public class PdfReportGenerator implements ReportGenerator { public void generate(string[][] table) { System.out.println("Generating PDF report..."); public class ReportService { private ReportGenerator reportgenerator = \textit{new PdfReportGenerator(); public void generateannualreport(int year) { String[][] statistics = null; reportgenerator.generate(statistics); public void generatemonthlyreport(int year, int month) { String[][] statistics = null; reportgenerator.generate(statistics); Norbert Potocki

Dodajemy kontener public class Container { public static Container instance; private Map<String, Object> components; public Container() { components = new HashMap<String, Object>(); instance = this; ReportGenerator reportgenerator = new PdfReportGenerator(); components.put("reportgenerator", reportgenerator); ReportService reportservice = new ReportService(); components.put("reportservice", reportservice); public Object getcomponent(string id) { return components.get(id); public class ReportService { private ReportGenerator reportgenerator = (ReportGenerator) Container.instance.getComponent("reportGenerator"); public void generateannualreport(int year) {... public void generatemonthlyreport(int year, int month) {...

Przykładowe wywołanie public class Main { public static void main(string[] args) { Container container = new Container(); ReportService reportservice = (ReportService) container.getcomponent("reportservice"); reportservice.generateannualreport(2007);

Używamy wzorca projektowego - Service Locator public class ReportService { private ReportGenerator reportgenerator = (ReportGenerator) Container.instance.getComponent("reportGenerator");... public class ServiceLocator { private static Container container = Container.instance; public static ReportGenerator getreportgenerator() { return (ReportGenerator) container.getcomponent("reportgenerator"); public class ReportService { private ReportGenerator reportgenerator = ServiceLocator.getReportGenerator(); public void generateannualreport(int year) {... public void generatemonthlyreport(int year, int month) {...

Używamy IoC - Dependency Injection (DI) public class ReportService { private ReportGenerator reportgenerator; public void setreportgenerator(reportgenerator reportgenerator) { this.reportgenerator = reportgenerator; public void generateannualreport(int year) {... public void generatemonthlyreport(int year, int month) {... public class Container { private Map<String, Object> components; public Container() { components = new HashMap<String, Object>(); ReportGenerator reportgenerator = new PdfReportGenerator(); components.put("reportgenerator", reportgenerator); ReportService reportservice = new ReportService(); reportservice.setreportgenerator(reportgenerator); components.put("reportservice", reportservice); public Object getcomponent(string id) { return components.get(id);

3 typy wstrzykiwania zależności poprzez użycie setter ów poprzez użycie konstruktorów poprzez użycie interfejsu public interface Injectable { public void inject(map<string, Object> components);

Przykład konfiguracji public class SequenceGenerator { private String prefix; private int initial; private int counter; public SequenceGenerator() { public SequenceGenerator(String prefix, int initial) { this.prefix = prefix; this.initial = initial; public void setprefix(string prefix) { this.prefix = prefix; public void setinitial(int initial) { this.initial = initial; public synchronized String getsequence() { StringBuffer buffer = new StringBuffer(); buffer.append(prefix); buffer.append(initial + counter++);

Przykład konfiguracji - cd. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean name="sequencegenerator" class="com.apress.springrecipes.sequence.sequencegenerator"> <property name="prefix"> <value>30</value> </property> <property name="initial"> <value>100000</value> </property> </bean> </beans> public class Main { public static void main(string[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); SequenceGenerator generator = (SequenceGenerator) context.getbean("sequencegenerator"); System.out.println(generator.getSequence()); System.out.println(generator.getSequence());

Możliwości kontenera Spring konfiguracja poprzez pliki XML obsługa anotacji sprawdzanie poprawności wstrzyknięcia: wyjątek: UnsatisfiedDependencyException none brak sprawdzania simple sprawdzanie typów prostych (typy bazowe oraz kolekcje) objects sprawdzanie typów złożonych all sprawdzanie wszystkich typów <bean id="sequencegenerator" class="com.apress.springrecipes.sequence.sequencegenerator" dependency-check="simple"> <property name="initial" value="100000" /> <property name="prefixgenerator" ref="dateprefixgenerator" /> </bean>

Możliwości kontenera Spring - cd konfiguracja poprzez pliki XML obsługa anotacji sprawdzanie poprawności wstrzyknięcia automatyczne łączenie dziedziczenie wartości atrybutów w konfiguracji ziaren zasięg tworzonych ziaren: singleton pojedyńcza instancja ziarna na kontener prototype nowe ziarno przy każdym odwołaniu request nowe ziarno dla każdego żądania HTTP (tylko w kontekście aplikacji web) session jedno ziarno dla całej sesji (tylko w kontekście aplikacji web) all sprawdzanie wszystkich typów

Możliwości kontenera Spring - cd konfiguracja poprzez pliki XML obsługa anotacji sprawdzanie poprawności wstrzyknięcia automatyczne łączenie dziedziczenie wartości atrybutów w konfiguracji ziaren zasięg tworzonych ziaren wsparcie dla tłumaczeń automatyczne wykrywanie na podstawie danych dostarczonych przez przeglądarkę tekst zapisany w formacie Java Properties (klucz-wartość)

Idea AOP - Aspect Oriented Programming metodologia uzupełniająca tradycyjny paradygmat programowania obiektowego OOP dobre do modelowania logiki biznesowej, ale niewygodne przy powstających podczas kodowania problemach przelotowych (zagadnienia dotyczące wielu, często niepowiązanych, modułów w aplikacji) przykłady: logowanie komunikatów walidacja parametrów wejściowych różne zręby pozwalające na używanie AOP: AspectJ JBoss AOP Spring AOP

Przykładowy problem public interface ArithmeticCalculator { public double add(double a, double b); public double sub(double a, double b); public interface UnitCalculator { public double kilogramtopound(double kilogram); public double kilometertomile(double kilometer); public class ArithmeticCalculatorImpl implements ArithmeticCalculator { private Log log = LogFactory.getLog(this.getClass()); public double add(double a, double b) { log.info("the method add() begins with " + a + ", " + b);... log.info("the method add() ends with " + (a + b)); public double sub(double a, double b) { log.info("the method add() begins with " + a + ", " + b);... log.info("the method add() ends with " + (a - b)); public class UnitCalculatorImpl implements UnitCalculator { public double kilogramtopound(double kilogram) {... public double kilometertomile(double kilometer) {... Norbert Potocki

Rozwiązanie Użycie wzorca projektowego Proxy i wykorzystanie Java Reflection: public class CalculatorLoggingHandler implements InvocationHandler { private Log log = LogFactory.getLog(this.getClass()); private Object target; public CalculatorLoggingHandler(Object target) { this.target = target; public Object invoke(object proxy, Method method, Object[] args) throws Throwable { log.info("the method " + method.getname() + "() begins with " + Arrays.toString(args)); Object result = method.invoke(target, args); log.info("the method " + method.getname() + "() ends with " + result); return result; public class Main { public static void main(string[] args) { ArithmeticCalculator arithmeticcalculatorimpl = new ArithmeticCalculatorImpl(); ArithmeticCalculator arithmeticcalculator = (ArithmeticCalculator) Proxy.newProxyInstance( arithmeticcalculatorimpl.getclass().getclassloader(), arithmeticcalculatorimpl.getclass().getinterfaces(), new CalculatorLoggingHandler(arithmeticCalculatorImpl));

Wskazówki (Advices) w AOP szablony, precyzujące punkty w których można dodać nową otoczkę Before advice wywoływana przed wywołaniem metody After returning advice po powrocie z metody After throwing advice gdy metoda wyrzuci wyjątek Around advice dookoła metody (pozwala decydować, czy ją wywołać, czy nie) public class LoggingBeforeAdvice implements MethodBeforeAdvice { private Log log = LogFactory.getLog(this.getClass()); public void before(method method, Object[] args, Object target) throws Throwable { log.info("the method " + method.getname() + "() begins with " + Arrays.toString(args));

Wskazówki (Advices) w AOP - cd szablony, precyzujące punkty w których można dodać nową otoczkę rozwiązanie od Spring 2.X - anotacje przy metodach klas proxy opisujące klasę obiektów obejmowanych @Aspect public class CalculatorLoggingAspect { private Log log = LogFactory.getLog(this.getClass()); @Before("execution(* ArithmeticCalculator.add(..))") public void logbefore() { log.info("the method add() begins");

Podział na 3 (albo 4) warstwy Model Kontroler Widok Usługi

Przepływ w aplikacji główny servlet Spring uchwyty mapujące (handler mappers) kontroler (controller) dopasowywacz widoków (view resolver) widok + model (po połączeniu) wynik

Mapowanie adresu mapowanie dopasowuje do adresu nazwę kontrolera, który ma obsłużyć żądanie dostarczone w Spring MVC klasy implementujące różne formy mapowania wybieramy jedną z nich definiując jej instancję w konfiguracji kontenera przykłady: tłumaczenie ostatniego trzonu adresu URL na nazwę kontrolera tłumaczenie oparte na wyrażeniach regularnych

Obsługa przez kontroler kontroler wykonuje akcje na modelu odpowiadające żądaniu użytkownika w tym celu (zazwyczaj) wprowadza się warstwę usług działającą bezpośrednio na modelu kontroler po przetworzeniu żądania przekazuje nazwę wybranego widoku oraz model (w postaci mapy klucz-wartość)

Dopasowanie widoku dopasowywacz widoków łączy przekazany przez kontroler widok z rzeczywistą nazwą widoku (pliku) widoki mogą być zaimplementowane w np. JSP, JSF, Facelets, Tapestry Spring dostarcza różne dopasowywacze widoków bazujące (bądź ignorujące) przekazaną przez kontroler nazwę widok jest wypełniany polami przekazanymi wraz z modelem przez kontroler i przedstawiany użytkownikowi

Integracja z Spring MVC z innymi zrębami Direct Web Remoting Apache Struts JavaServer Faces konfiguracja wymaga tylko 1 linijki kodu możliwość odwoływania się do ziaren Spring w JSF i na odwrót trywialna integracja ze Spring Web Flow Around advice dookoła metody (pozwala decydować, czy ją wywołać, czy nie)

Integracja Spring MVC z innymi zrębami Spring Security implementacja najważnejszych metod autoryzacji i autentykacji dostęp do zasobów oparty o role listy kontroli dostępu (ACL) na poziomie pojedynczych obiektów Spring Web Flow idea podobna do JBPM (Java Business Process Management) ale odnosząca się do interfejsu aplikacji webowych łatwa integracja przepływów z akcjami JSF walidatory do większości typów Javy konwertery wartości łatwe zarządzanie sesjami łatwa integracja przepływów z Ajax łatwa integracja ze Spring Security

Przydatne narzędzia NetBeans 6.5 natywne, ograniczone wsparcie dla Spring brak wsparcia dla Spring Web Flow automatyczne uzupełnianie kodu i znaczników XML Eclipse + Spring IDE (wtyczka) wsparcie dla wszystkich projektów Spring diagramy zależności ziaren uwzględnianie ziaren tworzonych w konfiguracji kontenera Spring diagramy dla Spring Web Flow rozwijany równocześnie ze zrębem Spring

Przydatne materiały Spring in Action Craig Walls and Ryan Breidenbach Pro Jan Machacek, Jessica Ditt, Aleksa Vukotic, and Anirvan Chakraborty Professional Java Development with the Spring Framework Rod Johnson, Juergen Hoeller, Alef Arendsen, and Thomas Risberg Pro Java EE Spring Patterns: Best Practices and Design Strategies Implementing Java EE Patterns with the Spring Framework Dhrubojyoti Kayal http://www.springsource.org/ główna strona projektu http://www.springframework.net/ Spring Framework.NET