Spring AOP之一般切面编程案例

Spring AOP增强类型

AOP联盟为通知Advice定义了org.aopalliance.aop.Interface.Advice

Spring按照通知Advice在目标类方法的连接点位置,可以分为5类

  • -前置通知 org.springframework.aop.MethodBeforeAdvice
    • 在目标方法执行前实施增强
  • -后置通知 org.springframework.aop.AfterReturningAdvice
    • 在目标方法执行后实施增强
  • -环绕通知 org.aopalliance.intercept.MethodInterceptor
    • 在目标方法执行前后实施增强
  • -异常抛出通知 org.springframework.aop.ThrowsAdvice
    • 在方法抛出异常后实施增强
  • -引介通知 org.springframework.aop.IntroductionInterceptor
    • 在目标类中添加一些新的方法和属性

    Spring AOP切面类型

    Advisor:代表一般切面,Advice本身就是一个切面,对目标类所有方法进行拦截。

    PointcutAdvisor:代表具有切点的切面,可以指定拦截目标类哪些方法

    IntroductionAdvisor:嗲表引介切面,针对引介通知而使用切面(不要求掌握)

    Advisor切面案例

    ProxyFactoryBean常用可配置属性

    – target:代理的目标对象

    – proxyInterfaces:代理要试下你的接口

    如果多个接口可以使用以下格式赋值

    
        
        ……
    
    

    – proxyTargetClass:是否对类代理而不是接口,设置为true时,使用CGLib代理

    – interceptorNames:需要织入目标的Advice

    – singleton:返回代理是否为单实例,默认为单例

    – optimize:当设置为true时,强制使用CGLib

    一般切面案例代码演示

    pom.xml中引入两个包

    
      aopalliance
      aopalliance
      1.0
    
    
      org.springframework
      spring-aop
      4.2.4.RELEASE
    
    

    新建一个包demo3,创建一个接口StudentDao

    package com.jikewenku.aop.demo3;
    
    public interface StudentDao {
        public void find();
    
        public void save();
    
        public void update();
    
        public void delete();
    }
    

    编写实现类StudentDaoImpl

    package com.jikewenku.aop.demo3;
    
    public class StudentDaoImpl implements  StudentDao {
        public void find() {
            System.out.println("学生查询...");
        }
    
        public void save() {
            System.out.println("学生保存...");
        }
    
        public void update() {
            System.out.println("学生修改...");
        }
    
        public void delete() {
            System.out.println("学生删除...");
        }
    }
    

    新建一个MyBeforeAdvice实现MethodBeforeAdvice

    package com.jikewenku.aop.demo3;
    
    import org.springframework.aop.MethodBeforeAdvice;
    
    import java.lang.reflect.Method;
    
    public class MyBeforeAdvice implements MethodBeforeAdvice {
        public void before(Method method, Object[] args, Object target) throws Throwable {
            System.out.println("前置增强======================");
        }
    }
    

    新建一个Spring的配置文件applicationContext.xml

    
    
    
        
        
    
        
        
    
        
        
            
            
            
            
            
            
            
        
    
    

    接下来创建一个测试类

    package com.jikewenku.aop.demo3;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import javax.annotation.Resource;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class SpringDemo3 {
    
        @Resource(name="studentDao")
        private StudentDao studentDao;
    
        @Test
        public void demo1(){
            studentDao.find();
            studentDao.save();
            studentDao.update();
            studentDao.delete();
        }
    }
    

    运行一下程序,其实就是执行了最基本的增删改查操作

    当然上面的我们没有增强,接下来我们增强一下,修改上面的代码

    // @Resource(name="studentDao")
        @Resource(name="studentDaoProxy")
        private StudentDao studentDao;
    

    其他部分不变,然后再运行一下。

    可以看到在我们查询,保存,修改,删除之前都会执行前置增强,它会对我们目标类里的所有方法都进行增强。

本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
极客文库 » Spring AOP之一般切面编程案例

Leave a Reply

欢迎加入「极客文库」,成为原创作者从这里开始!

立即加入 了解更多