Sie sind auf Seite 1von 76

sytd htl krems - alauntalstrasse 29

Programmiertechniken in verteilten
Systemen
Dipl.-Ing. Paul Panhofer Bsc.

9. Dezember 2019
sytd htl krems - alauntalstrasse 29

1 IOC - Inversion of Control


Library vs. Framework
Framework Hook

2 CDI - Context and Dependency Injection


Spring Container
Qualifier
Lifecycle Hooks
Bean Scope

3 AOP - Aspectoriented Programming


Aspekte
Aspektorientierte Programmierung
Pointcut Expression
Advice

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


2/76
sytd htl krems - alauntalstrasse 29

IOC - Inversion of Control


Library vs. Framework

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


3/76
sytd htl krems - alauntalstrasse 29

IOC - Inversion of Control


Library vs. Framework

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


4/76
sytd htl krems - alauntalstrasse 29

IOC - Inversion of Control


Spring Framework

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


5/76
sytd htl krems - alauntalstrasse 29

IOC - Inversion of Control

Inversion of Control beruht auf dem Prinzip das der User-


code vom Framework aufgerufen wird und nicht vice
versa.

Ein Framework stellt sogenannte Hooks zur Verfügung, die


der Programmierer verwenden kann, um seinen Code in
das Framework einzufügen.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


6/76
sytd htl krems - alauntalstrasse 29

1 IOC - Inversion of Control


Library vs. Framework
Framework Hook

2 CDI - Context and Dependency Injection


Spring Container
Qualifier
Lifecycle Hooks
Bean Scope

3 AOP - Aspectoriented Programming


Aspekte
Aspektorientierte Programmierung
Pointcut Expression
Advice

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


7/76
sytd htl krems - alauntalstrasse 29

IOC - Inversion of Control


Framework Hook

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


8/76
sytd htl krems - alauntalstrasse 29

IOC - Inversion of Control


Framework Hook

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


9/76
sytd htl krems - alauntalstrasse 29

IOC - Inversion of Control


Framework Hook

Das Spring Framework verwendet in erster Linie


Annotationen als Hooks.

Hinweis: Nicht jede Anotation darf als Framework Hook


verstanden werden.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


10/76
sytd htl krems - alauntalstrasse 29

IOC - Inversion of Control


Framework Hook: Rest Resource

