Java Magazine #1
-
Upload
ramon-wieleman -
Category
Documents
-
view
227 -
download
2
description
Transcript of Java Magazine #1
Volledige samenwerking met DevOps
Bouw je eigen robot
Spoedcursus MongoDB
Apache Camel: voor complete integratie
mei/juni 2013 nr. 1
Onafhankelijk tijdschrift voor de Java-professional
Java Magazineis TERUG
Features
MAGAZINE
cover.indd 1 5/1/13 2:17 PM
werkenbijordina.nl
ICT. maar dan voor mensen
Ordina feliciteert alle Javanen met de terugkeer van hun lijfblad.
Zonder lijfblad ben je als Javaan niet compleet. Geweldig dus dat JAVA Magazine na anderhalf jaar weer van de persen rolt. Daarmee is de inhoud terug die je zo hebt gemist. Dat diepgaande artikel. Het internationale nieuws. Die handige tip. Alles wat je vak boeiend maakt. Geef je lijfblad nóg meer body! Wat mag volgens jou echt niet ontbreken in het nieuwe JAVA Magazine? Deel het met allemaal. En wie weet staat jouw bijdrage in het volgende nummer. Twitter je ideeën naar #mijnjava
ook heT Idee daT je IeTs hebT gemIsT?
javaman.indd 2 25-04-13 16:19Untitled-1 1 29-4-2013 9:58:21
JAVA magazine | 01 2013
voorwoord
Zoals de kop van dit voorwoord ook al zegt: Java Magazine is terug! Na een tijdje in print afwezig te zijn geweest, heb je nu dan eindelijk de hernieuwde en gerestylde editie van Java Magazine in handen. Ik had nu graag gewild dat bij het moment van open slaan het intro van “Eye of the Tiger” of de soundtrack van Rocky, zou klinken. Deze muziek illustreert namelijk exact ons enthousi-asme over Java Magazine en de NLJUG community. Iedereen heeft er heel veel zin in om alle leden van NLJUG weer te voorzien van de nodige kennis en kunde op Java-gebied middels het Java Magazine. Dit enthousiasme wordt vooral aan-gewakkerd door de grote betrokkenheid van de vele NLJUG-leden, die hielpen bij het realiseren van Java Magazine.
Naast het nieuwe magazine ook een nieuwe content manager. Inderdaad, ik noem mijzelf geen hoofdredacteur. Dit omdat het Java Magazine maar slechts een onderdeel is van een totaal hernieuwd aanbod aan diensten richting onze leden. Zo zullen ook de vertrouwde NLJUG Univerisity, de J Fall en de nieuwe nljug.org website [inclusief javamagazine info] onderdeel gaan uitmaken van mijn verantwoordelijkheden.Ik heb er zin in om samen met de leden, de programmacommissie, het bestuur en de redactieraad te werken aan toepasselijke info die jou als Java profes-sional kan ondersteunen. Het magazine is daarvan de eerste output. Wij [de redactieraad en ik] hopen dan ook echt dat deze uitgave jouw die ondersteu-ning dan ook weer kan bieden.
Wil je zelf ook bijdragen door iets te schrijven voor het magazine? Twijfel niet en neem contact met ons op! NLJUG bestaat immers door en voor de leden.Ik wens je in ieder geval veel leesplezier met het vernieuwde Java Magazine en hopelijk slaat ons enthousiasme ook op jou over!
ramon wieleman Content manager Java Magazine
Colofon Java Magazine 01-2013
Content manager:
Ramon Wieleman
Eindredactie:
Lilian Krijt
Auteurs:
Joop Lanting, Maikel Alderhout, Robert Scholte,
Hubert ten Hove, Eelco Meuter, Remko de Jong,
Marco Hebing, Anko Tijman, Frank Verbruggen,
Eric-jan Malotaux, Ben Ooms, Bert Ertman,
Frans van der Lek, Bert Jan Schrijver, Nanne Baars,
Peter Hendriks
redactiecommissie:
Nanne Baars, Eelco Meuter, Bert Jan Schrijver,
Ben Ooms, Bert Ertman, Lucas Jellema, Tim Prijn
vormgeving:
Britt Zaal, Jannemieke Duyzer, Jan Wesel
Uitgever:
Martin Smelt
Traffic:
Marco Verhoog
Media order:
Mirella van der Willik
Abonnementenadministratie:
Ingrid van der Aar, Tanja Ekel, Brigitte Hetem
drukkerij:
Senefelder Misset, Doetinchem
distributie:
Betapress
Sales:
Richelle Bussenius
E-mail: [email protected]
Telefoon: 023 752 39 22
Fax: 023 535 96 27
Java Magazine verschijnt 4 maal per jaar en is onderdeel
van het lidmaatschap NLJUG en kost € 39,50 (België € 40,50)
per jaar.
Naast het Java Magazine krijgt u gratis toegang tot de vele
NLJUG workshops en het JFALL congres. Het NLJUG is lid van
het wereldwijde netwerk van JAVA user groups. Voor meer
informatie of wilt u lid worden, zie www.nljug.org. Een nieuw
lidmaatschap wordt gestart met de eerst mogelijke editie
voor een bepaalde duur. Het lidmaatschap zal na de eerste
(betalings)periode stilzwijgend worden omgezet naar lidmaat-
schap van onbepaalde duur, tenzij u uiterlijk één maand voor
afloop van het initiële lidmaatschap schriftelijk (per brief of
mail) opzegt. Na de omzetting voor onbepaalde duur kan
op ieder moment schriftelijk worden opgezegd per wettelijk
voorgeschreven termijn van 3 maanden. Een lidmaatschap is
alleen mogelijk in Nederland en België. U kunt mailen naar
[email protected] of schrijven naar NLJUG BV, ledenadmi-
nistratie, postbus 3389, 2001 DJ Haarlem.
Op werkdagen kunt u bellen tussen 10 en 14 uur naar telefoon-
nummer 023–5364401. Verhuisberichten of bezorgklachten
kunt u doorgeven via www.hubstore.nl (Klantenservice).
Java Magazine is terug!
Voorwoord.indd 3 5/1/13 2:19 PM
04
JAVA MAGAZINE
Voor elke serieuze Java-ontwikkelaar en/of -bedrijf werkend met Java-technologie is het een must om lid te worden van de NLJUG. Als u up-to-date wilt zijn en blijven is dit de manier om het te doen: word lid van de NLJUG op www.nljug.org. Het lid-maatschap kost € 39,- (incl. 6% BTW)
Voordelen van lidmaatschap
WIL JIJ IN 4 UUR ALLES TE WETEN KOMEN OVER DE LAATSTE IT TRENDS?
Kom dan op dinsdag 4 juni om 15:00 uur naar XebiCon in Fort Voordorp.
XebiCon brengt je helemaal up-to-date op het gebied van Agile, Big
Data, Continuous Delivery, DevOps, Mobile en Single Page Webapps!
XebiCon heeft ook dit jaar een spraakmakend programma met nationale en internationale sprekers. De conferentie start spectaculair met keynote speaker en extreem avonturier, Marc Sluszny. Zijn motto is:
Verwezenlijk je dromen, verleg je grenzen, overwin je angsten.
De conferentie zal worden afgesloten met de Agile Troublemaker en bedenker van Behavior Driven Development, Dan North!
Voor slechts € 50,- incl. BTW kun je deelnemen aan XebiCon. Op xebicon.nl vind je meer informatie over het programma en de locatie. Schrijf je snel in, want het aantal plaatsen is beperkt.
Graag tot ziens op XebiCon 2013!
Registratie op www.xebicon.nl Op www.xebicon.nl vind je ook informatie over het programma en de locatie. WORDT GEORGANISEERD DOOR XEBIA
#xebicon of volg @xebia
Xebicon 2013 adv-1.indd 1 26-04-13 08:47
Volledige samenwerking met DevOps
Bouw je eigen robot
Spoedcursus MongoDB
Apache Camel: voor complete integratie
mei/juni 2013 nr. 1
Onafhankelijk tijdschrift voor de Java-professional
Java Magazineis TERUG
Features
MAGAZINE
Gratis toegang tot NLJUG events
Gratis toegang tot NLJUG University sessions
Gratis 4 maal per jaar het Java Magazine
Werf.indd 4 5/1/13 2:22 PM
JAVA magazine | 01 2013
INHOUDSOPGAVE
06 SPRING CONFIGURATIE Met @Configuration
10 BOEkBESPREkING Java Application Architecture
11 COLUMN Zieners
12 DEVOPS Het gehele implementatietraject
16 APACHE CAMEL Effectieve EAI
22 MONGODB De database van de toekomst?
27 LIBRARIES Libraries uitgelicht
28 RASPBERRY PI Ja-Pi, de eerste mobiele enterprise-server
32 GRAFISCHE USER INTERFACE Met Java en Sikuli
36 BESTUURSCOLUMN NLJUG Van het bestuur
38 TIPS & TRICkS Meer met Maven
Schrijven voorjava Magazine?
Ben je een enthousiast lid van nLjUg en zou je graag willen bijdragen aan java Magazine? of ben je werkzaam in de iT en zou je vanuit je functie graag je kennis willen delen met de nLjUg-community? Dat kan! neem contact op met de redactie, leg uit op welk gebied je expertise ligt en over welk onderwerp je graag zou willen schrijven. Direct artikelen inleve-ren mag ook. Mail naar [email protected] en wij nemen zo spoedig mogelijk contact met je op.
Effectieve EAI met Apache CamelRequirements in IT-projecten en
requirements aan de integratie
met andere systemen zijn gevoelig
voor verandering. Snel reageren op
deze veranderingen kan cruciaal
zijn voor een succesvol project.
Enterprise Application Integration
(EAI) biedt alle kennis, technologie
en best practices, om uitbreid-
bare en onderhoudbare integratie
oplossingen te bouwen op een pro-
ductieve manier. In dit artikel zal
Apache Camel gebruikt worden om
te kunnen voldoen aan complexe
integratie vraagstukken.
28Ja-Pi, de eerste mobiele enterprise-serverEnkele leden van de redactiecommissie zijn gek van de Raspberry Pi en wilden wel
eens kijken wat er allemaal mogelijk is met deze mini-computer. Java Magazine zocht
uit hoe je met Java enkele led’s via een website kunt aansturen. Daarnaast heeft Ja-Pi,
de eerste mobiele Java enterprise-server, het levenslicht gezien. Alles is stap voor stap
uitgelegd, zodat je thuis ook zelf aan de slag kan gaan met Raspberry Pi.
16
12DevOps, de ‘zachte’ kantDevOps is een samenvoeging van
development en operations. Met
DevOps is er samenwerking moge-
lijk tussen ontwikkeling en beheer
om continuous delivery in een
organisatie te laten slagen. DevOps
implementeren in een organisatie
kent ‘harde’ en ‘zachte’ aspecten.
Java Magazine verkende de zachte
aspecten van een DevOps-imple-
mentatietraject aan de hand van
eigen ervaringen.
Inhoud.indd 5 5/1/13 2:25 PM
06
JAVA MAGAZINE
Spring configuratie met @ConfigurationSpring configureren via een geannoteerde Java klasse. Voor de één een mooie oplossing en voor de ander is het een gruwel. Dit artikel gaat niet over deze discussie, maar over de werking en mogelijkheden van het configureren van de Spring container door middel van de @Configuration annotatie.
Dit artikel is gebaseerd op ervaringen met het gebruik hiervan en op bestudering van de javadocs van de besproken annotaties en classes. Doel is dan ook niet om volledig te zijn, daar biedt Spring voldoende docu-mentatie voor. Het doel is om een eenvoudig overzicht te hebben van de mogelijkheden, punten waar op te letten en mogelijk toepas-sing van de functionaliteit. Ook zullen we belichten hoe een Spring container omgaat met een mix van XML en op annotaties ge-baseerde configuratie. Als laatste tonen we hoe in een webcontext de Spring container te instantiëren wanneer je een geannoteerde configuratie hebt. De @Configuration annotatie biedt de moge-lijkheid om naast of zonder de reguliere XML configuratie een simpele Java klasse te anno-teren met @Configuration. In deze Java klasse kun je de Beans configureren zoals je in XML zou doen. Deze geannoteerde Java klasse is zelf gewoon een Bean zoals een @Component en kan als zodanig gebruikt worden. Sinds Spring 3.1 zijn er geen beperkingen tegenover XML configuratie, alles wat je in XML kunt definiëren, kun je dus ook in een Java klasse annoteren met @Configuration. Enkele voordelen van het configureren op deze manier zijn onder andere dat de confi-guratie door middel van Java geschreven is, mogelijke fouten eerder zichtbaar zijn (tijdens compileren), het mogelijk is Beans van een anonymous inner type te declareren en het conditioneel creëren van een Bean. De contai-ner kan prima overweg met een mix van XML
Ben Ooms is een gepassioneerde Java senior software engineer werkzaam bij Sogeti. en geannoteerde configuratie, het ene sluit
het andere niet uit. Om Java configuratie te kunnen gebruiken, moet naast de reguliere Spring afhankelijkhe-den ook CGlib toegevoegd worden wanneer je een Spring versie onder 3.2 gebruikt. Dit komt omdat CGlib door Spring als een optionele af-hankelijkheid gedefinieerd is. Naast Java con-figuratie wordt CGlib ook door Spring AOP ge-bruikt. De reden waarvoor CGlib noodzakelijk is, is omdat de @Configuration geannoteerde klasse een gewone bean is die daarnaast ook de context, scope en Bean semantiek moet weten. Hiervoor maakt Spring een CGlib proxy voor elke @Configuration Bean aan. Vanaf Spring 3.2 is deze afhankelijkheid niet meer nodig, en is de CGlib code van versie 3.0 geïntegreerd in Spring en te vinden in de org.springframework.cglib package. Doordat CGlib tijdens het opstarten dyna-misch functionaliteit toevoegt, zijn er twee eisen waar een @Configuration geannoteerde klasse aan moet voldoen: de klasse mag niet final zijn en er moet een default no args constructor zijn. De simpelste form kan er zo uitzien:
Package com.foo.confi g;@Confi gurationpublic class MyConfi g{public MyConfi g(){}@Bean coffeeBean(){ Return new Coffee-Bean();}}
Spring2kolom.indd 6 5/1/13 2:31 PM
JAVA magazine | 01 2013
Spring configuratie
Spring configuratie met @configuration
In XML zou de configuratie er zo uitzien:
Om deze configuratie te laden in een XML geconfigureerde container, moet de wel-bekende (als je al met Spring annotaties werkt) context:component-scan of de context:annotation-config tag aanwezig zijn. Zoals je misschien al verwacht, is een @Configuration geannoteerde klasse inderdaad gewoon een bean zoals een @Component of soortgelijke geannoteerde klasse. Als je met de context:component-scan wil werken is dit in je XML voldoende:
Zoals getoond in bovenstaand voorbeeld, kun je in een bestaande XML gebaseerde Spring configuratie door middel van de context:component-scan Java gebaseerde configuratie toevoegen. Wil of kan je de component-scan niet gebruiken, dan is dat ook mogelijk door middel van de context: annotati-on-config en voeg je deze tag toe in je XML.
Daarnaast is het ook mogelijk om alleen op annotatie gebaseerde configuratie in te laden. Spring heeft hiervoor een tweetal bootstrap classes. De AnnotationConfigApplication-Context en de web versie AnnotationConfig-WebApplicationContext.De AnnotationConfigApplicationContext kan op drie manieren geïnstantieerd worden. De eerste manier lijkt op de manier zoals je dit met een XML gebaseerde Spring configuratie zou doen:
De tweede manier gebruikt de default con-structor en het scanning mechanisme:
<beans> <bean id=”coffeBean” class=”com.foo.config.CoffeBean” > </></ beans>
<context:component-scan />
<context:annotation-config />
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationCon-text(Configuratie.class);
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationCon-text();ctx.scan(“de.package.die.je.wil.scan-nen”);ctx.refresh();
Als laatste de manier die erg op de tweede manier lijkt maar de register methode gebruikt om de container te voorzien van de configuratie:
De AnnotationConfigWebApplicationContext is op dezelfde manieren te instantiëren als de XML variant. De op annotaties gebaseerde configuratie heeft twee annotaties om andere configuraties in te laden. Als je een andere Java geannoteerde configuratie wilt inladen, gebruik je de @Import annotatie. Met @ImportResource kun je een XML configu-ratie inladen. Tijdens het schrijven van de voorbeeld code, kwam ik er achter dat je hiermee moet uitkijken wanneer je meer dan een @Configuration geannoteerde klasse heb. Doordat een Java klasse met de @Configura-tion onderhuids ook een gewone Bean is, kun je een andere configuratie klasse ook door middel van @Autowired injecteren. Dit heeft als voordeel dat het meteen duidelijk is waar de gebruikte Bean geconfigureerd wordt. Het nadeel is echter dat hierdoor de beide configuratie klassen tightly coupled zijn. Een voorbeeld hiervan is bijvoorbeeld:
Externe properties kunnen geladen worden door middel van de @PropertySource annota-tie of door middel van de @Value annotatie met een geconfigureerde propertyPlacehol-derConfigurator. Als je de @PropertySource manier gebruikt, moet je ook een Spring Environment laden door middel van bijvoor-beeld @Autowired in de configuratie klasse. Daarna kun je de property inlezen met de getProperty(‘naam”) van de geïnjecteerde Environment klasse. Belangrijk om te weten is dat wanneer twee ingeladen properties bestanden dezelfde property bevatten, de waarde van de laatst geladen properties bestand gebruikt wordt en dat de properties alleen binnen een @Bean definitie te gebrui-ken zijn.
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationCon-text();ctx.register(ConfigA.class);ctx.register(ConfigB.class);ctx.refresh();
Gegeven een xml configuratie genaamd springapp.xml@Configuration@ImportResource(“springapp.xml”)public class MyConfig{rest van de klasse...
Spring2kolom.indd 7 5/1/13 2:31 PM
08
JAVA magazine
Met de PropertyPlaceholderConfigurator heb je twee keuzes. Als deze al in een XML gedefinieerd wordt, kun je direct aan de slag met de @Value annotatie om properties in te lezen. Mocht die er niet zijn, dan kun je deze ook instantiëren in de Java configuratie klasse. Om dit te doen moet je op klasse niveau door middel van de @PropertySource annotatie de locatie van het properties be-stand, een PropertyPlaceholderConfigurator bean definiëren en properties inlezen met @Value.Sinds Spring 3.1 kun je verschillende profie-len gebruiken. Met een profile creëer je een logisch bij elkaar horende Bean verzameling. Deze verzameling wordt alleen geladen wan-neer het profiel als actief wordt aangemerkt. Het activeren van een profile kan door middel van het toevoegen van een System property genaamd spring.profiles.active met als waarde een of meerdere profiel namen, of door de methode setActiveProfile aan te roepen. Vanaf Spring 3.1 is voor de XML versie aan de beans tag het attribuut profile gekomen en in een op basis van annotaties geconfigureerde container kun je de @Profile annotatie toevoegen. Interessant aan de profielen is dat je deze runtime kan laden.Zoals je kunt zien is de flexibiliteit erg groot
Gegeven een property file genaamd props.properties met een key genaamd propKey
@Configuration@propertySource(“props.properties”)public class MyConfig{@Autowired Environment env
@Bean InjectedBean injectedBean(){ InjectedBean b = new Inject-edBean(); b.setProp(env.getProper-ty(“propKey”)); return b;}rest van de klasse...
@Configuration@profile(“st”)public class MyConfig{rest van de klasse...// Profiel laden in contextApplicationContext ctx = new annota-tionConfigContext();ctx.setActiveProfile{“st”);ctx.refresh();
en kun je een Java configuratie op veel verschillende manieren gebruiken. Je kunt bijvoorbeeld binnen een bestaande XML geconfigureerde container met de compo-nent-scan of annotation-config Java confi-guratie toevoegen, of een bestaande XML gebaseerde container ombouwen tot een op annotatie gebaseerd container door gebruik te maken van de @ImportResource om zodoende een geleidelijke transitie te kun-nen maken. Na het maken van de voorbeeld code ben ik er achter gekomen dat hoewel een mix tussen XML en geannoteerde goed te doen is het de onderhoudbaarheid niet ten goede komt. Zeker wanneer je Spring profielen, XML en geannoteerde configura-tie combineert, moet je de geconfigureerde container goed testen op de aanwezigheid van de door jou verwachte Beans.
Beans zijn te definiëren door de @Bean annotatie toe te voegen aan een methode. Het interessante van een Bean annotatie is dat deze ook gedeclareerd kunnen worden in een niet @Configuration geannoteerde klasse. Let er wel op dat als de Beans ge-declareerd worden in een klasse die niet de annotatie @Configuration heeft, de scope niet gerespecteerd wordt.
De optionele attributen van de @Bean an-notatie zijn name, autowire, initmethod en destroymethod. Als er geen specifieke naam gegeven is aan de bean zal de naam
Het proJect kun Je direct gebruiken Als een spring sAndbox om met spring te experimente-ren.
Spring2kolom.indd 8 5/1/13 2:31 PM
Spring configuratie
JaVa magazine | 01 2013
hetzelfde zijn als de method. Dit is te veranderen door het attribuut name toe te voegen. Interessant is dat de name attri-buut een array van Strings accepteert om dus meerdere aliassen toe te kennen aan de Bean. Met het autowire attribuut geeft men aan of de bean attributen automatisch ge-injecteerd moeten worden. Standaard staat dit uit. De mogelijke andere waarden zijn net als bij een XML geconfigureerde contai-ner injectie door middel van bean type of naam. Met de init methode parameter kun je aangeven welke methode aangeroepen moet worden na instantiëring van de bean. De bruikbaarheid hiervan is discutabel, want hetzelfde kan worden gedaan door in de Bean methode body de bewuste methode aan te roepen op het object.
De destroy method parameter is wel iets bruikbaarder. Hiermee kun je, zoals de naam al aanduidt, aangeven welke method moet worden aangeroepen wanneer de Bean ge-destroyed wordt. Als je deze parameter niet meegeeft, gaat de Spring container standaard bij het destroyen op zoek naar een publieke no arg methode close() en voert het deze uit. Deze standaard kun je overrulen door een lege String destroy methode naam mee te geven. Wanneer je dit doet zal de aanwezige
close methode niet aangeroepen worden. In de javadoc staat een specifieke uitzon-dering waar je op moet letten wanneer je een Bean definieert die een BeanFactoryPo-stProcessor type retourneert. Omdat deze Beans meestal zeer vroeg in de container lifecycle benodigd zijn, kunnen ze storend werken bij het verder instantiëren van andere Beans. Het advies is dan ook om deze type Beans als static te definiëren. Mocht de Spring container deze type Beans instantiëren vanuit een methode die niet static is, dan zal er een waarschuwing in de log vermeld worden. Nadeel is echter dat deze Beans niet voor Bean scoping of AOP in aanmerking komen wanneer ze door middel van een static methode zijn geïnstantieerd.
Ik hoop dat je met dit artikel een goede indruk hebt gekregen van de mogelijkheden die beschikbaar zijn wanneer je Spring wil gebruiken met een configuratie door middel van annotaties. Op bitbucket kun je een ma-ven eclipse project uitchecken op https://bitbucket.org/bendh/spring-configuration-sandbox waarbij de in dit artikel besproken mogelijkheden gedemonstreerd worden. Het project kun je direct gebruiken als een Spring sandbox om met Spring te experi-menteren.
Ben jij ook eenChampions League speler?
Kijk voor onze vacatures op pagina 20/21 van dit magazine.
Advertentie
Spring2kolom.indd 9 5/1/13 2:31 PM