AOP(관점 지향 프로그래밍)를 도입하려면 먼저 다음과 같은 시나리오를 고려해야 합니다. 회사에 현재 온라인 상태인 인적 자원 관리 시스템이 있지만 시스템이 불안정하고 불안정하게 실행되고 있습니다. 어떤 링크에 문제가 있는지 감지하기 위해 개발자는 각 메서드의 실행 시간을 모니터링한 다음 이러한 실행 시간을 기준으로 문제를 판단하려고 합니다. 문제가 해결되면 해당 모니터를 제거하십시오. 시스템이 현재 실행 중입니다. 시스템에서 수천 개의 메서드를 수동으로 수정하면 작업 부하가 너무 커져서 나중에 시스템이 실행되는 동안 동적으로 코드를 추가할 수 있으면 이러한 모니터링 메서드를 제거해야 합니다. 문제는 아주 잘 해결될 수 있습니다. AOP(관점 지향 프로그래밍)는 시스템 런타임에 코드를 동적으로 추가하는 방법입니다. Spring Boot는 AOP를 훌륭하게 지원합니다. AOP에는 이해해야 할 몇 가지 일반적인 개념이 있습니다.
조인 포인트는 향상될 수 있는 클래스의 메서드를 나타냅니다. 예를 들어 해당 메소드의 기능을 수정하려는 경우 해당 메소드는 연결 지점
Pointcut은 Joinpoint를 가로채는 작업을 정의하는 것을 의미합니다. 이 정의는 insert로 시작하는 모든 메소드를 진입점으로 가로채는 것을 의미합니다
Joinpoint를 가로채고 나서 수행할 작업은 알림을 보내는 것입니다. 예를 들어 앞서 언급한 인쇄 로그 모니터링이 있습니다. 알림은 사전 알림, 사후 알림, 예외 알림, 최종 알림, 주변 알림으로 구분됩니다.
Aspect(aspect): Pointcut과 Advice의 조합
Target(대상 객체): 대상 클래스 Enhanced는 Target
Spring Boot는 Spring 기반 AOP 구성을 위한 자동화된 구성 솔루션 spring-boot-starter-aop를 제공합니다. 먼저 다음과 같이 종속성을 도입합니다.
<!-- AOP 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
그런 다음 com.sang.aop에 추가합니다. . 다음과 같이 서비스 패키지 아래에 UserService 클래스를 만듭니다.
@Service public class UserService { public String getUserById(Integer id){ System.out.println("get..."); return "user"; } public void deleteUserById(Integer id){ System.out.println("delete..."); } }
그런 다음 다음과 같이 측면을 만듭니다.
@Component @Aspect public class LogAspect { @Pointcut("execution(* com.sang.aop.service.*.*(..))") public void pc1() { } @Before(value = "pc1()") public void before(JoinPoint jp) { String name = jp.getSignature().getName(); System.out.println(name + "方法开始执行..."); } @After(value = "pc1()") public void after(JoinPoint jp) { String name = jp.getSignature().getName(); System.out.println(name + "方法执行结束..."); } @AfterReturning(value = "pc1()", returning = "result") public void afterReturning(JoinPoint jp, Object result) { String name = jp.getSignature().getName(); System.out.println(name + "方法返回值为:" + result); } @AfterThrowing(value = "pc1()",throwing = "e") public void afterThrowing(JoinPoint jp, Exception e) { String name = jp.getSignature().getName(); System.out.println(name+"方法抛异常了,异常是:"+e.getMessage()); } @Around("pc1()") public Object around(ProceedingJoinPoint pjp) throws Throwable { return pjp.proceed(); } }
코드 설명:
@Aspect 주석은 이것이 측면 클래스임을 나타냅니다.
@Pointcut () 주석은 포인트컷을 정의하기 위해 pc1() 메소드에서 사용됩니다. 실행 시 첫 번째 *는 메서드가 모든 값을 반환함을 나타내고, 두 번째 *는 서비스 패키지 아래의 모든 클래스를 나타내고, 세 번째 *는 클래스의 모든 메서드를 나타내며, 괄호 안의 두 점은 설명된 대로 메서드 매개 변수가 임의적임을 나타냅니다. 여기서 진입점은 서비스 패키지에 속한 모든 클래스의 모든 메소드입니다.
before() 메소드는 @Before 주석을 사용하여 이것이 사전 알림임을 나타내며 대상 메소드가 실행되기 전에 해당 메소드가 실행됩니다. JoinPoint 매개변수는 대상 메소드에 대한 이름, 수정자 및 기타 정보를 제공할 수 있습니다.
after() 메소드는 @After 주석을 사용하여 이것이 대상 메소드가 실행된 후에 실행되는 사후 알림임을 나타냅니다.
afterReturning () 메서드는 @AfterReturning 주석을 사용하여 이것이 반환 알림임을 나타내며, 이 메서드에서 대상 메서드의 반환 값을 얻을 수 있습니다. @AfterReturning 어노테이션의 반환 매개변수는 메소드 매개변수에 해당하는 반환값의 변수 이름을 나타냅니다. 결과 유형은 메소드 매개변수에 Object로 정의됩니다. 이는 대상 메소드의 반환 값이 모든 유형일 수 있음을 의미합니다. 결과 매개변수의 유형이 Long인 경우 이 메소드는 다음과 같은 상황만 처리할 수 있습니다. 대상 메서드의 반환 값은 Long
afterThrowing() 메서드는 @AfterThrowing 주석을 사용하여 이것이 예외 알림임을 나타냅니다. 즉, 대상 메서드에서 예외가 발생하면 해당 메서드가 호출됩니다. 예외 유형은 Exception입니다. 이는 모든 예외가 이 메소드에서 실행된다는 것을 의미합니다. 예외 유형이 ArithmeticException인 경우, 이는 대상 메소드가 ArithmeticException 예외를 발생시키는 경우에만 해당 메소드가 처리를 위해 입력됨을 의미합니다
A 이 단락의 재작성 버전: @Around로 주석이 달린 around() 메서드를 서라운드 어드바이스라고 합니다. 서라운드 알림은 모든 알림 중에서 가장 강력한 기능을 가지고 있으며 사전 알림, 사후 알림, 예외 알림 및 반환 알림을 구현할 수 있습니다. 대상 메서드가 서라운드 알림에 들어간 후 대상 메서드는 ProceedingJoinPoint 개체의 진행 메서드를 호출하여 실행을 계속합니다. 개발자는 여기에서 대상 메서드의 실행 매개변수, 반환 값 등을 수정하고 여기에서 대상 메서드의 예외를 처리할 수 있습니다.
구성 완료 후 Controller에서 인터페이스를 생성하고 Userservice에서 두 가지 메소드를 각각 호출하면 다음과 같이 LogAspect의 코드가 대상 메소드에 동적으로 포함되어 실행되는 것을 볼 수 있습니다. getUserById 메소드 실행 시작...
get...getUserById 메소드 반환 값: userCustomized Welcome PageSpring Boot 프로젝트가 시작된 후 먼저 정적 리소스 경로에서 홈페이지 파일로 index.html을 검색합니다. 동적 index.html을 홈페이지 파일로 검색합니다.getUserById 메소드 실행 종료...
deleteUserById 메소드 실행 시작...
delete...
deleteUserById 메소드 반환 값: null
deleteUserById 메소드 실행이 종료됩니다...
Others
例如,如果想使用静态的 index.html 页面作为项目的首页,只需在 resources/static 目录下创建 index.html 文件疾苦。若想使用动态页面作为项目首页,则需在 resources/templages 目录下创建 index.html (使用Thymeleaf 模板) 或者 index.ftl(使用 FreeMarker 模板),然后在 Controller 中返回逻辑视图名,如下:
@Controller public class IndexController { @RequestMapping("/index") public String index(){ return "index"; } }
运行项目,输入"http://localhost:8081",查看结果
favicon.ico 是浏览器选项卡左上角的图标,可以放在静态资源路径下或者类路径下,静态资源路径下的 favicon.ico 优先级高于类路径下的 favicon.ico
可以使用在线转换网站:https://www.bitbug.net/ 将一张普通图片转为 .ico 图片,转换成功后,将文件重命名为 favicon.ico ,然后复制到 resources/static 目录下,如图
启动项目,查看效果
注意:清缓存,然后 Ctrl+F5 强制刷新
Spring Boot 中提供了大量的自动化配置类,在 Spring Boot 的入口类上有一个 @SpringBootApplication 注解。该注解是一个组合注解,由 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 组成,其中 @EnableAutoConfiguration 注解开启自动化配置,相关的自动化配置就会被使用。要移除某个自动化配置,开发者可以按照以下方法进行相应的配置更改
@SpringBootApplication @EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class}) public class Chapter04Application { public static void main(String[] args) { SpringApplication.run(Chapter04Application.class, args); } }
在 @EnableAutoConfiguration 注解中使用 exclude 属性去除 Error 的自动化配置类,这时如果在 resources/static/error 目录下创建 4xx.htnl、5xx.html ,访问出错时就不会自动跳转了。由于 @EnableAutoConfiguration 注解的 exclude 属性值是一个数组,因此有多个要排除的自动化配置文件只需要继续添加即可。另外一种配置方法是在 application.properties 文件中进行配置,示例如下:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
添加前
添加后
위 내용은 웹과 SpringBoot의 AOP 통합을 구성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!