Spring全自动编写代理-----AOP

spring aop编程:全自动

初步估计这应该是开发中最常用的(因为简单,懒人专用)
Aspectj织入点语法:
1、execution(public * *(..)) 任何类的任何返回值的任何方法

2、execution(* set*(..)) 任何类的set开头的方法

3、execution(* com.xyz.service.AccountService.*(..)) 任何返回值的规定类里面的方法

4、execution(* com.xyz.service…(..)) 任何返回值的,规定包或者规定包子包的任何类任何方法

1.从spring容器获得目标类,如果配置aop,spring将自动生成代理。
2.要确定目标类,aspectj 切入点表达式,导入jar包
spring-framework-3.0.2.RELEASE-dependencies\org.aspectj\com.springsource.org.aspectj.weaver\1.6.8.RELEASE

这里写图片描述

这里写图片描述

下面我们用案例说明一下:

用文字描述往往是枯燥的,结合案例就好多啦,尤其是第一次实现成功,总有点收获的喜悦。

1.现制定一个目标类,也就是被需要代理的类。
首先得有一个借口

package com.fly.aop;

/**
 * 目标类
 * @author Administrator
 *
 */
public interface PersonService {

    public void addPerson();
    public void updataPerson();
    public void deletePerson();
}
其次是这个接口的实现类
package com.fly.aop;

import org.springframework.stereotype.Service;

/**
 * 目标类
 * @author Administrator
 *
 */
@Service("personServiceIml")  //加入Spring管理容器
public class PersonServiceIml implements PersonService {

    @Override
    public void addPerson() {
        System.out.println("**********add*********");
    }

    @Override
    public void updataPerson() {
        System.out.println("**********updata*********");
    }

    @Override
    public void deletePerson() {
        System.out.println("**********delete*********");
    }

}

接下来有了目标类,有了目标类中的方法(切入点),就可以创建切面类啦,这个切面类是最基本的用法,后面我们会写个复杂用法的案例
直接指定要织入的位置和逻辑:下面的代码

package com.fly.aop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * 切面类
 * @author Administrator
 *
 */
@Component("myAspect")  
@Aspect  // 声明切面
public class MyAspect {

    // 指定织入的方法     也就是在调用addPerson()这个方法前织入下面的方法
    @Before(value = "execution(public void addPerson())")
    public void before(){
        System.out.println("********前面************");
    }

    // 指定织入的方法   也就是在调用deletePerson()这个方法后织入下面的方法
    @After(value = "execution(public void deletePerson())")
    public void after(){
        System.out.println("***********后面**********");
    }

}

配置文件applicationContext.xml

<?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 
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/aop 
                           http://www.springframework.org/schema/aop/spring-aop.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 1.扫描 注解类 -->
    <context:component-scan base-package="com.fly.aop"></context:component-scan>

    <!-- 2.确定 aop注解生效 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

</beans>

测试类:

package com.fly.aop;

import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDemo1 {

    @Test
    public void demo(){
        String xmlPath = "com/fly/aop/applicaitonContext.xml";
        BeanFactory context = new ClassPathXmlApplicationContext(xmlPath);
        PersonService bean = (PersonService) context.getBean("personServiceIml");
        bean.addPerson();
        bean.updataPerson();
        bean.deletePerson();
    }
}

打印结果如下:

2017-3-3 9:36:53 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@78dc6a77: startup date [Fri Mar 03 09:36:53 CST 2017]; root of context hierarchy
2017-3-3 9:36:53 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [com/fly/aop/applicaitonContext.xml]
2017-3-3 9:36:53 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@75bc16f0: defining beans [myAspect,personServiceIml,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
********前面************
**********add*********
**********updata*********
**********delete*********
***********后面**********

在其他类配置文件不变的情况下,我们再来改动一下切面类:

 package com.fly.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
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;

/**
 * 切面类
 * @author Administrator
 *
 */
@Component("myAspect")  
@Aspect  // 声明切面
public class MyAspect {

    // 指定织入的方法     也就是在调用addPerson()这个方法前织入下面的方法
    @Before(value = "execution(public void addPerson())")
    public void before(){
        System.out.println("********前面************");
    }

    // 指定织入的方法   也就是在调用deletePerson()这个方法后织入下面的方法
    @AfterReturning(value = "execution(public void deletePerson())")
    public void after(){
        System.out.println("***********后面**********");
    }

/*****************************通过定义pointcut来指定:****************************************************************/

    // 声明公共切入点或者说(定义pointcut织入点集合)
    @Pointcut("execution(public void deletePerson())")
    public void MyMethod(){}

    @Before("MyMethod()")
    public void beforeMethod(){
        System.out.println("*******鸡首*******");
    }

    @AfterReturning("MyMethod()")
    public void afterMethod(){
        System.out.println("*******凤尾*******");
    }

    // 或者下面这种方式

    //执行前后都拦截。以pjp.proceed的方法分割开来
    @Around("MyMethod()")
    public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("***********before**********");
        pjp.proceed();
        System.out.println("*********after***********");
    }

}

测试类:

package com.fly.aop;

import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDemo1 {

    @Test
    public void demo(){
        String xmlPath = "com/fly/aop/applicaitonContext.xml";
        BeanFactory context = new ClassPathXmlApplicationContext(xmlPath);
        PersonService bean = (PersonService) context.getBean("personServiceIml");
//      bean.addPerson();
//      bean.updataPerson();
        bean.deletePerson();
    }
}

打印结果:

2017-3-3 10:06:56 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1b016632: startup date [Fri Mar 03 10:06:56 CST 2017]; root of context hierarchy
2017-3-3 10:06:56 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [com/fly/aop/applicaitonContext.xml]
2017-3-3 10:06:57 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@f8622f3: defining beans [myAspect,personServiceIml,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
***********before**********
*******鸡首*******
**********delete*********
*********after***********
***********后面**********
*******凤尾*******
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值