1. 程式人生 > 實用技巧 >02.Spring5.x Aop

02.Spring5.x Aop

第一章:Spring AOP

Aop面向切面程式設計

  1. 新建一個空的 Java maven專案,命名為【spring01】

  2. 修改pom.xml檔案,增加如下依賴

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</
maven.compiler.target> <spring.version>5.2.5.RELEASE</spring.version> <aopalliance.version>1.0</aopalliance.version> <aspectj.weaver>1.9.2</aspectj.weaver> </properties> <dependencies> <!-- spring --> <
dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</
groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!--切入點表示式的支援--> <dependency> <groupId> org.aspectj</groupId> <artifactId> aspectjweaver</artifactId> <version>1.6.11</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.3</version> </dependency> </dependencies>

3.建立通知類

public class MyAspject {

    public void before() {
        System.out.println("前置通知");
    }
    public Object around(ProceedingJoinPoint j) {

        Object proceed = null;
        try {
            System.out.println("前置通知");
            proceed = j.proceed();
            System.out.println("後置通知");
            return proceed;
        } catch (Throwable throwable) {
            System.out.println("異常通知");
            throwable.printStackTrace();
        }finally{
            System.out.println("最終通知");
        }
        return proceed;
    }

}

4.建立applicationContext配置檔案

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd">

    <bean id="userDao" class="club.gskj.dao.impl.UserDaoImpl"></bean>
    <bean id="aspject" class="club.gskj.aspject.MyAspject"></bean>

<!--配置 切面-->
<aop:config>
<!--切入點表示式-->
<aop:pointcut id="point" expression="execution(* club.gskj.dao..*.*(..))"/>
<!--切入點-->
<aop:aspect ref="aspject">
<aop:before method="before" pointcut-ref="point"/>
<aop:around method="around" pointcut-ref="point" arg-names="j"/>
</aop:aspect>
</aop:config>
</beans>

5.測試類

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class AspectTest {

    @Autowired
    UserDao userDao;

    @Test
    public void teset1() {
        userDao.add();
    }
}

Aop面向切面程式設計,anno註解模式

1. 通知類

@Aspect
@Component
public class MyAspject2 {

    @Pointcut(value = "execution(* club.gskj.dao..*.*(..)))")
    public void pointCut() {
    }

    @Before(value = "pointCut()")
    public void before() {
        System.out.println("前置通知");
    }

    @Around(value = "pointCut()")
    public Object around(ProceedingJoinPoint j) {

        Object proceed = null;
        try {
            System.out.println("前置通知 anno");
            proceed = j.proceed();
            System.out.println("後置通知 anno");
            return proceed;
        } catch (Throwable throwable) {
            System.out.println("異常通知 anno");
            throwable.printStackTrace();
        } finally {
            System.out.println("最終通知 anno");
        }
        return proceed;
    }
}

2. applicationContext配置

 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">

<bean id="userDao" class="club.gskj.dao.impl.UserDaoImpl"></bean>
<bean id="aspject" class="club.gskj.aspject.MyAspject"></bean>


<!--開啟 aop 自動註解-->
<aop:aspectj-autoproxy/>
<!--開啟掃描包-->
<context:component-scan base-package="club.gskj"/>
</beans>


3.測試類測試

    • 總結:

    • aop面向切面程式設計。重點在於使用的是 動態代理模式。在不改變原始碼的基礎上,對方法進心再次加強