TOP

Aspect Oriented Programming (AOP) σε Spring

Σε αυτό το άρθρο θα δούμε πως μπορούμε να χρησιμοποιήσουμε τα Annotations του AspectJ μαζί με Spring AOP για να αναχαιτίσουμε μεθόδους και να τρέξουμε κώδικα που χρειαζόμαστε πριν ή μετά την αναχαιτισμένη μέθοδο. Αυτή η τεχνική μας επιτρέπει να εκτελούμε διαδικασίες όπως Logging, Transactions και Profiling χωρίς να χρειαστεί να αλλάξουμε τον υπάρχων κώδικα.

Προαπαιτούμενα

1. pom.xml Εισάγουμε στο pom.xml τα παρακάτω:

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-aop</artifactId>
	<version>${spring.version}</version>
</dependency>

<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjrt</artifactId>
	<version>1.6.11</version>
</dependency>

<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjweaver</artifactId>
	<version>1.6.11</version>
</dependency>

2. root-context.xml

Προσθέτουμε την ακόλουθη γραμμή ώστε ο αυτόματος proxy να μπορεί να ανακαλύψει τα beans που χειρίζεται το Spring. Επίσης δηλώνουμε το Bean το οποίο θα χρησιμοποιεί τα Annotations του AspectJ για να αναχαιτίσει μεθόδους που έχουμε ήδη στον κώδικα.

<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- Bean Used for AOP logging -->
<bean id="aopConfig" class="com.gr.zenika.log.AOPConfig" name="aopConfig" />

3. servlet-context.xml Θα πρέπει επίσης να προσθέσουμε την ίδια γραμμή στο servlet-context.xml εάν επιθυμούμε να αναχαιτίσουμε Controllers του Spring.

<context:component-scan base-package="com.gr.zenika.aopexample" />
<aop:aspectj-autoproxy proxy-target-class="true"/>

Υπάρχων κώδικας

Ας υποθέσουμε ότι έχουμε ένα απλό service του οποίου τις μεθόδους θέλουμε να αναχαιτίσουμε

package com.gr.zenika.aopexample.services;
@Service
public class MyService {
       public void doSomething(){
             System.out.println("doSomething() is running ");
       }
       public String doSomethingAndReturn(){
             System.out.println("doSomethingAndReturn() is running ");
             return "something";
       }
}

Aspect

Έπειτα δημιουργούμε την κλάση AopConfig που δηλώσαμε ως bean παραπάνω. Σε αυτή την κλάση θα δώσουμε το Annotation @Aspect. Επειδή η κλάση αυτή είναι δηλωμένη στο root-context.xml ώς bean αυτό σημαίνει ότι μπορεί να την διαχειριστεί το Spring και κάνουμε @Autowired ότι χρειαζόμαστε

@Aspect
public class AOPConfig {
    private static Logger logger = LoggerFactory.getLogger(AOPConfig.class);
    ...
}

Ας εμπλουτίσουμε την κλάση με τα διάφορα Annotations του AspectJ ανάλογα με το τι θέλουμε να κάνουμε και με ποιον τρόπο θέλουμε να αναχαιτίσουμε τις μεθόδους.

@Before
Για την περίπτωση που θέλουμε να τρέξουμε μία διαδικασία πριν από την μέθοδο.

@Before("execution(*  com.gr.zenika.aopexample.services.MyService.doSomething(..))")
public void interceptBefore(JoinPoint point) {
      logger.debug("AOP: method {} was called", point.getSignature().getName());
}

Αν τρέξουμε το project και καλέσουμε την μέθοδο doSomething() θα δούμε ότι στην κονσόλα θα τυπωθεί

AOP: method interceptBefore was called
doSomething() is running

που σημαίνει ότι η μέθοδος doSomething() αναχαιτήστικε και πριν από αυτή έτρεξε η interceptBefore. Κατ’ αντιστοιχία λειτουργούν και οι υπόλοιπες περιπτώσεις.

@After
Για την περίπτωση που θέλουμε να τρέξουμε μία διαδικασία μετά από την εκτέλεση μίας μεθόδου. Πολύ χρήσιμο σε περίπτωση Logging.

@After("execution(*  com.gr.zenika.aopexample.services.MyService.doSomething(..))")
public void interceptAfter(JoinPoint point) {
      logger.debug("AOP: method {} was called", point.getSignature().getName());
}

Output:

doSomething() is running
AOP: method interceptAfter was called

@AfterReturning
Σε περίπτωση που θέλουμε να χρησιμοποιήσουμε το αποτέλεσμα που επιστρέφει μία μέθοδος


@AfterReturning(pointcut = "execution(* com.gr.zenika.aopexample.services.MyService.doSomethingAndReturn(..))", 
			returning = "result")
	public void interceptReturn(JoinPoint point, Object result) {
		logger.debug("AOP: method {} was called", point.getSignature().getName());
		
		logger.debug("AOP: and returned-> " + result);				
	}

Output:

doSomethingAndReturn() is running
AOP: method interceptReturn was called
AOP: and returned-> something

