真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringAOP在web應(yīng)用中的使用

之前的aop是通過手動創(chuàng)建代理類來進行通知的,但是在日常開發(fā)中,我們并不愿意在代碼中硬編碼這些代理類,我們更愿意使用DI和IOC來管理aop代理類。Spring為我們提供了以下方式來使用aop框架

專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站制作服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)華坪免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

一、以聲明的方式配置AOP(就是使用xml配置文件)

1.使用ProxyFactoryBean的方式:
ProxyFactoryBean類是FactoryBean的一個實現(xiàn)類,它允許指定一個bean作為目標,并且為該bean提供一組通知和顧問(這些通知和顧問最終會被合并到一個AOP代理中)它和我們之前的ProxyFactory都是Advised的實現(xiàn)。

以下是一個簡單的例子:一個學(xué)生和一個老師,老師會告訴學(xué)生應(yīng)該做什么。
public class Student {

public void talk() {
    System.out.println("I am a boy");
}

public void walk() {
    System.out.println("I am walking");
}

public void sleep() {
    System.out.println("I want to sleep");
}

}
老師類

public class Teacher {

private Student student;

public void tellStudent(){
    student.sleep();
    student.talk();
}

public Student getStudent() {
    return student;
}

public void setStudent(Student student) {
    this.student = student;
}

}
我們創(chuàng)建一個通知類,這個和之前是一樣的SpringAOP中的通知類型以及創(chuàng)建
package cn.lyn4ever.aop;

import org.aspectj.lang.JoinPoint;

public class AuditAdvice implements MethodBeforeAdvice {@Override
br/>@Override
System.out.println("這個方法被通知了" + method.getName());
}
}
然后就使用spring的IOC來管理這個通知類,在xml配置文件中聲明如下:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
https://www.springframework.org/schema/util/spring-util.xsd">







    
    
    







    




    advice


測試類
public static void main(String[] args) {
GenericXmlApplicationContext context = new GenericXmlApplicationContext();
context.load("application1.xml");
context.refresh();

    Teacher teacher = (Teacher) context.getBean("teacherOne");
    teacher.tellStudent();

}

運行結(jié)果沒有問題
SpringAop在web應(yīng)用中的使用
以上是通過直接創(chuàng)建通知的方式,接下來我們試一個創(chuàng)建一個切入點(因為以上是對類中所有方法都進行通知,這時我們使用切入點只對其中部分方法進行通知),在xml配置文件中添加如下。

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
https://www.springframework.org/schema/util/spring-util.xsd">







    
    
    







    




    advice











    advisor




    
        
        
    


SpringAop在web應(yīng)用中的使用

上圖中的那個aspectj表達式寫錯了,在代碼中有正確的
title
2.使用aop名稱空間
在xml中引入如下的名稱空間,為了不被影響,我冊了其他多余的名稱空間。然后很普通地注入我們之前那三個bean


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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
">






    





    
    
        
        
        
    


在這個配置中,我們還可以配置其他類型的通知,但是這個method屬性一定要寫我們自定義的那個通知類中的方法

SpringAop在web應(yīng)用中的使用

在aop:pointcut中寫expression時還支持如下語法:


3.使用@AspectJ樣式注解方式
br/>-->
3.使用@AspectJ樣式注解方式

為了方便,就只寫了一個HighStudent,而且直接調(diào)用它的方法,不依賴于外部的teacher實例來調(diào)用
package cn.lyn4ever.aop.aspectj;

import cn.lyn4ever.aop.aopconfig.Teacher;
import org.springframework.stereotype.Component;

/**

  • 聲明這是一個SpringBean,由Spring來管理它*/
    @Component
    br/>*/
    @Component

    public void talk() {
    System.out.println("I am a boy");
    }

    public void walk() {
    System.out.println("I am walking");
    }

    /**

    • 這個方法添加一個teacher來做為參數(shù),為了配置后邊切入點中的args()
    • @param teacher
      */
      public void sleep(Teacher teacher) {
      System.out.println("I want to sleep");
      }
      }
      創(chuàng)建切面類
      package cn.lyn4ever.aop.aspectj;

import cn.lyn4ever.aop.aopconfig.Teacher;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
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 //聲明交由spring管理
    @Aspect //表示這是一個切面類
    public class AnnotatedAdvice {

    /
    創(chuàng)建切入點,當然也可以是多個
    /
    @Pointcut("execution( talk(..))")
    public void talkExecution(){}

    @Pointcut("bean(high*)")//這里為什么是high,因為我們這回測試bean是highStudent
    public void beanPoint(){}

    @Pointcut("args(value)")
    public void argsPoint(Teacher value){}

    /
    創(chuàng)建通知,當然也可以是多個
    這個注解的參數(shù)就是上邊的切入點方法名,注意有的還帶參數(shù)
    這個通知方法的參數(shù)和之前一樣,榀加JoinPoint,也可不加
    /@Before("talkExecution()")
    br/>@Before("talkExecution()")
    System.out.println("before: Do Something"+joinPoint.getSignature().getName()+"()");
    }

    /**

    • 環(huán)繞通知請加上ProceedingJoinPoint參數(shù) ,它是joinPoint的子類
    • 因為你要放行方法的話,必須要加這個
    • @param joinPoint
    • @param teacher
      */
      @Around("argsPoint(teacher) && beanPoint()")
      public Object doSomethindAround(ProceedingJoinPoint joinPoint, Teacher teacher) throws Throwable {
      System.out.println("Around: Before Do Something"+joinPoint.getSignature().getName()+"()");
      Object proceed = joinPoint.proceed();
      System.out.println("Around: After Do Something"+joinPoint.getSignature().getName()+"()");

      return proceed;
      }

}
xml中配置開啟掃描注解

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
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 https://www.springframework.org/schema/context/spring-context.xsd">






使用Java注解配置的方式配置掃描注解

@Configuration //聲明這是一個配置類@ComponentScan("cn.lyn4ever.aop.aspectj")
br/>@ComponentScan("cn.lyn4ever.aop.aspectj")

public class BeanConfig {
}
測試方法
package cn.lyn4ever.aop.aspectj;

import cn.lyn4ever.aop.aopconfig.Teacher;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class AspectMain {
public static void main(String[] args) {
// xmlConfig();
javaConfig();

}

private static void javaConfig() {
    GenericApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);
    HighStudent student = (HighStudent) context.getBean("highStudent");
    student.sleep(new Teacher());//應(yīng)該被環(huán)繞通知
    System.out.println();

    student.talk();//前置通知
    System.out.println();

    student.walk();//不會被通知
    System.out.println();
}

private static void xmlConfig(){
    GenericXmlApplicationContext context = new GenericXmlApplicationContext();
    context.load("application_aspect.xml");
    context.refresh();

    HighStudent student = (HighStudent) context.getBean("highStudent");
    student.sleep(new Teacher());//應(yīng)該被環(huán)繞通知
    System.out.println();

    student.talk();//前置通知
    System.out.println();

    student.walk();//不會被通知
    System.out.println();
}

名稱欄目:SpringAOP在web應(yīng)用中的使用
文章轉(zhuǎn)載:http://weahome.cn/article/pocess.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部