9a捕鱼 当前位置:首页>9a捕鱼>正文

9a捕鱼

发布时间:2019-02-17

原标题:Spring--AOP(面向切面)编程

Spring--AOP(面向切面)编程


AOP

切面就像一把菜刀,将Java处理业务流程进行分割,在分割处添加特定的业务处理。主要应用于声明事务、安全和缓存。在本文中,主要介绍两种切面的实现方法--Java配置和XML配置。

Java配置

  • 创建Java类
    创建一个Music的Java类,用于声明切点

    @Component
    public class Music {
    
    public void perform(int num){
        System.out.println("music");
    }
    }
  • 创建切面
    创建Aop Java类,并声明为切面。声明为切面使用注解@Aspect,同时,切面必须是一个Bean。同时,声明一个切点,避免创建通知的时候重复使用过长的表达式。

    @Component
    @Aspect
    public class Aop {
    
    @Pointcut("execution(** com.tidas.spring.fourth.aopjavaconfig.Music.*(..))")
    public void performer(){}
    
    @Before("performer()")
    public void beforee(){
        System.out.println("before");
    }
    
    @After("performer()")
    public void afterr(){
        System.out.println("after");
    }
    
    @AfterReturning("performer()")
    public void afterReturning(){
        System.out.println("afterreturning");
    }
    
    @AfterThrowing("performer()")
    public void throwingg(){
        System.out.println("throwing");
    }
  • 创建Java配置类
    创建JavaConfiguration 类,创建Bean工厂,在这里需要使用@EnableAspectAutoProxy注解启动Spring切面功能

    @Configuration
    @EnableAspectJAutoProxy
    @ComponentScan
    public class JavaConfiguration {
    }
  • 创建测试类
    创建Main测试类

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes=JavaConfiguration.class)
    public class Main {
    @Autowired
    private Music music;
    @Test
    public void test(){
        music.perform(3);
    }
    }
  • 为通知传递参数
    希望将声明为切点方法中的参数传递到通知当中其,则需要在声明切点的使用指明args参数,在Java中使用&& 在xml中使用and,下面是创建为通知传递参数的切面:

    /*@Pointcut("execution(** com.tidas.spring.fourth.aopjavaconfig.Music.perform(int)) && args(number)")
    public void performer(int number){}
    @Before("performer(number)")
    public void beforee(int number){
        System.out.println("before" + number);
    }
    @After("performer(number)")
    public void afterr(int number){
        System.out.println("after" + number+2);
    }
    @AfterReturning("performer(number)")
    public void afterReturning(int number){
        System.out.println("afterreturning" + number+1);
    }
    @AfterThrowing("performer(number)")
    public void throwingg(int number){
        System.out.println("throwing" + number +3);
    }
  • 另外,还可以使用@Around穿件环绕通知,被声明为环绕通知的方法需要包含参数ProceedingJoinPoint,通过ProceedingJoinPoint.proceed()来区分前置 通知和后置通知,通过try...catch来获取异常通知

    @Component
    @Aspect
    public class AopSecond {
    @Pointcut("execution(** com.tidas.spring.fourth.aopjavaconfig.Music.perform(..))")
    public void performer(){}
    
    @Around("performer()")
    public void per(ProceedingJoinPoint jb){
        try{
            System.out.println("beforeer");
            jb.proceed();
            System.out.println("afterr");
        }catch(Throwable eThrowable){
            System.out.println("exception");
        }
    }
    }

    XML中配置切面

  • 创建Java类

    @Component
    public class AopXml {
    public void performA(){
        System.out.println("performA");
    }
    public void performB(){
        System.out.println("performB");
    }
    }
  • 创建切面类

    @Component
    public class AopConfug {
    public void beforee(){
        System.out.println("before");
    }
    public void afterr(){
        System.out.println("after");
    }
    public void aroundd(ProceedingJoinPoint pb) throws Throwable{
        System.out.println("beforeeee");
        pb.proceed();
        System.out.println("afterrrr");
    }
    }
  • 创建xml配置文件,其中需要添加xmlns:context="http://www.springframework.org/schema/context"http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd,来支持component-scan,同时,还需要配置<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>支持自动注入

    <?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/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
    <context:component-scan base-package="com.tidas.spring.fourth.aopxml"/>
    <!-- 无参数 -->
    <aop:config>
    <aop:aspect ref="aopConfug">
        <aop:pointcut expression="execution(** com.tidas.spring.fourth.aopxml.AopXml.*(..))" id="aopxmll"/>
        <!-- 执行AopXml中的任何方法,都会通知切面 -->
        <aop:before pointcut-ref = "aopxmll" method="beforee"/>
    
        <aop:after pointcut-ref = "aopxmll" method="afterr"/>
    
        <aop:around pointcut-ref = "aopxmll" method="aroundd"/>
        <!-- 对于环绕通知,其实在xml中声明和其它通知声明一样,没有参数,而参数还是在具体的方法中就好 -->
    </aop:aspect>
    </aop:config>
    </beans>
  • 为通知传递参数
    创建带参数的通知

    //有参数
    /*public void beforee(int number){
        System.out.println("number:" + number);
    }*/

    创建带参数的方法

    //有参数
    public void perform(int number){
        System.out.println("perform2");
    }

    切面和切点的配置,在xml中使用and连接args参数

    <aop:config>
    <aop:aspect ref="aopConfug">
        <aop:pointcut expression="execution(** com.tidas.spring.fourth.aopxml.AopXml.*(int)) and args(number)" id="aopxmll"/>
    
        <aop:before pointcut-ref = "aopxmll" method="beforee"/>
    </aop:aspect>
    </aop:config>

    通过切面为Java引入新的功能

当前文章:http://www.radiokey.biz/z8r1k.html

发布时间:2019-02-17 01:07:31

游艇是论吃吗 网上德州扑克计算器 联众菠萝扑克官网版下载 申城棋牌最新版下载 网上打牌和朋友 斗地主赚钱20元可提现 掌心泉州麻将 视频剪辑软件在线 现金棋牌娱乐 晓游棋牌

50626 28701 69949 23614 73532 4176253659 76515 18412

责任编辑:辛邓