spring AOP

本文详细介绍了面向切面编程(AOP)的概念、优势以及如何在Spring框架中配置AOP。通过实例演示如何使用Spring AOP实现动态代理、配置命名空间、引入相关jar包、理解JoinPoint和PointCut等核心概念,并展示了如何通过注解和XML方式实现AOP,以及常用的AOP注解应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是AOP

回答:举列+画图

1.面向切面编程Aspect-Oriented-Programming

a)是对面向对象的思维方式的有力补充

 

3.好处:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码

a)Filter

b)Struts2的interceptor

 

4.概念:

a)JoinPoint链接点:在那些个点或位置上上把我的切面逻辑加上去

b)PointCut切人点, 实际上就是JoinPoint的集合

a)Aspect(切面)

c)Advice切面代表的面,而advice代表这个切面上某个连接点的逻辑

b)Target被代理对象

c)Weave把我们逻辑缝合到那个业务上去

 

Spring AOP配置与应用

1.aspectj是专门用来产生动态代理或者说是专门面向AOP编程的框架,spring可以使用aspectj,使用aspectj必须引入相应的jar包

 

2.加入新的命名空间及schemaLocation:

       A) xmlns:aop="http://www.springframework.org/schema/aop"并且

   在xsi:schemaLocation中添加http://www.springframework.org/schema/aop和http://www.springframework.org/schema/aop/spring-aop-2.5.xsd

 

3.如果想给提示还要在XML catalog中配置

   Location:spring-aop-2.5.xsd的目录(在spring/dist/resources中)

   Key:http://www.springframework.org/schema/aop/spring-aop-2.5.xsd

并且http://www.springframework.org/schema/aop/spring-aop-2.5.xsd后面的

spring-aop-2.5.xsd视情况而定,有时候要,有时候不要也行

 

4.如果想使用annotation来帮你产生代理,那么必须要在xml中声明<aop:aspectj-autoproxy/>  autoproxy的意思是说自动的去帮我产生代理,只要在spring的容器启动过程当中,它扫描到有个东西需要产生代理,它就会帮你产生代理;如果想使用xml来帮你产生代理,那么就不需要xml中声明<aop:aspectj-autoproxy/>

 

5.引入和aspectj相关的jar包:

如果使用的是annotation的话aopalliance.jar是不可少的,如果使用的xml的方式则不需要

 

6.Execution(public * com.bjsxt.dao..*.*(..))意思是

       1.第一个“*”表示返回值可以是任何类型

       2.“Com.bjsxt.dao..”意思是com.bjsxt.dao包及子包中

       3.第二个*表示任何类

       4.第三个*表示任何方法

 

6.一个类你实现了接口后,它就会用jdk自带的proxy和InvocationHandler来帮你产生代理;如果这个类没有实现接口,那么它就会用直接操纵2进制码的类库(要引入cglb的jar包),也就是CGLB来帮你产生代理的代码(这就是使用annotation来实现的动态代理,也就是来实现的AOP的编程);在没

2.两种方式:

a)使用Annotation

b)使用xml

3.Annotation

a)加上对应的xsd文件spring-aop.xsd

b)beans.xml <aop:aspectj-autoproxy />

c)此时就可以解析对应的Annotation了

d)建立我们的拦截类

e)用@Aspect注解这个类

f)建立处理方法

g)用@Before来注解方法

h)写明白切入点(execution …….)

i)让spring对我们的拦截器类进行管理@Component

4.常见的Annotation:

a)@Before

b)@Pointcut

@Pointcut("execution(* com.niit.service.imp.UserServiceImp.addUser(com.niit.model.User))")
public void myMethod(){}

 

  我们在每个advice上面都要定义织入点语法这样有点麻烦,我们干脆跟织入点语法取

个别名myMethod(),这个以后就可以只用method()来代替织入点语法

 

 

c)@AfterReturning在方法返回之后

d)@AfterThrowing  在抛了异常之后

e)@After

f)@Around 

 @Around("myMethod()")
   public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
      System.out.println("method start before....");
      Object retVal = pjp.proceed();
      System.out.println("method end after....");
      return retVal;
   } 

注意:不要依赖与spring的逻辑,到底是@before先执行还是@Around先执行,不要依赖这个

 

注意:

一个类(UserServiceImp)如果实现接口(UserService)时,它就会使用jdk自带的Proxy和InvocationHandler来帮我们产生代理。

但是这个类(UserServiceImp)如果没有实现接口,我们也能产生这个类的代理对象,那么它就会用直接操纵二进制码的方式CGLB来帮我们产生代理的代码,如果这个类如果没有实现接口,那么就必须导入CGLB.jar包

 

5.织入点语法

a)void !void

b)参考文档(* ..)

6.xml配置AOP

关于AOP,annotation的方式可以不用掌握,但xml方式一定要掌握

a)把interceptor对象初始化

b)<aop:config

i.<aop:aspect …..

1.<aop:pointcut

2.<aop:before

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值