Spiegazione laica per qualcuno che è nuovo ai concetti AOP. Questo non è esaustivo, ma dovrebbe aiutare a cogliere i concetti. Se hai già familiarità con il gergo di base, puoi smettere di leggere ora.
Supponiamo di avere una normale classe Employee e di voler fare qualcosa ogni volta che vengono chiamati questi metodi.
class Employee{
public String getName(int id){....}
private int getID(String name){...}
}
questi metodi sono chiamati JoinPoints . Abbiamo bisogno di un modo per identificare questi metodi in modo che il framework possa trovare i metodi, tra tutte le classi.metodi che ha caricato. Quindi scriveremo un'espressione regolare per abbinare la firma di questi metodi. Anche se c'è di più come vedrai di seguito, ma vagamente questa espressione regolare è ciò che definisce Pointcut . per esempio
* * mypackage.Employee.get*(*)
Il primo * è per il modificatore public / private / protected / default. Il secondo * è per il tipo restituito del metodo.
Ma poi devi anche dire altre due cose:
- Quando deve essere intrapresa un'azione, ad esempio prima / dopo l'esecuzione del metodo O in caso di eccezione
- Cosa dovrebbe fare quando corrisponde (forse basta stampare un messaggio)
La combinazione di questi due si chiama Consigli .
Come puoi immaginare, dovresti scrivere una funzione per poter fare # 2. Quindi questo è come potrebbe apparire per le basi.
Nota: per maggiore chiarezza, utilizzare la parola REGEX invece di * * mypackage.Employee.get*(*)
. In realtà la piena espressione va nella definizione.
@Before("execution(REGEX)")
public void doBeforeLogging() {....} <-- executed before the matching-method is called
@After("execution(REGEX)")
public void doAfterLogging() {....} <-- executed after the matching-method is called
Una volta che inizi a usarli un po ', potresti finire per specificare molti consigli @ After / @ Before / @ Around. Le ripetute espressioni regolari finiranno per rendere le cose confuse e difficili da mantenere. Quindi quello che facciamo, diamo solo un nome all'espressione e lo usiamo ovunque nella classe Aspect.
@Pointcut("execution(REGEX)") <-- Note the introduction of Pointcut keyword
public void allGetterLogging(){} <-- This is usually empty
@Before("allGetterLogging")
public void doBeforeLogging() {....}
@After("allGetterLogging")
public void doAfterLogging() {....}
A proposito, vorresti anche racchiudere l'intera logica in una classe, che si chiama Aspect e scriveresti una classe:
@Aspect
public class MyAwesomeAspect{....}
Per far funzionare tutte queste cose, dovresti dire a Spring di analizzare le classi per leggere, comprendere e agire sulle parole chiave @ AOP. Un modo per farlo è specificare quanto segue nel file xml di configurazione di primavera:
<aop:aspectj-autoproxy>