Spring 基于注解配置的AOP框架详细讲解
Posted 张梦源
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 基于注解配置的AOP框架详细讲解相关的知识,希望对你有一定的参考价值。
作用:Spring 基于XML配置的AOP框架详细讲解_代码人生的博客-CSDN博客
可以看小编基于XML配置的AOP框架详细讲解
下面说的是具体注解的使用,方便简单,内容很少!
最重要的在xml文件中写入
1.配置环境(注解配置可以省略本步骤但是要加上下面这三行代码
@Configuration
@ComponentScan(basePackages="com.bookmanagesystem")
类似于xml配置里面的
<context:component-scan base-package="com.bookmanagesystem">
</context:component-scan>
@EnableAspectJAutoProxy!)
外加一个SpringConfiguration配置类
最后在main当中把获取核心容器对象 当中
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
改为
@Configuration
@ComponentScan(basePackages="com.bookmanagesystem")
@EnableAspectJAutoProxy
public class SpringConfiguration {
}
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://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.iflytek.bookmanagesystem"></context:component-scan>
<!-- 配置Spring开启注解AOP的支持 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
2.注解的main函数和xml配置的区别
public static void main(String[] args) {
// 1. 获取核心容器对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2. 根据id获取bean对象
IUserService service = (IUserService) context.getBean("userServiceImpl");
service.update();
// 3.关闭容器(如果不记得关闭容器,最典型的问题就是数据库连接不能释放)
((ClassPathXmlApplicationContext) context).close();
}
3.注解的MyLogger织入文件和xml配置区别
@Component//表明bean对象进入容器
@Aspect//表明是一个切面,作用和<aop:aspect></aop:aspect>一样
@Configuration
@ComponentScan(basePackages="com.bookmanagesystem")
@EnableAspectJAutoProxy
public class MyLogger {
// 注解配置切入点表达式
@Pointcut("execution(* com.bookmanagesystem.service.impl.*.*(..))")
private void pc1() {
}
// 前置通知
// 这里的value要填写绑定到通知的切入点表达式,所以这里要填上切入点表达式。
// 注意这里面的切入点表达式引用时必须带上小括号,如果不带会导致解析失败
@Before("pc1() ")
public void beforePrintLog() {
System.out.println("前置通知MyLogger类中的beforePrintLog方法开始记录日志了。。。");
}
// 后置通知
@AfterReturning("pc1()")
public void afterReturningPrintLog() {
System.out.println("后置通知MyLogger类中的afterReturningPrintLog方法开始记录日志了。。。");
}
// 异常通知
@AfterThrowing("pc1()")
public void afterThrowingPrintLog() {
System.out.println("异常通知MyLogger类中的afterThrowingPrintLog方法开始记录日志了。。。");
}
// 最终通知
@After("pc1()")
public void afterPrintLog() {
System.out.println("最终通知MyLogger类中的afterPrintLog方法开始记录日志了。。。");
}
//环绕通知
@Around("pc1()")
public Object aroundPrintLog(ProceedingJoinPoint pjp) {
Object result = null;
try {
Object[] args = pjp.getArgs(); // 得到方法执行所需的参数
System.out.println("记录日志前置");
result = pjp.proceed(args); // 明确调用业务层方法(切入点方法)
System.out.println("记录日志后置");
return result;
} catch (Throwable e) { // proceed方法抛出了Throwable,这里用Exception拦不住
System.out.println("记录日志异常");
e.printStackTrace();
throw new RuntimeException(e);
} finally {
System.out.println("记录日志最终");
} }
}
4.扩展@Pointcut,@Component ,@Aspect 理解
@Component //表明bean对象进入容器, 相当于在xml文件里面配置了一个bean文件
详解见spring 创建对象的注解@Component@Controller@service@Repository_代码人生的博客-CSDN博客
@Aspect
表明是一个切面,作,用和<aop:aspect></aop:aspect>一样,aop:aspect 标签表明配置切面 ,在 aop:aspect 标签内部使用对应标签来配置通知的类型,前置后置等等具体详解见
Spring 基于XML配置的AOP框架详细讲解_代码人生的博客-CSDN博客 第9点
@Pointcut
@Pointcut("execution(* com.iflytek.bookmanagesystem.service.impl.*.*(..))")
private void pc1() {}
@Before("pc1() ")
public void beforePrintLog() {
System.out.println("前置通知MyLogger类中的beforePrintLog方法开始记录日志了");
}
等同于xml当中的
<aop:pointcut expression="execution(* com.bookmanagesystem.service.impl.*.*(..) )"
id="pc1" />
作用是配置前置,后置,最终,异常,环绕时候更方便的使用
例如
<!-- 1. 配置前置通知 -->
<!-- <aop:before method="beforePrintLog" pointcut-ref="pc1" /> -->
缺的文件和上面链接里面一致!!!
以上是关于Spring 基于注解配置的AOP框架详细讲解的主要内容,如果未能解决你的问题,请参考以下文章