回顾SpringAop

    xiaoxiao2021-03-26  16

    首先回顾几个名词,能用通俗的话来讲就用通俗的来讲

    切面:比如事务,我们要把它单独模块化出来实现,不想影响业务逻辑,那么这个时候我们给业务逻辑添加进入这个事务的功能,它就是切面

    连接点:可以让切面具体实现的一些位置集合称为连接点

    切点:具体切面切入的位置,为切点

    通知:切面要完成的工作,比如事务,保存数据库的正确操作

    引入:向现有的类添加属性合方法

    织入:把切面应用到目标对象,并创建新的代理对象的过程,在目标对象生命周期里有多个点可以织入:1.编译器 2.类加载器 3.运行期

    Spring提供了4种类型的AOP支持

    1.基于代理的经典SpringAop

    2.纯POJO切面

    3.@AspectJ注解驱动的切面

    4.注入式AspectJ切面

    前3种Spring对AOP的直接局限于方法拦截

    PS:Spring只有在需要应用到代理对象才创建它,但是Spring上下文加载后就会完成初始对象的创建

    SpringAOP一般使用Spring结合AspectJ,但是SpringAOP并不能使用所有的AspectJ的功能

    下面是Spring可以使用AspectJ的一些节点

    arg(),@args(),execution(),this(),target(),@target(),within(),@within(),@annotation()

    AspectJ有5个重要的通知

    1.前置通知

    2.后置通知

    3.异常通知

    4.返回通知

    5.环绕通知

    继续注解的形式贴上代码:

    <运行结果>:

    beforeAssit start living... afterAssit returnAssit I am in before start having... I am in returning I am in after next one:sam welcome : sam

    package Model; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; @Component @Aspect public class Assit { //自定义切点 @Pointcut("execution(* Model.Hotel.live(..))") public void rest(){} @Pointcut("execution(* Model.Hotel.having(..))") public void having(){} @Pointcut("execution(* Model.Hotel.welcomeImportantPerson(String))" + "&&args(name)") public void welcome(String name){} //前置通知 @Before("rest()") public void beforeAssit(){ System.out.println("beforeAssit"); } //后置通知 @After("rest()") public void afterAssit(){ System.out.println("afterAssit"); } @AfterReturning("rest()") //返回通知 public void returnAssit(){ System.out.println("returnAssit"); } @AfterThrowing("rest()") //异常通知 public void exceptionAssit(){ System.out.println("exceptionAssit"); } //环绕通知 @Around("having()") public void arroundAssit(ProceedingJoinPoint pp){ System.out.println("I am in before"); try { pp.proceed(); System.out.println("I am in returning"); } catch (Throwable e) { System.out.println("I am in exception"); e.printStackTrace(); } System.out.println("I am in after"); } @Before("welcome(name)") public void beforeWelcome(String name){ System.out.println("next one:"+name); } } package Model; public interface Hotel { void live(); void having(); void welcomeImportantPerson(String name); } package Model; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; @Service("hi") @Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON) public class HotelImp implements Hotel{ @Override public void live() { // TODO Auto-generated method stub System.out.println("start living..."); } @Override public void having() { // TODO Auto-generated method stub System.out.println("start having..."); } @Override public void welcomeImportantPerson(String name) { // TODO Auto-generated method stub System.out.println("welcome : "+name); } }

    转载请注明原文地址: https://ju.6miu.com/read-659680.html

    最新回复(0)