02.Spring5.x Aop
阿新 • • 發佈:2020-08-12
第一章:Spring AOP
Aop面向切面程式設計
-
新建一個空的 Java maven專案,命名為【spring01】
-
修改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面向切面程式設計。重點在於使用的是 動態代理模式。在不改變原始碼的基礎上,對方法進心再次加強