METODY PROGRAMOWANIA

Podobne dokumenty
Zaawansowane Aplikacje Internetowe

mgr inż. Michał Paluch

Tomasz Dobek.

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

Kontenery IoC dla Java Guice 3.0

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

Podstawy frameworka Spring

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

Pico. Wstęp do kontenerów IoC.

Programowanie komponentowe 5

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (2) Wykład 10 Inversion of Control/Dependency Injection Wiktor Zychla 2018

Modele komponentowe SCA, OSGi, Distributed OSGi i OSGi Enterprise a Java EE

Instrukcja laboratoryjna nr.2

Spring Framework - wprowadzenie i zagadnienia zaawansowane

Mapowanie obiektowo-relacyjne z wykorzystaniem Hibernate

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Tworzenie aplikacji J2EE w oparciu o Spring Framework

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

namespace HostedReceiver { public class Receiver: IConfigureThisEndpoint, AsA_Server {

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (2) Wykład 10 Inversion of Control Wiktor Zychla 2013

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (2) Wykład 10 Inversion of Control/Dependency Injection Wiktor Zychla 2014

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

SPRING FRAMEWORK. dr inż. Jakub Chłapioski

NHibernate Hibernate dla platformy.net. Hibernate posiada także dużą społeczność, zatem nietrudno uzyskać jakieś wsparcie w przypadku problemów.

NHibernate. Narzędzie mapowania obiektowo - relacyjnego

Enterprise Java Beans Narzędzia i Aplikacje Java EE

Komponenty sterowane komunikatami

Michał Jankowski. Remoting w.net 2.0

Java Enterprise Edition spotkanie nr 1. Sprawy organizacyjne, wprowadzenie

Zaawansowane Aplikacje Internetowe

1 Atrybuty i metody klasowe

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

Java wybrane technologie

Zaawansowane aplikacje internetowe - laboratorium Architektura Spring.

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Bazy danych tworzenie aplikacji bazodanowych ORM / JPA

Zaawansowane programowanie w C++ (PCP)

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2017

Usługa TimerService

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

Programowanie obiektowe

SPRING FRAMEWORK. dr inż. Jakub Chłapioski

Zagadnienia Programowania Obiektowego Agata Hejmej

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

Podejście obiektowe do relacyjnych baz danych Hibernate.

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Katalog książek cz. 2

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Spring. Krzysztof Ślusarski. 18maja2007. Wydział Matematyki Informatyki i Mechaniki Uniwersytetu Warszawskiego

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (2) Wykład 10 Inversion of Control/Dependency Injection Wiktor Zychla 2016

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

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

Przykład zastosowania notacji UML dla realizacji zastosowania wzorca Mediator (materiały dla studentów na prawach rękopisu)

Projektowanie aplikacji internetowych laboratorium

Kontener Inversion Of Control dla obiektów Ruby realizujący wzorzec projektowy Dependency Injection

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Wielowarstwowe aplikacje internetowe. Spring. Autorzy wykładu: Mikołaj Morzy Marek Wojciechowski. Spring

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

Języki i metody programowania Java Lab2 podejście obiektowe

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

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

Db4o obiektowa baza danych wersja.net

Metody dostępu do danych

Programowanie obiektowe

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Wstęp. Ale po co? Implementacja

Stanowe komponenty sesyjne

Zaawansowane aplikacje WWW - laboratorium

Programowanie warstwy klienta w aplikacji JavaEE

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Tworzenie aplikacji dla Oracle Application Server 10g R3 w technologii EJB 3.0

RMI-2. Java Remote Method Invocation (RMI) na podstawie m.in. podręcznika firmy Sun Microsystems SYSTEMY ROZPROSZONE

1 Wprowadzenie do J2EE

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Bezstanowe komponenty sesyjne i zdarzenia zwrotne

Aplikacje RMI

[Android] Podstawy programowania

Programowanie obiektowe i zdarzeniowe

Programowanie obiektowe

Metody Metody, parametry, zwracanie wartości

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Aplikacje RMI Lab4

Programowanie obiektowe

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

Omówienie wzorców wykorzystywanych w Prism 5.0. Dominika Różycka

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Programowanie komponentowe

Wykład 4: Klasy i Metody

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

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

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Programowanie obiektowe

Podstawowe informacje o technologii Java Persistence API - przykład

Klasy i obiekty cz II

Transkrypt:

METODY PROGRAMOWANIA Odwrócenie sterowania i wstrzykiwanie zależności na przykładzie Spring Framework 13 stycznia 2018 Krzysztof Pawłowski kpawlowski@pjwstk.edu.pl

CZYM JEST ODWRÓCENIE STEROWANIA? Odwrócenie sterowania (ang. invertion of control) - zasada projektowa polegająca na przeniesieniu na zewnątrz komponentu (np. obiektu) odpowiedzialności za kontrolę wybranych czynności wspiera modularność i rozszerzalność przykłady: dependency injection, aspect oriented programming, wzorzec strategy

WSTRZYKIWANIE ZALEŻNOŚCI Wstrzykiwanie zależności (ang. dependency injection) - proces, w którym obiekty definiują inne obiekty, od których zależą poprzez luźne powiązania Jedna z realizacji zasady odwrócenia sterowania Wstrzykiwanie możemy realizować przez: konstruktor settery"

tradycyjne podejście: WSTRZYKIWANIE ZALEŻNOŚCI public class Foo { public class Bar { private Foo foo; public Bar() { this.foo = new Foo();

WSTRZYKIWANIE ZALEŻNOŚCI wstrzykiwanie zależności (DI) poprzez konstruktor: public class Foo { public class Bar { private Foo foo; public Bar(Foo foo) { this.foo = foo;

WSTRZYKIWANIE ZALEŻNOŚCI wstrzykiwanie zależności (DI) poprzez setter: public class Foo { public class Bar { private Foo foo; public void setfoo(foo foo) { this.foo = foo;

SPRING FRAMEWORK Najpopularniejszy framework do wytwarzania aplikacji klasy enterprise w języku Java Open source Implementuje IoC Wspiera serwery aplikacji (aplikacje webowe), zawiera dodatkowe moduły, np.: AOP, Spring Security, Spring Data

IOC CONTAINER Spring Container jest rdzeniem Spring Framework Kontener jest odpowiedzialny za tworzenie obiektów, ich powiązanie, konfiguracje i zarządzanie ich cyklem życia

IOC CONTAINER

IOC CONTAINER Kontener tworzy i konfiguruje obiekty na podstawie metadanych, które mogą być reprezentowane przez: plik konfiguracyjny w formacie XML, kod, adnotacje.

KONFIGURACJA KONTENERA (XML) <?xml version="1.0" encoding="utf-8"?> <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.xsd"> <!-- services --> <bean id="petstore" class="org.springframework.samples.jpetstore.services.petstoreserviceimpl"> <property name="accountdao" ref="accountdao"/> <property name="itemdao" ref="itemdao"/> <!-- additional collaborators and configuration for this bean go here --> </bean> </beans> <!-- more bean definitions for services go here -->

JAK ZAINICJOWAC KONTENER? public class Application { public static void main(string[] args) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"services.xml");

JAK UŻYWAĆ KONTENERA? // create and configure beans ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"); // retrieve configured instance PetStoreService service = context.getbean("petstore", PetStoreService.class); // use configured instance List<String> userlist = service.getusernamelist();

BEAN Bean to instancja klasy utworzona i skonfigurowana przez kontener IoC

BEAN - INICJACJA PRZEZ KONSTRUKTOR - PRZYKŁAD 1 package x.y; public class Foo { public Foo(Bar bar, Baz baz) { //...

BEAN - INICJACJA PRZEZ KONSTRUKTOR - PRZYKŁAD 1 <beans> <bean id="foo" class="x.y.foo"> <constructor-arg ref="bar"/> <constructor-arg ref="baz"/> </bean> <bean id="bar" class="x.y.bar"/> <bean id="baz" class="x.y.baz"/> </beans>

BEAN - INICJACJA PRZEZ KONSTRUKTOR - PRZYKŁAD 2 package examples; public class ExampleBean { private int years; private String ultimateanswer; public ExampleBean(int years, String ultimateanswer) { this.years = years; this.ultimateanswer = ultimateanswer;

BEAN - INICJACJA PRZEZ KONSTRUKTOR - PRZYKŁAD 2 <bean id="examplebean" class="examples.examplebean"> <constructor-arg type="int" value="7500000"/> <constructor-arg type="java.lang.string" value="42"/> </bean>

BEAN - INICJACJA PRZEZ SETTERY - PRZYKŁAD public class ExampleBean { private AnotherBean beanone; private YetAnotherBean beantwo; private int i; public void setbeanone(anotherbean beanone) { this.beanone = beanone; public void setbeantwo(yetanotherbean beantwo) { this.beantwo = beantwo; public void setintegerproperty(int i) { this.i = i;

BEAN - INICJACJA PRZEZ SETTERY - PRZYKŁAD <bean id="examplebean" class="examples.examplebean"> <!-- setter injection using the nested ref element --> <property name="beanone"> <ref bean="anotherexamplebean"/> </property> <!-- setter injection using the neater ref attribute --> <property name="beantwo" ref="yetanotherbean"/> <property name="integerproperty" value="1"/> </bean> <bean id="anotherexamplebean" class="examples.anotherbean"/> <bean id="yetanotherbean" class="examples.yetanotherbean"/>

BEAN - ZAGNIEŻDŻANIE <bean id="outer" class="..."> <!-- instead of using a reference to a target bean, simply define the target bean inline --> <property name="target"> <bean class="com.example.person"> <!-- this is the inner bean --> <property name="name" value="fiona Apple"/> <property name="age" value="25"/> </bean> </property> </bean>

BEAN - DEFINIOWANIE LISTY <bean id="morecomplexobject" class="example.complexobject"> <!-- results in a setsomelist(java.util.list) call --> <property name="somelist"> <list> <value>a list element followed by a reference</value> <ref bean="mydatasource" /> </list> </property> </bean>

BEAN - DEFINIOWANIE MAPY <bean id="morecomplexobject" class="example.complexobject"> <!-- results in a setsomemap(java.util.map) call --> <property name="somemap"> <map> <entry key="an entry" value="just some string"/> <entry key ="a ref" value-ref="mydatasource"/> </map> </property> </bean>

BEAN - DEFINIOWANIE ZBIORU <bean id= morecomplexobject" class="example.complexobject"> <!-- results in a setsomeset(java.util.set) call --> <property name="someset"> <set> <value>just some string</value> <ref bean="mydatasource" /> </set> </property> </bean>

AUTOMATYCZNE WYKRYWANIE ZALEŻNOŚCI Referencje do innych obiektów w Spring Framework mogą być rozwiązywane automatycznie: poprzez nazwę ( byname ) poprzez typ ( bytype ) poprzez konstruktor ( constructor )

AUTOMATYCZNE WYKRYWANIE ZALEŻNOŚCI - PRZYKŁAD <bean id="morecomplexobject" class= example.complexobject" autowire= byname />

BEAN - ZAKRES singleton prototype

BEAN - ZAKRES SINGLETON

BEAN - ZAKRES PROTOTYPE

BEAN - CYKL ŻYCIA

BEAN - CYKL ŻYCIA

BEAN - CYKL ŻYCIA <bean id="morecomplexobject" class= example.complexobject" init-method= init destroy-method= destroy />

KONFIGURACJA KONTENERA PRZY UŻYCIU ADNOTACJI <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> </beans> <context:annotation-config/>

@REQUIRED public class SimpleMovieLister { private MovieFinder moviefinder; @Required public void setmoviefinder(moviefinder moviefinder) { this.moviefinder = moviefinder; //...

@AUTOWIRED public class SimpleMovieLister { private MovieFinder moviefinder; @Autowired(required=false) public void setmoviefinder(moviefinder moviefinder) { this.moviefinder = moviefinder; //...

@CONFIGURATION, @BEAN, @PRIMARY @Configuration public class MovieConfiguration { @Bean @Primary public MovieCatalog firstmoviecatalog() {... @Bean public MovieCatalog secondmoviecatalog() {... //...

@QUALIFIER public class MovieRecommender { @Autowired @Qualifier("main") private MovieCatalog moviecatalog; //...

@RESOURCE public class SimpleMovieLister { private MovieFinder moviefinder; @Resource(name="myMovieFinder") public void setmoviefinder(moviefinder moviefinder) { this.moviefinder = moviefinder;

@POSTCONSTRUCT, @PREDESTROY public class CachingMovieLister { @PostConstruct public void populatemoviecache() { // populates the movie cache upon initialization... @PreDestroy public void clearmoviecache() { // clears the movie cache upon destruction...

AUTOMATYCZNE SKANOWANIE OBIEKTÓW <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> </beans> <context:component-scan base-package="org.example"/> lub @Configuration @ComponentScan(basePackages = "org.example") public class AppConfig {...

@COMPONENT @Component public class FactoryMethodComponent { @Bean @Scope("prototype") public TestBean prototypeinstance(injectionpoint injectionpoint) { return new TestBean("prototypeInstance for " + injectionpoint.getmember());

@NAMED, @INJECT import javax.inject.inject; import javax.inject.named; @Named("movieListener") // @ManagedBean("movieListener") could be used as well public class SimpleMovieLister { private MovieFinder moviefinder; @Inject public void setmoviefinder(moviefinder moviefinder) { this.moviefinder = moviefinder; //...

PRZYKŁAD http://websystique.com/spring/spring-auto-detection- autowire-component-scanning-example-with- annotations/

Dziękuję!

DZIĘKUJĘ