Spring AOPハンドルでクイック入門を教えます


Spring AOP入門
今日はSSMの権限ログ情報を書くためにSpring Aop技術を使う必要があります簡単だと思っていましたが、1時間かけて書きました.
一、AOPは何ですか
スプリングの2大核心思想はIOCとAOPにほかならない.ではSpringのaopは神馬の意味ですか?AOPはAspect Oriented Programmingの略で、接面プログラミング向けにプリコンパイル方式とランタイム動的エージェントによって現在ソースコードを修正せずにプログラムに動的に統一的に機能を追加する技術を意味する.AOPは実際にはGoF設計モードの継続であり、設計モードがこつこつと追求しているのは呼び出し者と被呼び出し者との間のデカップリングであり、コードの柔軟性と拡張性を高め、AOPもこのような目標の実現であると言える.
二、何の役に立つか
主にログ記録、性能統計、セキュリティ制御、トランザクション、異常処理などのコードをビジネスロジックコードから区分するために用いられ、これらの動作を分離することで、ビジネスロジックを指導しない方法に独立し、これらの動作を変更する際にビジネスロジックに影響を与えないコードにすることを望んでいます.
三、Demo
1.必要なjarパッケージ

<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.0modelVersion>

    <groupId>com.zixuan007.springgroupId>
    <artifactId>SpringAOPDemoartifactId>
    <version>1.0-SNAPSHOTversion>

    <properties>
        <spring.version>5.2.6.RELEASEspring.version>
    properties>

    <dependencies>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-beansartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-expressionartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-aopartifactId>
            <version>${spring.version}version>
        dependency>
        
        <dependency>
            <groupId>org.aspectjgroupId>
            <artifactId>aspectjrtartifactId>
            <version>1.8.5version>
        dependency>
        <dependency>
            <groupId>org.aspectjgroupId>
            <artifactId>aspectjweaverartifactId>
            <version>1.8.9version>
        dependency>
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.8.1version>
            <scope>testscope>
        dependency>

    dependencies>
project>
Springプロファイル

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                 http://www.springframework.org/schema/beans/spring-beans.xsd
                 http://www.springframework.org/schema/aop
                 http://www.springframework.org/schema/aop/spring-aop.xsd
                 http://www.springframework.org/schema/context
                 https://www.springframework.org/schema/context/spring-context.xsd">

    
    <context:component-scan base-package="com.zixuan007.spring"/>

    
    <aop:aspectj-autoproxy/>

beans>
2.サービス層のインタフェース
package com.zixuan007.spring.service;

import com.zixuan007.spring.pojo.User;

import java.util.List;

public interface UserService {
     

    User findByID(int uid);

    List<User> findAll();
}

3.サービス層実装コード
package com.zixuan007.spring.service.impl;

import com.zixuan007.spring.pojo.User;
import com.zixuan007.spring.service.UserService;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {
     

    public User findByID(int uid) {
     
        System.out.println("findByID Service  ");
        return null;
    }

    public List<User> findAll() {
     
        System.out.println("findAll Service  ");
        return null;
    }
}
3.1第一方式AOP切面類の作成
package com.zixuan007.spring.aspect;

import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 *    
 */

@Component
@Aspect
public class MyAspect {
     

    @Pointcut("execution(* com.zixuan007.spring.service.impl.UserServiceImpl.*(..))")
    public void point(){
     

    }

    @Before("point()")
    public void takeBefore() {
     
        System.out.println("    ");
    }

    @After("point()")
    public void testAfter(){
     
        System.out.println("    ");
    }

    @AfterReturning("point()")
    public void testAfterRuning(){
     
        System.out.println("    ");
    }
}

3.2第二の方式xml配置AOP

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                 http://www.springframework.org/schema/beans/spring-beans.xsd
                 http://www.springframework.org/schema/aop
                 http://www.springframework.org/schema/aop/spring-aop.xsd
                 http://www.springframework.org/schema/context
                 https://www.springframework.org/schema/context/spring-context.xsd">

    
    <context:component-scan base-package="com.zixuan007.spring"/>

    
    <aop:aspectj-autoproxy/>



    <aop:config>
        <aop:pointcut id="pt1" expression="execution(* com.zixuan007.spring.service.impl.UserServiceImpl.*(..))"/>
        <aop:aspect ref="myAspect">
            <aop:before method="testBefore" pointcut-ref="pt1"/>
            <aop:after method="testAfter" pointcut-ref="pt1"/>
            <aop:after-returning method="testAfterRuning" pointcut-ref="pt1"/>
        aop:aspect>
    aop:config>
beans>
4.テスト
package com.zixuan007.test;

import com.zixuan007.spring.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestAspect {
     

    @Test
    public void test(){
     
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
        UserService userService = applicationContext.getBean(UserService.class);
        userService.findAll();
    }
}
5.結果
    
findAll Service