ホームページ  >  記事  >  Java  >  SpringBoot の AOP と Web の統合を構成する方法

SpringBoot の AOP と Web の統合を構成する方法

WBOY
WBOY転載
2023-05-18 18:47:27849ブラウズ

AOP の構成

AOP の概要

アスペクト指向プログラミング (AOP) を導入するには、まず次のようなシナリオを検討する必要があります。現在、会社には人事管理システムがあります。オンラインになっていますが、システムの動作が不安定で、動作が非常に遅い場合があります。どのリンクに問題があるかを検出するために、開発者は各メソッドの実行時間を監視し、これらの実行時間に基づいて問題を判断したいと考えています。問題が解決したら、これらのモニターを取り外します。システムは現在実行中です。システム内の何千ものメソッドを手動で変更すると、作業負荷が大きくなりすぎるため、将来的にはこれらの監視メソッドを削除する必要があります。システムの実行中にコードを動的に追加できる場合は、問題は非常によく解決できます。アスペクト指向プログラミング (AOP) は、システム ランタイムにコードを動的に追加する方法です。 Spring Boot は AOP を適切にサポートします。 AOP には、理解すべき共通の概念がいくつかあります。

  • 結合ポイントは、拡張可能なクラス内のメソッドを指します。たとえば、そのメソッドの機能を変更する場合、そのメソッドは接続ポイントです。

  • ポイントカットは、ジョインポイントのインターセプトを定義する操作を指します。この定義は、エントリ ポイントとして挿入で始まるすべてのメソッドをインターセプトすることを指します。

  • Joinpoint をインターセプトした後、実行される操作は通知を送信することです。たとえば、前述した印刷ログの監視です。通知は、事前通知、事後通知、例外通知、最終通知、および周囲の通知に分類されます

  • アスペクト: ポイントカットとアドバイスの組み合わせ

  • Target (ターゲット オブジェクト): 拡張されるクラスは Target になります

Spring Boot サポート

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.service パッケージの下に 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();
    }
}

コードの説明:

  • @アスペクト アノテーションは、これがアスペクト クラスであることを示します

  • @ Pointcut() アノテーションは、ポイントカットを定義するためにメソッド pc1() で使用されます。実行中の最初の * はメソッドが任意の値を返すことを示し、2 番目の * はサービス パッケージ内の任意のクラスを示し、3 番目の * はクラス内の任意のメソッドを示し、括弧内の 2 つのドットはメソッド パラメータが任意であることを示します。ここでのエントリ ポイントは、サービス パッケージ内のすべてのクラスのすべてのメソッドです。

  • before() メソッドは、これが事前通知であることを示す @Before アノテーションを使用し、メソッドが実行されます。ターゲットメソッドの実装前。 JoinPoint パラメーターは、ターゲット メソッドに関する名前、修飾子、およびその他の情報を提供できます。

  • after() メソッドは、これが事後通知であることを示す @After アノテーションを使用し、メソッドターゲット メソッド内にあります。 実行後に実行します。

  • afterReturning() メソッドは @AfterReturning アノテーションを使用し、これがリターン通知であることを示します。ターゲット メソッドの戻り値は次で取得できます。この方法。 @AfterReturning アノテーションの戻りパラメータは、メソッドのパラメータに対応する戻り値の変数名を表します。結果の型はメソッド パラメーターで Object として定義されていることに注意してください。つまり、ターゲット メソッドの戻り値は任意の型にすることができます。結果パラメーターの型が Long の場合、メソッドは次の状況のみを処理できます。ターゲット メソッドの戻り値は Long

  • afterThrowing() メソッドは @AfterThrowing アノテーションを使用し、これが例外通知であること、つまりターゲット メソッドで例外が発生したことを示します。例外の種類が Exception である場合、すべての例外がこのメソッドで Executed に入ります。例外の種類が ArithmeticException の場合、ターゲット メソッドが ArithmeticException 例外をスローした場合にのみメソッドが開始されることを意味します。

  • この段落の書き直されたバージョン: @Around アノテーションが付けられた around() メソッドはサラウンド アドバイスと呼ばれます。サラウンド通知はすべての通知の中で最も強力な機能を持ち、事前通知、事後通知、例外通知、復帰通知を実装できます。ターゲット メソッドがサラウンド通知に入った後、ターゲット メソッドは ProceedingJoinPoint オブジェクトのプロシージャ メソッドを呼び出すことで実行を継続します。開発者はここでターゲット メソッドの実行パラメータ、戻り値などを変更し、ここでターゲット メソッドの例外を処理できます。 .

設定が完了したら、Controller でインターフェイスを作成し、Userservice の 2 つのメソッドをそれぞれ呼び出します。LogAspect のコードがターゲット メソッドに動的に埋め込まれていることがわかります。

getUserById メソッドが実行を開始します...
get...
getUserById メソッドの戻り値は次のとおりです: user
getUserById メソッドの実行が終了します...
deleteUserById メソッドが実行を開始します...
delete...
deleteUserById メソッドの戻り値は次のとおりです: null
deleteUserById メソッドの実行が終了します...

Others

カスタマイズされたウェルカム ページ

Spring Boot プロジェクトが開始されると、最初に静的リソース パスでホーム ページ ファイルとしてindex.html が検索されます。見つからない場合は、動的リソース パスが検索されます。 Index.html をホームページ ファイルとして使用します。

例如,如果想使用静态的 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",查看结果

SpringBoot の AOP と Web の統合を構成する方法

自定义 favicon

favicon.ico 是浏览器选项卡左上角的图标,可以放在静态资源路径下或者类路径下,静态资源路径下的 favicon.ico 优先级高于类路径下的 favicon.ico

可以使用在线转换网站:https://www.bitbug.net/ 将一张普通图片转为 .ico 图片,转换成功后,将文件重命名为 favicon.ico ,然后复制到 resources/static 目录下,如图

SpringBoot の AOP と Web の統合を構成する方法

启动项目,查看效果

SpringBoot の AOP と Web の統合を構成する方法

注意:清缓存,然后 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 と Web の統合を構成する方法

添加后

SpringBoot の AOP と Web の統合を構成する方法

以上がSpringBoot の AOP と Web の統合を構成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。