@Around
Σε περίπτωση που θέλουμε να τρέξουμε κομμάτια κώδικα πριν και μετά ακριβώς από μία μέθοδο. Πολύ χρήσιμο σε περίπτωση που θέλουμε να κάνουμε κάποιου είδος profiling όπως μπορούμε να δούμε στο παράδειγμα παρακάτω:


@Around("execution(* com.gr.zenika.aopexample.services.MyService.doSomethingAndReturn(..))")
	public Object interceptAround(ProceedingJoinPoint pjp) throws Throwable {
		
		logger.debug("AOP: method {} was called", pjp.getSignature().getName());
		long start = System.currentTimeMillis();
		Object result = pjp.proceed();
		long elapsedTime = System.currentTimeMillis() - start;
		logger.debug("AOP: execution time: " + elapsedTime + " milliseconds.");
		
		return result;
	}

Output:

AOP: method interceptAround was called
doSomethingAndReturn() is running
AOP: execution time: 7 milliseconds.

Προσοχή:Mε το Annotation @Around θα πρέπει οπωσδήποτε η μέθοδός μας να επιστρέφει ένα Object το οποίο το γεμίζουμε όταν καλούμε την pjp.proceed(). Αν δεν το κάνουμε αυτό η μέθοδος doSomethingAndReturn θα επιστρέψει null!

Share
TOP

Χρήση Hibernate OneToMany

Σε αυτό το παράδειγμα ας υποθέσουμε ότι έχουμε Projects που το κάθε ένα έχει πολλούς μηχανικούς. Πρόκειται για μία σχέση One to Many μεταξύ της οντότητας Project και της οντότητας Engineer. Παρακάτω θα δούμε πως μπορούμε εύκολα με Annotations να εκφράσουμε αυτή την σχέση σε Hibernate και Java.

(συνέχεια…)

Share
TOP

Spring Framework 3.2 goes GA

Ενα χρόνο μετά απο το Spring 3.1 ο Juergen Hoeller ανακοίνωσε την έκδοση 3.2 στο blog της springsource

Κύρια χαρακτηριστηκά είναι

  •  Refined Java SE 7 support
  •  Concurrency refinements across the framework
  •  Allowing for @Autowired and @Value to be used as meta-annotations
  •  Support for custom @Bean definition annotations in @Configuration classes
  •  Asynchronous MVC processing on Servlet 3.0, with Spring MVC handler methods being able to return Callables and DeferredResults
  •  Inclusion of the formerly-standalone Spring MVC Test project, allowing for first-class testing of Spring MVC applications
  •  Support for loading WebApplicationContexts in the TestContext framework, and further improvements for web application testing
  •  Early support for JCache 0.5 (JSR-107) as a backend for Spring’s cache abstraction

Για περισσότερες λεπτομέρειες μπορείτε να δείτε το σχετικό άρθρο της springsource εδώ

Share
TOP

SCRIPTED: A JAVASCRIPT EDITOR FROM VMWARE

The first version of the Scripted code editor has been released this week on github: https://github.com/scripted-editor/scripted.

Although Scripted is a general purpose code editor, the initial focus is building a great JavaScript editing experience. Scripted itself is built entirely in JavaScript and HTML/CSS. It is a browser-based editor that runs locally on a developer’s machine with a Node.js instance being used to serve the editor code and perform the editor operations. The only pre-req for running Scripted is that you have a recent version of Node.js installed (we are testing with Node 0.8.11 right now). Scripted reuses the editor component from Eclipse Orion.

Ream More on SPRINGSOURCE BLOG

 

Share
TOP

Missing indirectly referenced artifact javax.transaction:jta:jar:1.0.1B:compile

Λόγω της αλλαγής της αδειοδότησης το JTA δεν είναι διαθέσιμο στα κεντρικά αποθετήρια του maven. Οπότε αν έχουμε ένα dependency που το χρειάζεται όπως πχ το hibernate-annotations τότε πρέπει να το εγκαταστήσουμε με το χέρι.

Κατεβάζουμε αρχικά απο το http://download.java.net/maven/2/javax/transaction/jta/1.0.1B/ το jta-1.0.1B.jar και το βάζουμε σε μια διαδρομή στο δίσκο, έστω ότι είναι η /tmp  (c:\temp στα windows)

Μετά τρέχουμε το


mvn install:install-file -DgroupId=javax.transaction -DartifactId=jta -Dversion=1.0.1B -Dpackaging=jar -Dfile=/tmp/jta-1.0.1B.jar

ή στα windows


mvn install:install-file -DgroupId=javax.transaction -DartifactId=jta -Dversion=1.0.1B -Dpackaging=jar -Dfile=c:/temp/jta-1.0.1B.jar

Αν δούμε το μαγικό

 [INFO] ————————————————————————

[INFO] BUILD SUCCESSFUL

[INFO] ————————————————————————

Τότε είμαστε έτοιμοι!

Share
TOP

Δημιουργία συμπιεσμένου ZIP αρχείου με Java

Αυτό το χρειάστηκα σήμερα το πρωί. Η φιλοσοφία είναι ότι έχουμε να διαχειριστούμε κάποια αρχεία σε ένα ή παραπάνω φακέλους στο δίσκο και πρέπει να δημιουργήσουμε ένα συμπιεσμένο zip αρχείο με τα αρχεία αυτά.

