SpringAop简单实践(基于注解,基于配置文件)
1.1 Maven引入包
<?xml version="1.0" encoding="UTF-8"?> <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.0</modelVersion> <groupId>org.example</groupId> <artifactId>spring_aop_test20210303</artifactId> <version>1.0-SNAPSHOT</version> <properties> <!-- spring版本号 --> <spring.version>5.2.4.RELEASE</spring.version> <!-- junit版本号 --> <junit.version>4.13.2</junit.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</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.8.7</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </project>
1.2 生成目标类
package com.aop.anno.impl; import com.aop.anno.Target; import org.springframework.stereotype.Component; @Component("target") public class TargetImpl implements Target { public void save() { System.out.println("save..."); } }
1.3 生成切面类(下面用到的切点表达式请关注这篇:https://www.cnblogs.com/year12/p/14469495.html)
package com.aop.anno.impl; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Component("myAspectImpl") @Aspect //标记切面类 public class MyAspectImpl { @Pointcut(value = "execution(* com.aop.anno..*.*(..))") private void myPointcut() {} @Around("execution(* com.aop.anno..*.*(..))") public Object around(ProceedingJoinPoint pjp) throws Throwable { System.out.println("环绕前"); Object proceed = pjp.proceed(); System.out.println("环绕后"); return proceed; } @Before(value="myPointcut()") public void before() { System.out.println("before"); } public void after() { System.out.println("after"); } public void afterReturing() { System.out.println("afterReturing"); } public void throwing() { System.out.println("throwing"); } }
1.4 新建applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.aop.anno"/> <!--开启aop动态代理--> <aop:aspectj-autoproxy/> </beans>
1.5 编写测试类
package com.test.anno; import com.aop.anno.Target; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContextAnno.xml") public class JunitTextAnno { @Resource private Target target; @Test public void test() { target.save(); } }
Nice to see you all!