Примеры аспектов
1. Аспект логирования
Этот аспект логирует вызовы методов до и после их выполнения.
2. Аспект измерения времени выполнения
Измеряет время, которое метод тратит на выполнение.
3. Аспект обработки исключений
Перехватывает и обрабатывает исключения, выбрасываемые методами.
4. Аспект для проверки авторизации
Проверяет, имеет ли пользователь доступ к выполнению метода.
5. Аспект кеширования
Кеширует результат выполнения метода.
#Java #Training #Spring #AOP
1. Аспект логирования
Этот аспект логирует вызовы методов до и после их выполнения.
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.UserService.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
}
@After("execution(* com.example.service.UserService.*(..))")
public void logAfter(JoinPoint joinPoint) {
System.out.println("After method: " + joinPoint.getSignature().getName());
}
}
2. Аспект измерения времени выполнения
Измеряет время, которое метод тратит на выполнение.
@Aspect
@Component
public class PerformanceAspect {
@Around("execution(* com.example.service.UserService.*(..))")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object proceed = joinPoint.proceed(); // Выполняем метод
long executionTime = System.currentTimeMillis() - start;
System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
return proceed;
}
}
3. Аспект обработки исключений
Перехватывает и обрабатывает исключения, выбрасываемые методами.
@Aspect
@Component
public class ExceptionHandlingAspect {
@AfterThrowing(pointcut = "execution(* com.example.service.UserService.*(..))", throwing = "exception")
public void logException(JoinPoint joinPoint, Throwable exception) {
System.out.println("Exception in method: " + joinPoint.getSignature().getName());
System.out.println("Exception message: " + exception.getMessage());
}
}
4. Аспект для проверки авторизации
Проверяет, имеет ли пользователь доступ к выполнению метода.
@Aspect
@Component
public class SecurityAspect {
@Before("execution(* com.example.service.SensitiveService.*(..))")
public void checkAccess(JoinPoint joinPoint) {
System.out.println("Checking access before method: " + joinPoint.getSignature().getName());
// Проверка прав доступа
if (!isUserAuthorized()) {
throw new SecurityException("User not authorized");
}
}
private boolean isUserAuthorized() {
// Логика авторизации
return true; // Например, возвращаем всегда true
}
}
5. Аспект кеширования
Кеширует результат выполнения метода.
@Aspect
@Component
public class CachingAspect {
private final Map<String, Object> cache = new HashMap<>();
@Around("execution(* com.example.service.CacheableService.*(..))")
public Object cacheMethod(ProceedingJoinPoint joinPoint) throws Throwable {
String key = joinPoint.getSignature().toString() + Arrays.toString(joinPoint.getArgs());
if (cache.containsKey(key)) {
System.out.println("Returning cached result for " + key);
return cache.get(key);
}
Object result = joinPoint.proceed(); // Выполнение метода
cache.put(key, result);
System.out.println("Caching result for " + key);
return result;
}
}
#Java #Training #Spring #AOP
Что выведет код?
Задача по основам AOP в Spring, понятиям Joinpoint, Pointcut, Advice, аннотациям @Before, @After, @Around. Сложность легкая.
Подробный разбор через 30 минут!🫡
#TasksSpring
Задача по основам AOP в Spring, понятиям Joinpoint, Pointcut, Advice, аннотациям @Before, @After, @Around. Сложность легкая.
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.ProceedingJoinPoint;
@SpringBootApplication
@EnableAspectJAutoProxy
public class Task041224_2 {
public static void main(String[] args) {
SpringApplication.run(Task041224_2.class, args);
}
@Bean
public CommandLineRunner demo(Service0412 service) {
return args -> {
service.performTask();
};
}
}
@Component
class Service0412 {
public void performTask() {
System.out.println("Executing performTask...");
}
}
@Aspect
@Component
class LoggingAspect0412 {
@Before("execution(* Service0412.performTask(..))")
public void logBefore() {
System.out.println("Before advice");
}
@After("execution(* Service0412.performTask(..))")
public void logAfter() {
System.out.println("After advice");
}
@Around("execution(* Service0412.performTask(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Around: Before");
Object result = joinPoint.proceed();
System.out.println("Around: After");
return result;
}
}
#TasksSpring
Подробный разбор решения задачи Task041224_2
1. Контекст задачи
Задача демонстрирует основы аспектно-ориентированного программирования (AOP) в Spring. Она показывает, как использовать аннотации AOP (@Before, @After, @Around) для внедрения дополнительного поведения в методы без изменения их исходного кода. Основное внимание уделяется порядку выполнения советов (Advice) и их взаимодействию.
2. Ключевые элементы кода
Аннотация @SpringBootApplication:
Указывает, что класс Main041224_2 является главным классом Spring Boot приложения. Она включает в себя @Configuration, @EnableAutoConfiguration, и @ComponentScan, что автоматически настраивает компоненты Spring, включая поддержку AOP.
Аннотация @EnableAspectJAutoProxy:
Включает поддержку прокси AspectJ, что необходимо для применения аспектов.
Класс Service0412:
Содержит метод performTask(), который выводит сообщение "Executing performTask...". Этот метод становится целью для аспектов.
Класс LoggingAspect0412:
Определен как аспект с помощью аннотации @Aspect.
Он содержит три совета:
@Before:
Метод logBefore() выполняется перед вызовом performTask() и выводит "Before advice".
@After:
Метод logAfter() выполняется после завершения performTask() и выводит "After advice".
@Around:
Метод logAround() оборачивает выполнение performTask():
Выводит "Around: Before" перед вызовом целевого метода.
Выполняет целевой метод с помощью joinPoint.proceed().
Выводит "Around: After" после выполнения метода.
3. Сценарий работы программы
Запуск приложения:
Программа запускается с помощью SpringApplication.run(Main041224_2.class, args);. Контекст Spring создает прокси для Service0412, обеспечивая применение аспектов.
Вызов performTask():
Метод вызывается из CommandLineRunner, что приводит к активации всех аспектов.
Последовательность выполнения:
@Around (первый вызов) — выводит "Around: Before".
@Before — выводит "Before advice".
Выполняется performTask(), выводя "Executing performTask...".
@After — выводит "After advice".
@Around (второй вызов) — выводит "Around: After".
4. Ключевые моменты и выводы
Порядок выполнения советов:
@Around оборачивает выполнение метода, выводя сообщения до и после вызова.
@Before выполняется после первой части @Around, но перед вызовом целевого метода.
@After выполняется после выполнения целевого метода, но до завершения второй части @Around.
Взаимодействие аспектов:
Аспекты работают вместе, добавляя дополнительное поведение. Это позволяет гибко управлять процессом выполнения методов.
Использование прокси:
Аспекты применяются к методам через прокси, что позволяет Spring перехватывать вызовы методов и применять советы.
#Solution_TasksSpring
1. Контекст задачи
Задача демонстрирует основы аспектно-ориентированного программирования (AOP) в Spring. Она показывает, как использовать аннотации AOP (@Before, @After, @Around) для внедрения дополнительного поведения в методы без изменения их исходного кода. Основное внимание уделяется порядку выполнения советов (Advice) и их взаимодействию.
2. Ключевые элементы кода
Аннотация @SpringBootApplication:
Указывает, что класс Main041224_2 является главным классом Spring Boot приложения. Она включает в себя @Configuration, @EnableAutoConfiguration, и @ComponentScan, что автоматически настраивает компоненты Spring, включая поддержку AOP.
Аннотация @EnableAspectJAutoProxy:
Включает поддержку прокси AspectJ, что необходимо для применения аспектов.
Класс Service0412:
Содержит метод performTask(), который выводит сообщение "Executing performTask...". Этот метод становится целью для аспектов.
Класс LoggingAspect0412:
Определен как аспект с помощью аннотации @Aspect.
Он содержит три совета:
@Before:
Метод logBefore() выполняется перед вызовом performTask() и выводит "Before advice".
@After:
Метод logAfter() выполняется после завершения performTask() и выводит "After advice".
@Around:
Метод logAround() оборачивает выполнение performTask():
Выводит "Around: Before" перед вызовом целевого метода.
Выполняет целевой метод с помощью joinPoint.proceed().
Выводит "Around: After" после выполнения метода.
3. Сценарий работы программы
Запуск приложения:
Программа запускается с помощью SpringApplication.run(Main041224_2.class, args);. Контекст Spring создает прокси для Service0412, обеспечивая применение аспектов.
Вызов performTask():
Метод вызывается из CommandLineRunner, что приводит к активации всех аспектов.
Последовательность выполнения:
@Around (первый вызов) — выводит "Around: Before".
@Before — выводит "Before advice".
Выполняется performTask(), выводя "Executing performTask...".
@After — выводит "After advice".
@Around (второй вызов) — выводит "Around: After".
4. Ключевые моменты и выводы
Порядок выполнения советов:
@Around оборачивает выполнение метода, выводя сообщения до и после вызова.
@Before выполняется после первой части @Around, но перед вызовом целевого метода.
@After выполняется после выполнения целевого метода, но до завершения второй части @Around.
Взаимодействие аспектов:
Аспекты работают вместе, добавляя дополнительное поведение. Это позволяет гибко управлять процессом выполнения методов.
Использование прокси:
Аспекты применяются к методам через прокси, что позволяет Spring перехватывать вызовы методов и применять советы.
#Solution_TasksSpring
Pointcut Expressions
Pointcut Expressions — это важный элемент AOP, позволяющий указать, где именно в коде должен срабатывать аспект. С их помощью можно точно определить, какие методы или классы будут подвержены сквозной функциональности.
1. Что такое Pointcut Expressions?
Pointcut — это выражение, определяющее набор точек соединения (Joinpoints), к которым будет применяться аспект. В Spring Pointcut Expressions основываются на синтаксисе AspectJ, что позволяет гибко описывать нужные методы или классы.
2. Основные типы Pointcut Expressions
execution:
Самый часто используемый тип, который указывает выполнение метода.
Все методы в классе UserService:
Методы, возвращающие void:
Методы с определённым набором параметров:
within:
Указывает на методы, принадлежащие определённому классу или пакету.
@annotation:
Указывает на методы, которые помечены определённой аннотацией.
args:
Указывает на методы, принимающие параметры определённого типа.
this / target:
this: срабатывает на прокси-объекты.
target: срабатывает на исходные объекты.
3. Комбинирование Pointcut Expressions
Pointcut выражения можно комбинировать с логическими операторами:
&& — И.
|| — ИЛИ.
! — НЕ.
Пример:
4. Использование Pointcut в аспектах
Определение Pointcut:
Применение к методам с аннотацией:
#Java #Training #Spring #AOP #Pointcut_Expressions
Pointcut Expressions — это важный элемент AOP, позволяющий указать, где именно в коде должен срабатывать аспект. С их помощью можно точно определить, какие методы или классы будут подвержены сквозной функциональности.
1. Что такое Pointcut Expressions?
Pointcut — это выражение, определяющее набор точек соединения (Joinpoints), к которым будет применяться аспект. В Spring Pointcut Expressions основываются на синтаксисе AspectJ, что позволяет гибко описывать нужные методы или классы.
2. Основные типы Pointcut Expressions
execution:
Самый часто используемый тип, который указывает выполнение метода.
execution(modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(param-pattern) throws-pattern?)
Все методы в классе UserService:
execution(* com.example.service.UserService.*(..))
Методы, возвращающие void:
execution(void com.example.service.*.*(..))
Методы с определённым набором параметров:
execution(* com.example.service.UserService.findBy*(String, int))
within:
Указывает на методы, принадлежащие определённому классу или пакету.
within(com.example.service.UserService)
@annotation:
Указывает на методы, которые помечены определённой аннотацией.
@annotation(org.springframework.transaction.annotation.Transactional)
args:
Указывает на методы, принимающие параметры определённого типа.
args(java.lang.String, int)
this / target:
this: срабатывает на прокси-объекты.
target: срабатывает на исходные объекты.
this(com.example.service.UserService)
target(com.example.service.UserService)
3. Комбинирование Pointcut Expressions
Pointcut выражения можно комбинировать с логическими операторами:
&& — И.
|| — ИЛИ.
! — НЕ.
Пример:
@Pointcut("execution(* com.example.service.*.*(..)) && @annotation(org.springframework.transaction.annotation.Transactional)")
public void transactionalMethods() {}
4. Использование Pointcut в аспектах
Определение Pointcut:
@Aspect
@Component
public class LoggingAspect {
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceLayerMethods() {}
@Before("serviceLayerMethods()")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
}
}
Применение к методам с аннотацией:
@Before("@annotation(com.example.annotations.Loggable)")
public void logForAnnotatedMethods(JoinPoint joinPoint) {
System.out.println("Logging for annotated method: " + joinPoint.getSignature().getName());
}
#Java #Training #Spring #AOP #Pointcut_Expressions
Что выведет код?
#Tasks
import java.math.BigDecimal;
public class Task051224_1 {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal c = new BigDecimal("0.3");
BigDecimal sum = a.add(b);
boolean equals1 = sum.equals(c);
boolean equals2 = sum.compareTo(c) == 0;
System.out.println(sum);
System.out.println(equals1);
System.out.println(equals2);
}
}
#Tasks
Варианты ответа:
Anonymous Quiz
50%
0.3 false true
25%
0.30000000000000004 false false
25%
0.3 true true
0%
0.3 false false
Настройка AOP через XML и аннотации
Spring AOP предоставляет два способа конфигурации: через XML и с помощью аннотаций.
1. Настройка AOP через XML
Ранее в Spring было популярно настраивать AOP через XML-конфигурацию.
Шаги настройки
Добавьте зависимость AOP в pom.xml:
Создайте аспект:
Определите Pointcut и Advice в XML:
Объявите аспект в applicationContext.xml:
2. Настройка AOP с помощью аннотаций
Настройка через аннотации является более современным и удобным подходом.
Шаги настройки
Добавьте зависимость:
Включите поддержку AOP в приложении:
Создайте аспект:
Пример сервиса:
#Java #Training #Spring #AOP
Spring AOP предоставляет два способа конфигурации: через XML и с помощью аннотаций.
1. Настройка AOP через XML
Ранее в Spring было популярно настраивать AOP через XML-конфигурацию.
Шаги настройки
Добавьте зависимость AOP в pom.xml:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
Создайте аспект:
public class LoggingAspect {
public void logBefore() {
System.out.println("Logging before method execution...");
}
}
Определите Pointcut и Advice в XML:
<aop:config>
<aop:aspect id="loggingAspect" ref="loggingAspectBean">
<aop:pointcut id="serviceMethods" expression="execution(* com.example.service.*.*(..))" />
<aop:before method="logBefore" pointcut-ref="serviceMethods" />
</aop:aspect>
</aop:config>
Объявите аспект в applicationContext.xml:
<bean id="loggingAspectBean" class="com.example.aspect.LoggingAspect" />
2. Настройка AOP с помощью аннотаций
Настройка через аннотации является более современным и удобным подходом.
Шаги настройки
Добавьте зависимость:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
Включите поддержку AOP в приложении:
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {}
Создайте аспект:
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
}
@After("execution(* com.example.service.*.*(..))")
public void logAfter(JoinPoint joinPoint) {
System.out.println("After method: " + joinPoint.getSignature().getName());
}
@Around("execution(* com.example.service.*.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Around - Before method: " + joinPoint.getSignature().getName());
Object result = joinPoint.proceed();
System.out.println("Around - After method: " + joinPoint.getSignature().getName());
return result;
}
}
Пример сервиса:
@Service
public class UserService {
public String getUserById(Long id) {
System.out.println("Fetching user with ID: " + id);
return "User" + id;
}
}
#Java #Training #Spring #AOP
Практическое использование AOP для логирования
Логирование является одной из самых распространённых задач, где применяют AOP. Вместо того чтобы добавлять логи в каждый метод вручную, можно создать аспект, который автоматически будет логировать информацию о вызовах методов, их параметрах, результатах и времени выполнения.
1. Задача: Логирование вызовов методов
Cоздадим аспект, который будет:
Логировать вызовы методов сервисного слоя.
Выводить информацию о параметрах методов.
Логировать результат выполнения.
Замерять время выполнения метода.
Шаг 1: Зависимости
Добавьте в pom.xml зависимости для работы с AOP:
Шаг 2: Создание аспекта логирования
Шаг 3: Бизнес-логика
Создадим простой сервис для тестирования:
Шаг 4: Проверка
Теперь вызов методов UserService будет автоматически логироваться:
Пример лога:
#Java #Training #Spring #AOP #AOP_for_logging
Логирование является одной из самых распространённых задач, где применяют AOP. Вместо того чтобы добавлять логи в каждый метод вручную, можно создать аспект, который автоматически будет логировать информацию о вызовах методов, их параметрах, результатах и времени выполнения.
1. Задача: Логирование вызовов методов
Cоздадим аспект, который будет:
Логировать вызовы методов сервисного слоя.
Выводить информацию о параметрах методов.
Логировать результат выполнения.
Замерять время выполнения метода.
Шаг 1: Зависимости
Добавьте в pom.xml зависимости для работы с AOP:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
Шаг 2: Создание аспекта логирования
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Aspect
@Component
public class LoggingAspect {
// Логируем все методы в сервисном слое
@Around("execution(* com.example.service.*.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
System.out.println("Method called: " + joinPoint.getSignature());
System.out.println("Arguments: " + Arrays.toString(joinPoint.getArgs()));
Object result;
try {
result = joinPoint.proceed(); // Выполняем метод
System.out.println("Method result: " + result);
} catch (Throwable ex) {
System.out.println("Method threw an exception: " + ex.getMessage());
throw ex;
}
long elapsedTime = System.currentTimeMillis() - startTime;
System.out.println("Method execution time: " + elapsedTime + " ms");
return result;
}
}
Шаг 3: Бизнес-логика
Создадим простой сервис для тестирования:
import org.springframework.stereotype.Service;
@Service
public class UserService {
public String getUserById(Long id) {
System.out.println("Fetching user from database...");
return "User" + id;
}
public void updateUser(Long id, String name) {
System.out.println("Updating user in database...");
}
}
Шаг 4: Проверка
Теперь вызов методов UserService будет автоматически логироваться:
@RestController
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/users/{id}")
public String getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
@PutMapping("/users/{id}")
public void updateUser(@PathVariable Long id, @RequestBody String name) {
userService.updateUser(id, name);
}
}
Пример лога:
Method called: String com.example.service.UserService.getUserById(Long)
Arguments: [1]
Fetching user from database...
Method result: User1
Method execution time: 5 ms
#Java #Training #Spring #AOP #AOP_for_logging
Что выведет код?
#Tasks
public class Task0612_1 {
public static void main(String[] args) {
Task0612_1 test = new Task0612_1();
test.print(null);
}
public void print(String str) {
System.out.println("String method");
}
public void print(Object obj) {
System.out.println("Object method");
}
public void print(CharSequence seq) {
System.out.println("CharSequence method");
}
}
#Tasks
Варианты ответа:
Anonymous Quiz
31%
Object method
50%
String method
0%
CharSequence method
19%
Compile-time error
Проверка авторизации для выполнения методов
Создадим аспект, который будет:
Проверять, имеет ли пользователь доступ к выполнению метода.
Блокировать вызов метода, если доступ запрещён.
Шаг 1: Создание аннотации для ограничения доступа
Шаг 2: Аспект для проверки безопасности
Шаг 3: Применение аннотации Secured
Теперь можно использовать аннотацию @Secured для методов, которые требуют проверки безопасности.
Шаг 4: Проверка
Создадим контроллер для вызова методов:
Если вызвать метод deleteUser с текущей ролью USER, выбросится исключение:
Шаг 5: Логирование в аспекте
Вы можете расширить аспект, добавив логирование успешных или неуспешных проверок безопасности:
#Java #Training #Spring #AOP #AOP_for_security
Создадим аспект, который будет:
Проверять, имеет ли пользователь доступ к выполнению метода.
Блокировать вызов метода, если доступ запрещён.
Шаг 1: Создание аннотации для ограничения доступа
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Secured {
String role(); // Роль, необходимая для доступа
}
Шаг 2: Аспект для проверки безопасности
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.JoinPoint;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class SecurityAspect {
// Перехватываем методы с аннотацией @Secured
@Before("@annotation(secured)")
public void checkAccess(JoinPoint joinPoint, Secured secured) {
String requiredRole = secured.role();
String userRole = getCurrentUserRole(); // Эмуляция получения роли пользователя
if (!userRole.equals(requiredRole)) {
throw new SecurityException("Access denied: required role is " + requiredRole);
}
System.out.println("Access granted to method: " + joinPoint.getSignature());
}
private String getCurrentUserRole() {
// Для примера, возвращаем роль текущего пользователя
return "USER"; // Например, текущая роль пользователя — "USER"
}
}
Шаг 3: Применение аннотации Secured
Теперь можно использовать аннотацию @Secured для методов, которые требуют проверки безопасности.
import org.springframework.stereotype.Service;
@Service
public class AdminService {
@Secured(role = "ADMIN")
public void deleteUser(Long id) {
System.out.println("Deleting user with ID: " + id);
}
@Secured(role = "USER")
public String getUserData(Long id) {
System.out.println("Fetching user data...");
return "User data for ID: " + id;
}
}
Шаг 4: Проверка
Создадим контроллер для вызова методов:
@RestController
public class AdminController {
private final AdminService adminService;
public AdminController(AdminService adminService) {
this.adminService = adminService;
}
@DeleteMapping("/admin/users/{id}")
public void deleteUser(@PathVariable Long id) {
adminService.deleteUser(id); // Проверка роли ADMIN
}
@GetMapping("/admin/users/{id}")
public String getUserData(@PathVariable Long id) {
return adminService.getUserData(id); // Проверка роли USER
}
}
Если вызвать метод deleteUser с текущей ролью USER, выбросится исключение:
Access denied: required role is ADMIN
Шаг 5: Логирование в аспекте
Вы можете расширить аспект, добавив логирование успешных или неуспешных проверок безопасности:
@Before("@annotation(secured)")
public void checkAccess(JoinPoint joinPoint, Secured secured) {
String requiredRole = secured.role();
String userRole = getCurrentUserRole();
if (!userRole.equals(requiredRole)) {
System.out.println("Access denied for method: " + joinPoint.getSignature());
throw new SecurityException("Access denied: required role is " + requiredRole);
}
System.out.println("Access granted for method: " + joinPoint.getSignature());
}
#Java #Training #Spring #AOP #AOP_for_security
Всем привет!
Для понимания ситуации проведу опрос - откуда Вы узнали о нашем телеграм-канале?
Для понимания ситуации проведу опрос - откуда Вы узнали о нашем телеграм-канале?
Anonymous Poll
14%
По поиску
16%
По каналу в YOUTUBE
3%
По каналу в RUTUBE
43%
Из JavaRush
5%
Друг посоветовал
19%
Я здесь так давно, что и не помню)
This media is not supported in your browser
VIEW IN TELEGRAM
Всем доброго утра! 🖐
Сегодня как и каждое воскресение в 16:00 по МСК мы собираемся чтобы попробовать что-то новое!
Сегодняшняя тема: Деплой приложений
Жду всех. Приходите будет интересно😉
Сегодня как и каждое воскресение в 16:00 по МСК мы собираемся чтобы попробовать что-то новое!
Сегодняшняя тема: Деплой приложений
Жду всех. Приходите будет интересно😉
Деплой приложений. Метод для контейнеризации приложений в Docker. Встреча от 08.12.2024
Запись нашей сегодняшней встречи -
YOUTUBE
RUTUBE
Спасибо всем кто пришел, за участие!💪
На сегодняшней встрече с подписчиками, мы на примере, разобрали:
— что такое архивы JAR, WAR и EAR и для чего они нужны.
— как создать и запускать приложения без IDea.
— как организовать сборку через основные сборщики Maven и Gradle.
— как создать простейшее веб-приложение и задеплоить его на сервер в Docker контейнер.
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения! 🫡✌️
Запись нашей сегодняшней встречи -
YOUTUBE
RUTUBE
Спасибо всем кто пришел, за участие!💪
На сегодняшней встрече с подписчиками, мы на примере, разобрали:
— что такое архивы JAR, WAR и EAR и для чего они нужны.
— как создать и запускать приложения без IDea.
— как организовать сборку через основные сборщики Maven и Gradle.
— как создать простейшее веб-приложение и задеплоить его на сервер в Docker контейнер.
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения! 🫡✌️