Η λύση είναι αρκετά απλή.

  1. Παίρνουμε τις διαδρομές των αρχείων και τις βάζουμε σε ένα collection (Array πχ)
  2. Ανοίγουμε ένα output stream στο δίσκο που του “δίνουμε zip ιδιότητες”
  3. Διαβάζουμε ένα-ένα τα αρχεία και τα βάζουμε στο  output stream
  4. Κλείνουμε το stream
Share
TOP

Java 7 has released!

Και εγέννετω φώς! Μετά απο χρόνια έρευνας και προσπάθειας καθώς και μεγάλης βοήθειας απο την κοινότητα, η ORACLE (SUN) επιτέλους έθεσε σε την 28η Ιουλοίου 2011 κυκλοφορία την καινούργια έκδοση Java 7.

Αυτό το release περιέχει νέα language features (JSR 334), υποστήριξη για dynamic languages (JSR 292), ένα νέο multicore-ready API (JSR 166), νέο I/O APIs (JSR 203), και πολλά άλλα χαρακτηριστικά για τα οποία μπορείτε να διαβάσετε εδώ http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html

Τα release notes θα τα βρείτε εδώ http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-429209.html

Share
TOP

Εγκατάσταση σε UBUNTU του Eclipse – Spring Tool Suite (STS)

Δε νομίζω ότι υπάρχει κάποιος από εμάς που να μην γνωρίζει για το Eclipse. Το συγκεκριμένο περιβάλλον ανάπτυξης ούτως ή άλλως δε χρειάζεται ιδιαίτερες συστάσεις. Οι γλώσσες προγραμματισμού που υποστηρίζει είναι πρακτικά απεριόριστες (χάρη σε αμέτρητα plugins που έχουν βγεί) ενώ τις δυνατότητες επεκτασιμότητάς του έχουν χρησιμοποιήσει διάφορες τεχνολογίες. Σε αυτό το πλαίσιο η Springsource δημιούργησε ένα ξεχωριστό περιβάλλον ανάπτυξης για όλη τη γκάμα των τεχνολογιών της, το Spring Tool Suite (STS), που κουμπώνει πάνω στο Eclipse.

Το STS το έχουμε δει και σε προηγούμενα άρθρα μας. Εδώ θα δούμε πώς εγκαθίσταται σε ένα περιβάλλον Ubuntu σε λίγα, απλά βήματα.

(συνέχεια…)

Share
TOP

Εγκατάσταση Apache Directory Server (ApacheDS) σε UBUNTU

Ο ApacheSD είναι μια ανερχόμενη δύναμη στους Directory Servers, είναι Java based και χρησημοποιεί το γνωστό framework Spring για την λειτουργεία του.

Η Εγκαταστασή του στο Ubuntu είναι αρκετά εύκολή υπόθεση.

Προαπαιτούμενα

Πρέπει να υπάρχει στο σύστημα Java έκδοση 5 ή μεγαλύτερη. Προτείνω την SUN-JAVA και ότι το OpenJDK

Για να το ελενξουμε αυτό δίνουμε

java -version

και περιμένουμε να δούμε κάτι παρόμοιο με το παρακάτω

java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)

Αν λοιπον δεν είναι εγκατεστημένη τότε δίνουμε το παρακάτω στην κονσόλα

sudo apt-get -y install maven2 sun-java6-jdk java-common

(συνέχεια…)

Share
TOP

How to reference Spring Beans from Everywhere!

Λοπόν, με αφορμή κάτι που με ταλαιπωρούσε γράφω τον παρακάτω οδηγό έτσι ώστε να δείξω πως μπορείς να καλέσεις ενα Spring Bean απο πρακτικά οπουδήποτε.

Ουσιαστικά έχουμε τις εξής περιπτώσεις περιπτώσεις για να καλέσουμε ένα bean

  1. Σε Spring non Web Application
  2. Σε Spring Web Application
    1. Μέσα απο κάποιον controller
    2. Μέσα σε κάποιο servlet
    3. Μέσα σε κάποιο implementation ή οποιαδήποτε άλλη Business Logic Class (aka μια απλή java class)

Θα τις πάρουμε λοιπόν μία-μία για να δούμε πως θα δουλέψουμε.

Πρώτα όμως θα φτιάξουμε ένα Bean το οποίο και θα καλούμε κάθε φορά μέσα στο κώδικά μας.

Το Spring Bean δεν είναι τίποτε άλλο απο ένα POJO (Plain Old Java Object) το οποίο με το που γίνεται initialize το Spring Context οι setters του “γεμίζουν” με ό,τι ορίζουμε εμείς στο context.xml (το κύριο xml που ορίζοντε όλοι οι παράμετροι του Spring, θα μπορούσε να λέγεται και διαφορετικά)

Στο παράδειγμά μας θα φτιάξω ένα Constants Bean το οποίο θα περιέχει πχ “σταθερές” που θέλω να χρησημοποιώ παντού και να τις ελέγχω απο το XML

(συνέχεια…)

Share