动态代理,xml 方式实现 AOP ,切点表达式写法 pointcut、通知种类、切点表达式抽取

一、动态代码

推荐阅读: Spring AOP的实现原理及应用场景(通过动态代理)

二、xml 方式实现 AOP

1、导入坐标 pom.xml

            Aop坐标: aspectjweaver ,spring-context

            Spring测试坐标:junit , spring-test

        
        
            org.springframework
            spring-context
            5.0.5.RELEASE
        
        
            org.aspectj
            aspectjweaver
            1.8.4
        

        
        
            junit
            junit
            4.13.1
        
        
            org.springframework
            spring-test
            5.0.5.RELEASE
        

2、创建目标对象,和切面对象

package com.lt.aop;

public interface TargetInterface {
    void save();
}

 目标对象创建

package com.lt.aop;

public class Target implements TargetInterface {
    @Override
    public void save() {
        System.out.println("save running");
        //int i=1/0;
    }
}

切面对象创建

import org.aspectj.lang.ProceedingJoinPoint;

public class MyAspect {
    public void  before(){
        System.out.println("前置增强。。。");
    }
    public  void afterReturning(){
        System.out.println("后置增强。。。");
    }

    //Proceeding JoinPoint 正在执行的连接点 = 切点
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("前置增强。");
        Object proceed= pjp.proceed(); //切点方法
        System.out.println("后置增强。");
        return proceed;
    }

    public  void afterThrowing(){
        System.out.println("异常抛出增强。");
    }

    public  void after(){
        System.out.println("最终增强。");
    }
}

3、applicationcontext.xml ,创建目标对象、切面对象、配置织入

导入命名空间:

xmlns:aop="http://www.springframework.org/schema/aop"

约束路径:

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



    
    
    
    
    
    
        
        
            
            
            





            
            
            

            
            
            
            

        
    

4、测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationcontext.xml")
public class AopTest {
    @Autowired
    private TargetInterface target;

    @Test
    public  void  Test1(){
        target.save();
    }
}

三、切点表达式的写法 pointcut="execution()"

       com.lt.aop.Target 类下的所有没返回值的方法。    execution(void com.lt.aop.Target.*(..))
       com.lt.aop包下的所有类,所有法(常用)。  execution(* com.lt.aop.*.*(..))
       com.lt.aop包及其子包的所有类,所有方法。  execution(* com.lt.aop..*.*(..))
       所有 。 execution(* *..*.*(..)) 

 

四、通知种类

  前置
 后置
  环绕
  异常
  最终

五、切点表示式抽取




    
    
    
    
    
    
        
        
            

            
            
            
            

        
    

 

你可能感兴趣的:(Java)