Knowledge Transfer

Ethickfox kb page with all notes


Project maintained by ethickfox Hosted on GitHub Pages — Theme by mattgraham

Spring AOP

Идея АОП заключается в выделении сквозной функциональности в аспекты. Парадигма программирования, основанная на идее разделения основного и служебного функционала. Служебный функционал записывается в Aspect классы.

Spring AOP aims to provide a simple AOP implementation across Spring IoC to solve the most common problems that programmers face. It is not intended as a complete AOP solution – it can only be applied to beans that are managed by a Spring container.

Включение АОП - @EnableAspectJAutoProxy

Сущности

Сквозные задачи - это задачи распределенные по различным модулям программы, запутывающие тем самым код

Аспект - класс отвечающий за сквозную функциональность(cross-cutting logic) Например:

Pointcut - выражение, описывающее, где должен быть вызван Advice(AspectJ Excpression Language)

Pointcut designator - execution(..)

Joinpoint - точка, когда применяется Advice

Advice - метод, который находится в Аспекте и содержит сквозную логику

@Component
@Aspect
public class LoggingAspect { //Aspect

	@Before("execution(public String getBook())") //Pointcut
	public String log(){     //Advice
		...
	}
}

public class Library {

	public String getBook(){    //Joinpoint
		...
	}
}

Pointcut

Syntax:

execution(modifier return-type declaring-type method-name(parameters) throws)

execution(public String com.ethickeep.Library.getBook(String))

execution( * get*(..) || * set*(..)) - wildcard и комбинирование

Proxy

Cтруктурный паттерн проектирования, который позволяет подставлять вместо реальных объектов специальные объекты-заменители. Эти объекты перехватывают вызовы к оригинальному объекту, позволяя сделать что-то до или после передачи вызова оригиналу.

Если Spring аспекту нужно сделать proxy на какой-то объект, то он вначале смотрит на его интерфейсы, и если они есть, то использует Dynamic proxy(Internal Java Implementation), а если их нету, то CGLib. (С 3.2 версии CGLib идет вместе с Spring, поведение можно изменить, явно задав флаг proxy-target-class)

Spring может реализовывать АОП с помощью прокси либо через AspectJ, он в свою очередь меняет байткод, а не добавляет реализацию на лету.

Only public interface method calls for JDK Proxy and public methods for CGLIB.

DynamicProxy

Встроенная реализация JDK которая позволяет осуществлять перехватывать вызов метода и добавлять функциональность. Для работы необходимо, чтобы целевой класс наследовался от интерфейса с данным методом. И реализовать свой InvocationHandler с методом invoke. И передать в него объект целевого класса и создать новый целевой объект через Proxy.newProxyInstance. Used when proxying interfaces

CGLib

Реализует проксирование через создание классов наследников проксируемого объекта. Используем класс Enhancer. Тут через setSuperclass мы указываем проксируемый объект и через setCallback устанавливаем обертку вызова метода. Тк обе эти библиотеки используют наследование, не поддерживаются final классы и методы. В нем еще есть миксины(технология, позволяющая комбинировать множество объектов в один) Used when proxying classes

Untitled 116.png

AspectJ

AspectJ is the original AOP technology which aims to provide complete AOP solution. It is more robust but also significantly more complicated than Spring AOP. It's also worth noting that AspectJ can be applied across all domain objects.

Spring AOP AspectJ
Implemented in pure Java Implemented using extensions of Java programming language
No need for separate compilation process Needs AspectJ compiler (ajc) unless LTW is set up
Only runtime weaving is available Runtime weaving is not available. Supports compile-time, post-compile, and load-time Weaving
Less Powerful – only supports method level weaving More Powerful – can weave fields, methods, constructors, static initializers, final class/methods, etc…
Can only be implemented on beans managed by Spring container Can be implemented on all domain objects
Supports only method execution pointcuts Support all pointcuts
Proxies are created of targeted objects, and aspects are applied on these proxies Aspects are weaved directly into code before application is executed (before runtime)
Much slower than AspectJ Better Performance
Easy to learn and apply Comparatively more complicated than Spring AOP

Weaving

Both AspectJ and Spring AOP uses the different type of weaving which affects their behavior regarding performance and ease of use