Sie sind auf Seite 1von 34

sytd htl krems - alauntalstrasse 29

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

8. Januar 2021
sytd htl krems - alauntalstrasse 29

1 AOP - Aspectoriented Programming


Aspekte
Aspektorientierte Programmierung
Pointcut Expression
Advice

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 8. Januar 2021


2/34
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 8. Januar 2021


3/34
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 — 8. Januar 2021


4/34
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 — 8. Januar 2021


5/34
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 — 8. Januar 2021


6/34
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 — 8. Januar 2021


7/34
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 — 8. Januar 2021


8/34
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 — 8. Januar 2021


9/34
sytd htl krems - alauntalstrasse 29

1 AOP - Aspectoriented Programming


Aspekte
Aspektorientierte Programmierung
Pointcut Expression
Advice

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 8. Januar 2021


10/34
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 — 8. Januar 2021


11/34
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 — 8. Januar 2021


12/34
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 — 8. Januar 2021


13/34
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 — 8. Januar 2021


14/34
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 — 8. Januar 2021


15/34
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 — 8. Januar 2021


16/34
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: Der Advice steuert
• Pointcut Expression: Ein Ausdruck zur Auswahl von
JoinPoints.

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 8. Januar 2021


17/34
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 — 8. Januar 2021
18/34
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 — 8. Januar 2021


19/34
sytd htl krems - alauntalstrasse 29

1 AOP - Aspectoriented Programming


Aspekte
Aspektorientierte Programmierung
Pointcut Expression
Advice

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 8. Januar 2021


20/34
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 — 8. Januar 2021


21/34
sytd htl krems - alauntalstrasse 29

AOP - Aspectoriented Programming

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 8. Januar 2021


22/34
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 — 8. Januar 2021


23/34
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 — 8. Januar 2021


24/34
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 — 8. Januar 2021


25/34
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 — 8. Januar 2021


26/34
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 — 8. Januar 2021


27/34
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 — 8. Januar 2021


28/34
sytd htl krems - alauntalstrasse 29

1 AOP - Aspectoriented Programming


Aspekte
Aspektorientierte Programmierung
Pointcut Expression
Advice

Dipl.-Ing. Paul Panhofer Bsc. — Spring Boot — 8. Januar 2021


29/34
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 — 8. Januar 2021


30/34
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 — 8. Januar 2021


31/34
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 — 8. Januar 2021


32/34
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 — 8. Januar 2021


33/34
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 — 8. Januar 2021


34/34