IOC와 AOP는 Spring의 두 가지 핵심 개념입니다. 제가 이해한 바를 간략하게 소개하겠습니다.
IOC: 제어 역전이란 수동으로 객체를 생성하는 과정을 Spring에 넘겨주는 것을 의미합니다. , 개체 및 개체 간의 종속성을 관리합니다. 이는 코드의 결합을 줄이고 프로젝트의 향후 유지 관리를 용이하게 합니다. 간단한 예를 들어보겠습니다.
일반적인 상황에서 우리는 집에 있고, 배가 고프고, 스스로 요리를 합니다.
IOC를 이용할 때 집에 있을 때 배가 고프면 상인에게 전화를 하면 음식이 배달됩니다.
IOC는 상인에 해당하고, 요리는 물건을 만드는 것과 같습니다.
즉, 일반적인 상황에서 클래스가 다른 클래스의 메서드를 호출해야 할 때 new, 팩토리 또는 기타 메서드를 통해 수동으로 개체를 생성합니다.
IOC를 사용할 때는 객체만 주입하면 됩니다.
AOP: 특정 유형의 객체를 감독하고 제어할 수 있는 측면 지향(편리한) 프로그래밍. 이러한 유형의 객체에 대한 메서드 호출 전후에 지정된 코드를 호출하여 메서드를 확장하여 향상된 효과를 얻습니다. 모듈 기능. 간단한 예를 들면:
일반적인 상황에서는 직접 먹습니다.
AOP를 이용하면 보모가 지켜보면서 식사 전 손 씻기, 식사 후 설거지까지 도와줍니다.
AOP는 보모와 같고, 먹는 것은 특정 메서드를 호출하는 것과 같습니다.
즉, 메소드를 보완하고 싶을 때 메소드를 직접 수정하지 않고 AOP를 통해 보완하는 것입니다. 보충을 원하지 않거나 보충을 교체해야 할 경우 AOP를 직접 운영할 수 있습니다.
1. Pointcut: 실행 등 어떤 메소드를 차단할지 정의하는 데 사용됩니다(* cn.springcamp.springaop.service..(…))
2.
3. Aspect, Pointcut과 Advice를 결합하여 Aspect를 구성합니다
4. Join Point: 실행 중 Pointcut의 인스턴스
4. AspectJ 또는 Spring AOP와 같은 AOP를 구현하는 프레임워크
<!--aop--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
Startup 클래스와 생략 가능한 @EnableAspectJAutoProxy 주석을 도입합니다. AOP의 기본 구성 속성에서는 spring.aop.auto 속성이 기본적으로 켜져 있기 때문입니다.
더 이상 AspectJ 종속성을 도입할 필요가 없습니다.
Aspect 클래스 코드:
package com.example.myblog.test; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Component @Aspect public class AOPTest { //定义切入点 @Pointcut("execution(public * com.example.myblog.test.AOPTestClient.*(..))") public void aspectTest(){} //前置通知,切入点执行之前执行 @Before("aspectTest()") public void doBefore(JoinPoint joinPoint){ System.out.println("前置通知"); } //后置通知,切入点执行之后执行 @After("aspectTest()") public void doAfter(JoinPoint joinPoint){ System.out.println("后置通知"); } //最终通知,,切入点执行之后执行 @AfterReturning("aspectTest()") public void doAfterReturning(JoinPoint joinPoint){ System.out.println("最终通知"); } //异常通知,切入点抛出异常执行 @AfterThrowing("aspectTest()") public void deAfterThrowing(JoinPoint joinPoint){ System.out.println("异常通知"); } //环绕通知,切入点执行前、后执行 @Around("aspectTest()") public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable{ System.out.println("未执行"); Object result = joinPoint.proceed(); System.out.println("已执行"); //返回结果 return result; } }
Pointcut 클래스 코드:
package com.example.myblog.test; import org.springframework.stereotype.Component; @Component public class AOPTestClient { public void test(){ System.out.println("正在测试AOP"); } }
테스트 클래스 코드:
package com.example.myblog; import com.example.myblog.test.*; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) public class MyblogApplicationTests { @Autowired private AOPTestClient aopTestClient; @Test public void testAOP(){ aopTestClient.test(); } }
테스트 결과:
package com.example.myblog.test; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //表示次注解可以标注在类和方法上 @Target({ElementType.METHOD, ElementType.TYPE}) //运行时生效 @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { //定义一个变量,可以接受参数 String desc() default " "; }
Aspect 클래스 코드:
package com.example.myblog.test; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Component @Aspect public class AOPAnnotationTest { //定义切入点 @Pointcut("@annotation(com.example.myblog.test.MyAnnotation)") public void aspectTest(){} //前置通知,切入点执行之前执行 @Before("aspectTest()") public void doBefore(JoinPoint joinPoint){ System.out.println("前置通知"); } //后置通知,切入点执行之后执行 @After("aspectTest()") public void doAfter(JoinPoint joinPoint){ System.out.println("后置通知"); } //最终通知,,切入点执行之后执行 @AfterReturning("aspectTest()") public void doAfterReturning(JoinPoint joinPoint){ System.out.println("最终通知"); } //异常通知,切入点抛出异常执行 @AfterThrowing("aspectTest()") public void deAfterThrowing(JoinPoint joinPoint){ System.out.println("异常通知"); } //环绕通知,切入点执行前、后执行 @Around("aspectTest()") public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable{ System.out.println("未执行"); Object result = joinPoint.proceed(); System.out.println("已执行"); //返回结果 return result; } }
Pointcut 클래스 코드:
package com.example.myblog.test; import org.springframework.stereotype.Component; @Component public class AOPAnnotationTestClient { @MyAnnotation public void test(){ System.out.println("正在测试AOP"); } }
테스트 클래스 코드:
@Test public void testAOPAnnotation(){ aopAnnotationTestClient.test(); }
테스트 결과:
위 내용은 SpringBoot 프로젝트에서 aop를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!