рдкрд╣рд▓реВ рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдУрдкреА

рдкрд╣рд▓реВ-рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (AOP) рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рддрд┐рдорд╛рди рд╣реИ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (OOP) рдХрд╛ рдПрдХ рдФрд░ рд╡рд┐рдХрд╛рд╕ рд╣реИред рдПрдУрдкреА рдХрд╛ рд╡рд┐рдЪрд╛рд░ рддрдерд╛рдХрдерд┐рдд рдЕрдВрдд-рдЯреВ-рдПрдВрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ, рдпрд╣рд╛рдВ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕реНрдкреНрд░рд┐рдВрдЧ @AspectJ рдПрдиреЛрдЯреЗрд╢рди рд╢реИрд▓реА (рдПрдХ рд╕реНрдХреАрдорд╛-рдЖрдзрд╛рд░рд┐рдд xml рд╢реИрд▓реА рднреА рд╣реИ, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рдорд╛рди рд╣реИ)ред

рдЕрдВрдд-рдЯреВ-рдПрдВрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдирд╛


рдХреЛ

рдЫрд╡рд┐

рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж

рдЫрд╡рд┐

рдпрд╛рдиреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ рдЬреЛ рдХрдИ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реАрдзреЗ рд╡реНрдпрд╛рдкрд╛рд░ рдХреЛрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд╛рди рдкрд░ рд░рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдпрд╣ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдмрд┐рдВрджреБ рд╕реЗ рдЬреБрдбрд╝реЗрдВ



рдЫрд╡рд┐

рдмрд┐рдВрджреБ рд╕реЗ рдЬреБрдбрд╝реЗрдВ - рдПрдУрдкреА рдХреА рдЕрдЧрд▓реА рдЕрд╡рдзрд╛рд░рдгрд╛, рдпреЗ рдЕрд╡рд▓реЛрдХрди рдХреЗ рдмрд┐рдВрджреБ рд╣реИрдВ, рдХреЛрдб рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╣рд╛рдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рд╢реБрд░реВрдЖрдд рдХреА рдпреЛрдЬрдирд╛ рд╣реИред

Pointcut


рдЫрд╡рд┐

рдПрдХ рдмрд┐рдВрджреБ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ, рдЕрдиреБрд▓рдЧреНрдирдХ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╢реНрди рд╣реИ, рдпрд╣ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЕрдВрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХреНрд╡реЗрд░реА рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рдмрд╣реБрдд рд╣реА рд╡рд┐рд╡рд┐рдз рд╣реИрдВ, рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ, рдПрдХ рд╡рд┐рдзрд┐ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐ рдкрд░ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рд╣реИред рдирд┐рдпрдореЛрдВ рдХреЛ &&, ||, рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рд╕рд▓рд╛рд╣


рдЫрд╡рд┐

рд╕рд▓рд╛рд╣ - рдХрдЯ рдкреНрд╡рд╛рдЗрдВрдЯ (рдкреЙрдЗрдВрдЯрдХрдЯ) рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯред рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдкрд░ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ - рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ
  • рдХреЗ рдмрд╛рдж - рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рдмрд╛рдж
  • рд▓реМрдЯрдиреЗ рдХреЗ рдмрд╛рдж - рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдорд╛рди рд▓реМрдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж
  • рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрд╛рдж - рдЕрдкрд╡рд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ
  • рдЖрдЦрд┐рд░рдХрд╛рд░ - рдЕрдЧрд░ рдЕрдВрдд рдореЗрдВ рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ
  • рдЖрд╕рдкрд╛рд╕ - рдЖрдк рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░реНрд╡, рдкреЛрд╕реНрдЯред, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдорддреМрд░ рдкрд░ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рд╕рд▓рд╛рд╣ "рд▓рдЯрдХрд╛" рд╕рдХрддреЗ рд╣реИрдВред

рдкрд╣рд▓реВ


рдЫрд╡рд┐

рдкрд╣рд▓реВ - рдПрдХ рдореЙрдбреНрдпреВрд▓ рдЬрд┐рд╕рдореЗрдВ рдкреЙрдЗрдВрдЯрдХрдЯ рдФрд░ рд╕рд▓рд╛рд╣ рд╡рд┐рд╡рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдЕрдм рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ рдФрд░ рдЕрдВрдд рдореЗрдВ рд╕рдм рдХреБрдЫ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ (рдпрд╛ рд▓рдЧрднрдЧ рд╕рднреА)ред рд╣рдо рд╕рднреА рд▓реЛрдЧ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬреЛ рдХрдИ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╡реНрдпрд╡рд╕рд╛рдп рдХреЛрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реВрдВред
рдЙрджрд╛рд╣рд░рдг - рдХреЛрдб рд▓реЙрдЧрд┐рдВрдЧ

