Spring-AOP
AOP使用步骤
在Maven配置中导包
<!--在Maven配置中导入-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
在xml文件中导入aop
<!--在Maven配置中导入-->
<beans
xmlns:aop="http://www.springframework.org/schema/aop"
<!--软件自动导入-->
xsi:schemaLocation="http://www.springframework.org/schema/aop"
</beans>
<aop:aspectj-autoproxy proxy-target-class="true"/>
定义切面类
注意需要在Spring中注册同时也需要声明成切面类
//Spring注册
@Component
//声明切面
@Aspect
public class Aspect {
}
定义切入点(切面类中)
注意不能写内容不能有返回值
@Pointcut("execution(* com.qf.spingTest.dao.impl.UserDaoImpl.addShop(..))")
public void pointcut(){
}
注解属性
execution([方法的可见性] 返回类型 [方法所在类的全路径名] 方法名(参数类型列表) [方法抛出的异常类型])
定义注入点(使用注解)
//栗子
@Before("pointcut()")
public void befores(){
System.out.println("前置内容");
}
@AfterThrowing(value = "pointcut()", throwing = "exception")
public void appthrow(Exception exception){
System.out.println("异常内容");
}
五大常用注解(都有相同或不同的参数)
- @Before(“切入点方法”) 前置
- @AfterReturning(“切入点方法”) 后置
- @AfterThrowing(“切入点方法”) 异常
- @Around(“切入点方法”) 环绕
- @After 最终
作用类
打个比方作用与这个Demo类
使用了Maven的Test测试(需要导入JUnit)
//JUnit运行注解
@RunWith(SpringJUnit4ClassRunner.class)
// 引入配置文件
@ContextConfiguration("classpath*:applicationContext.xml")
public class TestDemo {
//依赖注入
@Resource
UserDaoImpl userDao;
@Test
public void UserDaoImpl() throws Exception {
userDao.addShop();
}
}
输出结果
环绕前的代码
前置内容
方法执行到这里了
环绕后的代码
后置内容
总结
spring-aop
基于动态代理aop实现
对aspects支持
执行顺序
public void before(){
System.out.println("2前置通知");
}
public void method(){
System.out.println("1.环绕前");
System.out.println("3.核心方法");
System.out.println("4.环绕后");
}
public void after(){
System.out.println("5.后置通知");
}
public void afterThrow(Exception ex){
System.out.println("4.异常通知");
}
public void finallyMethod(){
System.out.println("6.最终通知");
}