@RequestMapping(path="/branches")
@RestController // <-- Framework Hook
public class BranchResource implements Serializable{

@GetMapping(path="/{id}")
public ABranch read(@PathVariable Long id){
...
}

...

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


11/76
sytd htl krems - alauntalstrasse 29

IOC - Inversion of Control


Framework Hook: Exception Handling

public UserService implements Serializable{


...
public void unmarshal(String jsonMessage){
ObjectMapper mapper = new ObjectMapper();

try{
mapper.readValue(jsonMessage, User.class);
}catch(JsonProcessingException ex){
ex.printStackTrace();
log.error("invalid data");
}
}
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


12/76
sytd htl krems - alauntalstrasse 29

IOC - Inversion of Control


Framework Hook: Exception Handling

public UserService implements Serializable{


...
public void unmarshal(String jsonMessage) throws
JsonProcessingException{

ObjectMapper mapper = new ObjectMapper();


User user = mapper.readValue(jsonMessage,
User.class);

...
}
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


13/76
sytd htl krems - alauntalstrasse 29

IOC - Inversion of Control


Framework Hook: Exception Handling

@ControllerAdvice // <-- Framework Hook


public class JsonProcessingAdvice {

@ExceptionHandler(JsonProcessingException.class)
@ResponseBody
@ResponseStatus(HttpStatus.NOT_FOUND)
public String
jsonProcessingFailed(JsonProcessingException ex){
...
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


14/76
sytd htl krems - alauntalstrasse 29

IOC - Inversion of Control


Framework Hook: Service

@Service // <-- Framework Hook


public class DirectRabbitMQConsumer {

@RabbitListener(queues="htl.sytd")
public void listen(String message) throws
JsonProcessingException {
...
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


15/76
sytd htl krems - alauntalstrasse 29

1 IOC - Inversion of Control


Library vs. Framework
Framework Hook

2 CDI - Context and Dependency Injection


Spring Container
Qualifier
Lifecycle Hooks
Bean Scope

3 AOP - Aspectoriented Programming


Aspekte
Aspektorientierte Programmierung
Pointcut Expression
Advice

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


16/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection

CDI: Outsourcing the construction and management of


objects.

Pattern: Factory

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


17/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
Spring Container

Zur Implementierung von CDI greifen Spring Boot Anwen-


dungen auf den Spring Container - ApplicationContext -
zurück.

Der Spring Container ist für die Verwaltung von CDI Beans
verantwortlich.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


18/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
Spring Container - CDI Bean

CDI Beans sind im Grunde gewöhnliche Java Objekte.

Im Gegensatz zu anderen Java Objekten ist der Spring


Container für die Instanzierung und die Verwaltung von
CDI Beans verantwortlich.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


19/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
Spring Container - CDI Bean
CDI Beans sind Objekte die mit einer der folgenden Anno-
tationen deklariert wurden.

Hinweis: Die folgende Liste ist nur ein kleiner Auszug der
möglichen Annotationen.

@ControllerAdvise
@RestController
@Configuration
@Component
@Service
@Bean

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


20/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
Spring Container - CDI Bean

Der Spring Container ist für die Instanzierung von CDI


Beans verantwortlich.

Abhängigkeiten zu anderen Objekten müssen in CDI


Beans nicht definiert werden. Der Spring Container wurde
mit der Motivation entwickelt Abhängigkeiten selbst
aufzulösen.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


21/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection

@Service // 1.) CDI Bean


public class UserService implements Serializable {

@Autowired // 2.) Abhaengigkeit


public User user;

...

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


22/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
Spring Container

Der Spring Container versucht die bei der Instanzierung


auftretenden Abhaengigkeiten aufzuloesen, in dem er
unter den von ihm verwalteten CDI Beans nach jenem
Bean sucht, das dieselbe Schnittstelle implementiert bzw.
dieselbe Klasse hat wie die Abhängigkeit.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


23/76
sytd htl krems - alauntalstrasse 29

CDI - Dependency Injection

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


24/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection

@Service // Declare Object as CDI Bean


public class UserService implements Serializable{

@Autowired // Resolve Dependency


public User user;

...

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


25/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection

/*
* Search Codebase for a @Component or @Bean with same
* class or interface
*/
@Component
@Data
public class User implements Serializable{

private String firstName;


...
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


26/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
/*
* Search Codebase for a @Component or @Bean with same
* class or interface
*/
@Configuration
public class UserFactory{

@Bean("user")
public User createUser(){
return new User();
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


27/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
Spring Container

Findet der Spring Container keine Klasse bzw. zuviele


Klassen die der externen bzw. internen Schnittstelle der
Abhängigkeit entsprechen wird ein entsprechender
Fehler geworfen.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


28/76
sytd htl krems - alauntalstrasse 29

1 IOC - Inversion of Control


Library vs. Framework
Framework Hook

2 CDI - Context and Dependency Injection


Spring Container
Qualifier
Lifecycle Hooks
Bean Scope

3 AOP - Aspectoriented Programming


Aspekte
Aspektorientierte Programmierung
Pointcut Expression
Advice

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


29/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
Dependency Injection Failed

@Qualifier("admin")
@Component
@Data
public class Admin extends User{...}

@Qualifier("guest")
@Component
@Data
public class Guest extends User{...}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


30/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
@Service
public class UserService implements Serializable{

@Qualifier("admin")
@Autowired
public User admin;

@Qualifier("guest")
@Autowired
public User guest;

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


31/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
Declare own Qualifiers
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD, ElementType.METHOD,
ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface User {
String value();
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


32/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
Dependency Injection - Qualifier

@User("admin")
@Component
@Data
public class Admin extends User{...}

@User("guest")
@Component
@Data
public class Guest extends User{...}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


33/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
@Service
public class UserService implements Serializable{

@User("admin")
@Autowired
public User admin;

@User("guest")
@Autowired
public User guest;

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


34/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
@Configuration
public class UserFactory {

@Bean("admin") @User("admin")
public User createAdmin(){
return new Admin();
}

@Bean("user") @User("guest")
public User createGuest(){
return new Guest();
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


35/76
sytd htl krems - alauntalstrasse 29

1 IOC - Inversion of Control


Library vs. Framework
Framework Hook

2 CDI - Context and Dependency Injection


Spring Container
Qualifier
Lifecycle Hooks
Bean Scope

3 AOP - Aspectoriented Programming


Aspekte
Aspektorientierte Programmierung
Pointcut Expression
Advice

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


36/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


37/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
@Component
@Data
public class User implements Serializable{

private String firstName;

@PostConstruct
public void init(){ ... }

@PreDestroy
public void dispose(){ ... }

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


38/76
sytd htl krems - alauntalstrasse 29

1 IOC - Inversion of Control


Library vs. Framework
Framework Hook

2 CDI - Context and Dependency Injection


Spring Container
Qualifier
Lifecycle Hooks
Bean Scope

3 AOP - Aspectoriented Programming


Aspekte
Aspektorientierte Programmierung
Pointcut Expression
Advice

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


39/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
Bean Scope

Der Bean Scope bestimmt für CDI Beans die folgenden


Eigenschaften:
• Lebensdauer.
• Anzahl der Instanzen.
• Art des Zugriffs auf das Bean.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


40/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection
Bean Scope

Für CDI Beans können 2 Arten von Scopes definiert


werden. Defaultmäßig werden CDI Beans als Singletons
erzeugt.

• Singleton: Es wird nur eine Instanz des CDI Beans in


der gesamten Anwendung verwaltet.
• Protoype: Für jede Abhängigkeit wird eine neue
Instanz des CDI Beans generiert.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


41/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
//@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
//@Scope("singleton")
//@Scope("prototype")
@Component
public class User implements Serializable {
...
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


42/76
sytd htl krems - alauntalstrasse 29

CDI - Context and Dependency


Injection

@RunWith(SpringRunner.class)
class CDITest{

@Autowired
private ApplicationContext applicationContext;

public void testBeanScope(){


User user = applicationContext.getBean(User.class);
...
}
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


43/76
sytd htl krems - alauntalstrasse 29

1 IOC - Inversion of Control


Library vs. Framework
Framework Hook

2 CDI - Context and Dependency Injection


Spring Container
Qualifier
Lifecycle Hooks
Bean Scope

3 AOP - Aspectoriented Programming


Aspekte
Aspektorientierte Programmierung
Pointcut Expression
Advice

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


44/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


45/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


@Service
public class BankService {
...
public BigDecimal checkAccount(Long accountId){
// Transaction tr = appContext.getTransaction();
// tr.start();
BigDecimal value =
accountRepository.check(accountId);

// log.info("checked account {}", accountId);


// tr.commit();
return value;
}
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


46/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming

Die Bestandteile von Software können grob in 2 Kate-


gorien unterteilt werden.

• Komponenten, welche die funktionale Anforderun-


gen des Programms umsetzen.
• logische Aspekte, welche technische Anforderungen
wie Validierung oder Logging abbilden.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


47/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


Aspekte

Komponenten lassen sich in der Regel relativ leicht


modular gestalten.

Aspekte hingegen sind mit dem herkömmlichen,


objektorientieren Ansatz schwer zu isolieren.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


48/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


Aspekte

• Transaction Management
• Logging
• Performance Monitor
• Ecxeption Handling
• Security
• Audit Log Management

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


49/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


Aspekte

Die Zielsetzung der aspektorientierten Programmierung ist


die klare Trennung von Komponenten und Aspekten.

Ohne AOP liegt Code redundant vor. Wir sprechen in die-


sem Fall von Code Scattering. Die Kohäsion des Systems
leidet.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


50/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


Aspekte

Die Idee der Apektorientierten Programmierung ist es


Aspkete zu kapseln um sie anschließend in transparenter
Weise in den Anwendungscode zu integrieren.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


51/76
sytd htl krems - alauntalstrasse 29

1 IOC - Inversion of Control


Library vs. Framework
Framework Hook

2 CDI - Context and Dependency Injection


Spring Container
Qualifier
Lifecycle Hooks
Bean Scope

3 AOP - Aspectoriented Programming


Aspekte
Aspektorientierte Programmierung
Pointcut Expression
Advice

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


52/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming

AOP wird verwendet um verteilt vorkommende Aspekte


modular zu gestalten. AOP stützt sich dabei auf 2 Ent-
wurfsmuster: Proxy, Dekorator

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


53/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


AOP Implementierung - BankService
package at.htl.krems.service;

public class BankService {


...
public Double checkAccount(Long accountId){
// Transaction tr = appContext.getTransaction();
// tr.start();
Double value = accountRep.check(accountId);

// log.info("checked account {}", accountId);


// tr.commit();
return value;
}
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


54/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


AOP Implementierung - BankService

public interface IBankService extends Serializable {

Double checkAccount(Long accountId);

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


55/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


AOP Implementierung - BankService

public class BankService implements IBankService{


...
public Double checkAccount(Long accountId){
Double value = accountRep.check(accountId);
return value;
}
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


56/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


AOP Implementierung - BankService

public class TransactionAspect implements IBankService{

private IBankService bankService;

public Double checkAccount(Long accountId){


Transaction tr = AppContext.getTransaction();

tr.start();
Double value = bankService.checkAccount(accountId);
tr.commit();
}
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


57/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


AOP Implementierung - BankService

public class LoggingAspect implements IBankService{

private IBankService bankService;

private Logger logger = ...;

public Double checkAccount(Long accountId){


Double value = bankService.checkAccount(accountId);
logger.info("...");
}
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


58/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


AOP - Begriffe

• Target: Zielklasse, in der die Verwendung von


Aspekten benötigt wird.
• JointPoint: Ein Punkt der Programmausführung an
dem man eine bestimmte Methode eines Aspekts
ausführen möchte.
• Advice: Methode in einem Aspekt, die an einem
oder mehreren Join Points in den Programmablauf
eingebunden werden.
• Pointcut Expression: Ein Ausdruck zur Auswahl von
JoinPoints.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


59/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


@Component
@Aspect
public class TransactionAspect {
@Around("execution(* * checkAccount(..))")
public Object execute(ProceedingJointPoint jp){
Transaction tr = AppContext.getTransaction();
tr.start();

Object result = null;


try{
Object result = jp.proceed();
}catch(Exception e){tr.rollback();}

tr.commit();
return result;
}
}
Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019
60/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming

@Component
@Aspect // Definition eines Aspekts
public class TransactionAspect {

// Definition eines Advice


@Around("execution(..)"// PointCut Expression)
public Object execute(ProceedingJointPoint jp){
...
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


61/76
sytd htl krems - alauntalstrasse 29

1 IOC - Inversion of Control


Library vs. Framework
Framework Hook

2 CDI - Context and Dependency Injection


Spring Container
Qualifier
Lifecycle Hooks
Bean Scope

3 AOP - Aspectoriented Programming


Aspekte
Aspektorientierte Programmierung
Pointcut Expression
Advice

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


62/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


Pointcut Expression

Eine Pointcut Expression ist ein Ausdruck zur Auswahl von


JoinPoints.

Sie bestimmt für welche Methoden in welchen Klassen


der Advice des Aspekts angewandt werden soll.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


63/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


64/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


Syntax: Pointcut Expression

expression(
modifiers-pattern? // optional
return-type-pattern
declaring-type-pattern? // optional
method-name-pattern(param-pattern)
thorws-pattern? // optional
)

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


65/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


Syntax: Pointcut Expression

/*
* checkAccount Methode der BankService Klasse
*/
expression(
public
Double
at.htl.krems.service.BankService.checkAccount(..)
)

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


66/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


Syntax: Pointcut Expression

/*
* checkAccount Methode einer beliebigen Klasse
*/
expression(
public
Double
checkAccount(..)
)

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


67/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


Syntax: Pointcut Expression

/*
* beliebige Methode deren Name mit check beginnt
*/
expression(
*
*
check*(..)
)

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


68/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


Syntax: Pointcut Expression

/*
* checkAccount Methode aller Klassen in einem bestimmten
* Package
*/
expression(
*
*
at.htl.krems.service.*.*(..)
)

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


69/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


Syntax: Pointcut Expression

// keine Parameter
expression( public double checkAccount() )

// ein Parameter beliebigen Typs


expression( public double checkAccount(*) )

// beliebige Zahl von Parametern beliebigen Typs


expression( public double checkAccount(..) )

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


70/76
sytd htl krems - alauntalstrasse 29

1 IOC - Inversion of Control


Library vs. Framework
Framework Hook

2 CDI - Context and Dependency Injection


Spring Container
Qualifier
Lifecycle Hooks
Bean Scope

3 AOP - Aspectoriented Programming


Aspekte
Aspektorientierte Programmierung
Pointcut Expression
Advice

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


71/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


Advice

Advice sind Methoden in einem Aspekt, die an einem


oder mehreren Join Points in den Programmablauf
eingebun- den werden.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


72/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


@Component
@Aspect
public class LoggingAspect{

@Before("execution(* * checkAccount(..))")
public void logCall(JointPoint jp){
...
MethodSignature ms = (MethodSignature)
jp.getSignature();
log.info(ms);
..
Object[] args = jp.getArg();
...
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


73/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming

@Component
@Aspect
public class LoggingAspect{

@AfterReturning(
pointcut="execution(* * checkAccount(..))",
returning="value")
public void logCall(JointPoint jp, double value){
...
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


74/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming

@Component
@Aspect
public class LoggingAspect{

@AfterThrowing(
pointcut="execution(* * checkAccount(..))",
throwing="ex")
public void logCall(JointPoint jp, Throwable ex){
...
}
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


75/76
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming


@Component
@Aspect
public class TransactionAspect {
@Around("execution(* * checkAccount(..))")
public Object execute(ProceedingJointPoint jp){
...
Object result = null;
try{
result = jp.proceed();
}catch(Exception e)
{ ... }

return result;
}
}

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 9. Dezember 2019


76/76