Spring AOP 注解方式
-
添加依赖
junit测试工具
spring-context核心依赖
AspectJ依赖,面向切面的框架,定义了AOP语法
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.16.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>com.springsource.org.aspectj.weaver</artifactId> <version>1.6.8.RELEASE</version> </dependency>
-
resources目录下新建aop.xml文件
-
spring基本命名空间
xmlns:context="http://www.springframework.org/schema/context"
-
aop基本命名空间
xmlns:aop="http://www.springframework.org/schema/aop"
-
配置包扫描和自动代理
<!-- context:组件 component-scan:扫描 base-package:指定扫描的包的路径 --> <context:component-scan base-package="com.qfedu.aop06"/> <!--实现自动代理--> <aop:aspectj-autoproxy/>
-
-
写接口类IUserService
import java.util.List; public interface IUserService { /** * 获取所有的用户对象列表 * @return */ List<Object> getAllUser(); /** * 保存用户 * @param user * @return */ boolean saveUser(Object user); /** * 根据用户uid删除该uid对应的用户信息 * @param uid * @return */ boolean deleteUser(int uid); /** * 更新指定用户信息 * @param obj * @return */ boolean updateUser(Object obj); }
-
UserServiceImpl实现接口
-
使用@Component注解将此类添加为组件并且命名为'us'
/*组件*/ @Component("us") public class UserServiceImpl implements IUserService { @Override public List<Object> getAllUser() { System.out.println("--------getAllUser----------"); // System.out.println(1/0); return new ArrayList<>(); } @Override public boolean saveUser(Object user) { System.out.println("--------saveUser----------"); return true; } @Override public boolean deleteUser(int uid) { System.out.println("--------deleteUser----------"); return false; } @Override public boolean updateUser(Object obj) { System.out.println("--------updateUser----------"); return true; } }
-
-
MyAspect通知类
@Component注解将其添加为组件
@Aspect注解将其设置为通知类
@Pointcut设置execution,规定代理的区间
@Before代理类执行前
@After代理类执行后
@Around代理类执行前后,使用注解方式时默认在before前和after后
@AfterReturning有返回值时执行
-
@AfterThrowing有异常时执行
@Component @Aspect public class MyAspect { @Pointcut(value = "execution(* com.qfedu.aop06.*.*(..))") public void setAll() {} /** * 被代理对象之前的方法 */ @Before("setAll()") public void before(){ System.out.println("---------before----------"); } /** * 被代理对象之后的方法 */ @After("setAll()") public void after(){ System.out.println("---------after----------"); } @Around("setAll()") public Object around(ProceedingJoinPoint proceedingJoinPoint) { try { System.out.println("---------around before----------"); Object object = proceedingJoinPoint.proceed(); System.out.println("---------around after----------"); return object; } catch (Throwable throwable) { throwable.printStackTrace(); } return null; } @AfterReturning(value = "setAll()",returning = "object") public void myReturn(JoinPoint joinPoint,Object object) { System.out.println("---------myReturn----------"+object); } @AfterThrowing(value = "setAll()",throwing = "e") public void myThrow(JoinPoint jp, Throwable e) { System.out.println("---------myThrow----------"+e.getMessage()); } }
-
测试类
public class TestAOP06 { @Test public void testAOP06(){ ApplicationContext ac = new ClassPathXmlApplicationContext("aop.xml"); IUserService us = ac.getBean("us", IUserService.class); us.getAllUser(); } }