JackYin 2020-02-22
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>com.ly.spring</groupId> <artifactId>spring05</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <!--用于解析切入点表达式--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.6</version> </dependency> <!--用于整合junit--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.0.2.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <!--解决IDEA maven变更后自动重置LanguageLevel和JavaCompiler版本的问题--> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>13</source> <target>13</target> </configuration> </plugin> </plugins> </build> </project>
2、实体类
package com.ly.spring.domain; import java.io.Serializable; public class Account implements Serializable { }
3、service接口
package com.ly.spring.service; import com.ly.spring.domain.Account; import java.util.List; public interface IAccountService { public List<Account> findAll(); }
4、service实现类
package com.ly.spring.service.impl; import com.ly.spring.domain.Account; import com.ly.spring.service.IAccountService; import org.springframework.stereotype.Service; import java.util.List; @Service("accountService") public class AccountServiceImpl implements IAccountService { @Override public List<Account> findAll() { System.out.println("AccountServiceImpl---findAll"); int i= 1/0; return null; } }
5、通知类
package com.ly.spring.utils; import org.springframework.stereotype.Component; @Component("logUtil") public class LogUtil { public void beforeFunc() { System.out.println("---前置通知---"); } public void afterReturnFunc() { System.out.println("---后置通知---"); } public void afterThrowFunc() { System.out.println("---异常通知---"); } public void afterFunc() { System.out.println("--最终通知--"); } }
6、spring配置文件
<?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: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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!--配置注解扫描的包--> <context:component-scan base-package="com.ly.spring"></context:component-scan> <!--aop相关配置--> <aop:config> <!--id指定通知的id,ref指定通知bean--> <aop:aspect id="logAdvisor" ref="logUtil"> <!--配置通知类型,method指定调用通知bean的方法,pointcut-ref指定切入点表达式--> <!--前置通知,在目标方法执行前执行--> <aop:before method="beforeFunc" pointcut-ref="logPointCut"></aop:before> <!--后置通知,在目标方法执行后执行,若目标方法抛出异常,则不会执行--> <aop:after-returning method="afterReturnFunc" pointcut-ref="logPointCut"></aop:after-returning> <!--异常通知,在目标方法抛出异常后执行--> <aop:after-throwing method="afterThrowFunc" pointcut-ref="logPointCut"></aop:after-throwing> <!--最终通知,不论目标方法是否抛出异常,都会执行--> <aop:after method="afterFunc" pointcut-ref="logPointCut"></aop:after> <!--配置切入点表达式--> <!-- 1、若配置在aop:aspect标签内则只对当前切面有效 2、可以配置在aop:aspect标签外,此时aop:pointcut标签必须配置在所有的aop:aspect标签前面,对所有的切面有效 --> <aop:pointcut id="logPointCut" expression="execution(* com.ly.spring.service.impl.*.*(..))"/> </aop:aspect> </aop:config> </beans>
7、测试类
package com.ly.spring.test; import com.ly.spring.domain.Account; import com.ly.spring.service.IAccountService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; //替换junit的main方法 @RunWith(SpringJUnit4ClassRunner.class) //指定spring配置文件的位置 @ContextConfiguration(locations = "classpath:bean.xml") public class MainTest { @Autowired private IAccountService accountService; @Test public void test1() { accountService.findAll(); } }