рд▓рдХреНрд╖реНрдп рд╕реЗрд╡рд╛

@Service public class MyService { public void method1(List<String> list) { list.add("method1"); System.out.println("MyService method1 list.size=" + list.size()); } @AspectAnnotation public void method2() { System.out.println("MyService method2"); } public boolean check() { System.out.println("MyService check"); return true; } } 

рдкреЙрдЗрдВрдЯрдХрдЯ рдФрд░ рдПрдбрд╡рд╛рдЗрд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдкрд╣рд▓реВред

 @Aspect @Component public class MyAspect { private Logger logger = LoggerFactory.getLogger(this.getClass()); @Pointcut("execution(public * com.example.demoAspects.MyService.*(..))") public void callAtMyServicePublic() { } @Before("callAtMyServicePublic()") public void beforeCallAtMethod1(JoinPoint jp) { String args = Arrays.stream(jp.getArgs()) .map(a -> a.toString()) .collect(Collectors.joining(",")); logger.info("before " + jp.toString() + ", args=[" + args + "]"); } @After("callAtMyServicePublic()") public void afterCallAt(JoinPoint jp) { logger.info("after " + jp.toString()); } } 

рдФрд░ рдХреЙрд▓рд┐рдВрдЧ рдЯреЗрд╕реНрдЯ рдХреЛрдб

 @RunWith(SpringRunner.class) @SpringBootTest public class DemoAspectsApplicationTests { @Autowired private MyService service; @Test public void testLoggable() { List<String> list = new ArrayList(); list.add("test"); service.method1(list); service.method2(); Assert.assertTrue(service.check()); } } 

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред рд▓рдХреНрд╖реНрдп рд╕реЗрд╡рд╛ рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдХреЛрдИ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ, рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдореЗрдВ рд╕рднреА рдЕрдзрд┐рдХ, рд╕рднреА рд▓реЙрдЧрд┐рдВрдЧ рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ
@Aspect
class MyAspect ...


рдкреЙрдЗрдВрдЯрдХрдЯ рдореЗрдВ

  @Pointcut("execution(public * com.example.demoAspects.MyService.*(..))") public void callAtMyServicePublic() { } 

рдореИрдВрдиреЗ рд╕рднреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ MyService рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдХреЗ рд╕рд╛рде * рдФрд░ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (..)

рд╕рд▓рд╛рд╣ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЬреЛ рдкреЙрдЗрдВрдЯрдХрдЯ (callAtMyServicePublic) рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рд▓реЙрдЧ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рд▓рд┐рдЦреЗред JoinPoint рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкрд╣рд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдлреИрд▓рд╛ рд╣реИ! рдХреЙрд▓рд░ рдХреЛрдб, рд▓рдХреНрд╖реНрдп, рд▓реЙрдЧрд┐рдВрдЧред

рд╕рд╛рдВрддреНрд╡рдирд╛ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо

рдЫрд╡рд┐

рдкреЙрдЗрдВрдЯрдХрдЯ рдирд┐рдпрдо рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ
рдкреЙрдЗрдВрдЯрдХрдЯ рдФрд░ рд╕рд▓рд╛рд╣ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:

рдПрдХ рд╡рд┐рдзрд┐ рдкрд░ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзред

 @Pointcut("@annotation(AspectAnnotation)") public void callAtMyServiceAnnotation() { } 

рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕рд▓рд╛рд╣ рджреА

  @Before("callAtMyServiceAnnotation()") public void beforeCallAt() { } 

рд▓рдХреНрд╖реНрдп рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз

 @Pointcut("execution(* com.example.demoAspects.MyService.method1(..)) && args(list,..))") public void callAtMyServiceMethod1(List<String> list) { } 

рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕рд▓рд╛рд╣ рджреА

  @Before("callAtMyServiceMethod1(list)") public void beforeCallAtMethod1(List<String> list) { } 

рд╡рд╛рдкрд╕реА рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрдХрдЯ

  @Pointcut("execution(* com.example.demoAspects.MyService.check())") public void callAtMyServiceAfterReturning() { } 

рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕рд▓рд╛рд╣ рджреА

  @AfterReturning(pointcut="callAtMyServiceAfterReturning()", returning="retVal") public void afterReturningCallAt(boolean retVal) { } 

рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг

 @Retention(RUNTIME) @Target(METHOD) public @interface SecurityAnnotation { } // @Aspect @Component public class MyAspect { @Pointcut("@annotation(SecurityAnnotation) && args(user,..)") public void callAtMyServiceSecurityAnnotation(User user) { } @Around("callAtMyServiceSecurityAnnotation(user)") public Object aroundCallAt(ProceedingJoinPoint pjp, User user) { Object retVal = null; if (securityService.checkRight(user)) { retVal = pjp.proceed(); } return retVal; } 

рдЬрд┐рди рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рджрд╛рдИрдВ рдУрд░ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрдиреНрд╣реЗрдВ "SecurityAnnotation" рдХреЗ рд╕рд╛рде рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдПрд╕реНрдкреЗрдХреНрдЯ рдореЗрдВ рд╣рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдорд┐рд▓реЗрдЧрд╛, рдФрд░ рдЙрди рд╕рднреА рдХреЛ рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд░рд╛рдЗрдЯреНрд╕ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд▓рдХреНрд╖реНрдп рдХреЛрдб:

 @Service public class MyService { @SecurityAnnotation public Balance getAccountBalance(User user) { // ... } @SecurityAnnotation public List<Transaction> getAccountTransactions(User user, Date date) { // ... } } 

рдХреЙрд▓рд░ рдХреЛрдб:

 balance = myService.getAccountBalance(user); if (balance == null) { accessDenied(user); } else { displayBalance(balance); } 

рдпрд╛рдиреА рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдФрд░ рд▓рдХреНрд╖реНрдп рдореЗрдВ, рдХреЗрд╡рд▓ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЛрдб рд╣реА рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХрд╛ рдХреЛрдИ рд╕рддреНрдпрд╛рдкрди рдирд╣реАрдВ рд╣реИред
рдПрдХ рд╣реА рд╕реЗрд╡рд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреА рд╕рд▓рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг

 @Aspect @Component public class MyAspect { @Pointcut("execution(public * com.example.demoAspects.MyService.*(..))") public void callAtMyServicePublic() { } @Around("callAtMyServicePublic()") public Object aroundCallAt(ProceedingJoinPoint call) throws Throwable { StopWatch clock = new StopWatch(call.toString()); try { clock.start(call.toShortString()); return call.proceed(); } finally { clock.stop(); System.out.println(clock.prettyPrint()); } } } 

рдпрджрд┐ рд╣рдо рдХреЙрд▓ рдХреЛрдб рдХреЛ MyService рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдорд┐рд▓рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдФрд░ рд▓рдХреНрд╖реНрдп рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛, рдореИрдВрдиреЗ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЬреЛрдбрд╝реА: рд▓реЙрдЧрд┐рдВрдЧ, рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ред
рдпреВрдЖрдИ рд░реВрдкреЛрдВ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ

рдПрдХ рдХреЛрдб рд╣реИ рдЬреЛ рдкреНрд░рдкрддреНрд░ рдкрд░ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдЫреБрдкрд╛рддрд╛ / рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

 public class EditForm extends Form { @Override public void init(Form form) { formHelper.updateVisibility(form, settingsService.isVisible(COMP_NAME)); formHelper.updateVisibility(form, settingsService.isVisible(COMP_LAST_NAME)); formHelper.updateVisibility(form, settingsService.isVisible(COMP_BIRTH_DATE)); // ... } 

рдЖрдк рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреА рд╕рд▓рд╛рд╣ рдореЗрдВ рднреА рдЕрджреНрдпрддрдирддрд╛ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ

 @Aspect public class MyAspect { @Pointcut("execution(* com.example.demoAspects.EditForm.init() && args(form,..))") public void callAtInit(Form form) { } // ... @Around("callAtInit(form)") public Object aroundCallAt(ProceedingJoinPoint pjp, Form form) { formHelper.updateVisibility(form, settingsService.isVisible(COMP_NAME)); formHelper.updateVisibility(form, settingsService.isVisible(COMP_LAST_NAME)); formHelper.updateVisibility(form, settingsService.isVisible(COMP_BIRTH_DATE)); Object retVal = pjp.proceed(); return retVal; } 

рдЖрджрд┐

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛

рдЫрд╡рд┐

рдкреЛрдо рдлрд╛рдЗрд▓
 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>demoAspects</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demoAspects</name> <description>Demo project for Spring Boot Aspects</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 


рд╕рд╛рдордЧреНрд░реА

рд╡рд╕рдВрдд рдХреЗ рд╕рд╛рде рдкрд╣рд▓реВ рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

Source: https://habr.com/ru/post/hi428548/


All Articles