1. 程式人生 > >解決spring aop無法攔截代理內部函式呼叫的問題

解決spring aop無法攔截代理內部函式呼叫的問題

code如下:

public class ServiceAImpl implements ServiceA{
    public void function01(...){
        ...
        this.function02(...);
    }
    ...
    public void function02(...){
        doSomeThing;
    }
}

Spring AOP無法攔截代理內部方法呼叫,若想對function02()方法做切面,則可以在內部呼叫時重新獲得代理物件實現攔截,步驟如下:

  • step 1:寫一個工具類SpringContextUtil實現ApplicationContextAware介面
@Component
public class SpringContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{
        SpringContextUtil.applicationContext = applicationContext;
    }

    public
static ApplicationContext getApplicationContext() { return applicationContext; } public static <T> T getBeanByName(String name) { return (T) applicationContext.getBean(name); } public static <T> T getBeanByClass(Class clazz) { return (T) applicationContext.getBean(clazz); } }
  • step 2:在Spring Boot啟動的時候將ApplicationContext注入SpringContextUtil
public class AuthServiceApplication {

    public static void main(String[] args) {
        ApplicationContext applicationContext = SpringApplication.run(AuthServiceApplication.class, args);
        //SpringContextUtil類已設定了靜態的構造方法,此時可以不需要再次注入
        //SpringContextUtil springContextUtil = new SpringContextUtil();
        //springContextUtil.setApplicationContext(applicationContext);
    }
}
  • step 3:在內部呼叫時重新獲得代理物件
public class ServiceAImpl implements ServiceA{
    ServiceAImpl serviceA;
    public void function01(...){
        ...
        serviceA = SpringContextUtil.getBeanByClass(this.getClass());
        serviceA.function02(...);
    }
    ...
    public void function02(...){
        doSomeThing;
    }
}

相關推薦

解決spring aop無法攔截代理內部函式呼叫的問題

code如下: public class ServiceAImpl implements ServiceA{ public void function01(...){ ... this.function02(...)

spring aop無法攔截內部的方法呼叫

1.概念 攔截器的實現原理就是動態代理,實現AOP機制。Spring 的代理實現有兩種:一是基於 JDK Dynamic Proxy 技術而實現的;二是基於 CGLIB 技術而實現的。如果目標物件實現了介面,在預設情況下Spring會採用JDK的動態代理實現AOP 2.問題 在類C中,方法A呼叫方法B, B方

Spring AOP無法攔截Controller中的方法

想使用AOP Annotation配置Spring MVC的Controller進行攔截, 發現無法攔截Controller的方法, 卻可以攔截Service層的方法. 一開始: Spring的配置檔案applicat

解決Spring MVC DispatcherServlet攔截“/”時,無法訪問靜態資源的問題

方式一:啟用Tomcat的defaultServlet來處理靜態檔案 <!--web.xml--> <servlet-mapping> <servlet-name>default</

spring aop 無法內部巢狀的方法上生效

1,問題 例子: public void method1(){ ......... method2(); ........... } public void method2(){ ............... .......

解決Spring AOP 事務 配置 失效原因--業務類裡丟擲的異常不滿足事務攔截器裡定義的異常

採用AOP配置宣告式事務有5種方式,下面只說關於採用TransactionInterceptor事務攔截器的方式,配置程式如下: transactionManager: Xml程式碼  <beanid="dataSource"class="org.apache

深入理解Spring AOP之二代理對象生成

gets code 網上 none work class als post 產生 深入理解Spring AOP之二代理對象生成 spring代理對象 上一篇博客中講到了Spring的一些基本概念和初步講了實現方

Spring AOP之 動態代理實例

delete 日誌 實現類 imp exc print cati user ins 1.項目結構圖如下3.3.3.1: 圖3.3.3.1 2.IUserServ接口代碼與UserServImpl實現類代碼和上述代碼相同 3.LogHandler類代碼

spring---aop(3)---Spring AOP攔截器鏈

ati handler 攔截器 odi hand zab chain 記載 封裝 寫在前面   時間斷斷續續,這次寫一點關於spring aop攔截器鏈的記載。至於如何獲取spring的攔截器,前一篇博客已經寫的很清楚(spring---aop(2)---Spring AO

Spring AOP獲取攔截方法的參數名稱跟參數值

mon ogg try cat obj 超過 con 同時 point Spring AOP獲取攔截方法的參數名稱跟參數值 註意:這種方式需要JDK1.8版本支持 開始: 1.aop配置: <aop:aspectj-autoproxy expose-proxy

Spring AOP之動態代理

Spring AOP有兩種動態代理的方式,一種是jdk的動態代理,一種是cglib實現的動態代理,看下兩種代理的實現方式。 1.jdk的動態代理 介面: public interface ISaler { public void buy(); } 實現類: public

spring AOP概念及代理模式

spring AOP 代理模式的英文Proxy或Surrogate,中文都可譯為”代理“,代理的含義,就是邀請一個人或者一個機構代表另一個人或者另一個機構採取行動。 在一些情況下,一個客戶不想或者不能夠直接引用一個物件,而代理物件可以在客戶端和目標物件之間起到中介的作用。 JAVA中的動態代理和靜態代理

Spring AOP --JDK動態代理方式

我們知道Spring是通過JDK或者CGLib實現動態代理的,今天我們討論一下JDK實現動態代理的原理。 一、簡述 Spring在解析Bean的定義之後會將Bean的定義生成一個BeanDefinition物件並且由BeanDefinitionHolder物件持有。在

Spring AOP系列之代理建立

Spring Boot AOP系列之動態代理建立 序言:在本文中,我會講到Spring中如何建立動態代理,如何利用jdk或者cglib來建立動態代理,但是同時,我也會提及如何手動建立代理,這將有助於我們瞭解動態代理的原理。我們先來講講如何手動建立吧

Spring-AOP 自動建立代理

導讀 概述 我們通過前面幾篇博文的案例,我們會發現都是通過ProxyFactoryBean建立織入切面的代理,每個需要被代理的Bean都需要使用一個ProxyFactoryBean進行配置。 幸好Spring提供了自動代

解決Spring+Quartz無法自動注入bean問題

工作遇到的問題,使用Quartz定時任務,如果需要用到自動注入,會報空指標異常,看了原文博主的方法,只需要加上 SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 就能正常注

spring aop實現類似代理類和類中的方法(註解實現)

1.可以指定aop的執行次序 [email protected],可以攔截類上有@DataSource註解的類中的所有方法 [email protected]可以攔截有註解@DataSource的方法 4.兩者結合可以實現類似Spring註解

spring aop切面動態代理xml配置實現

上次我已經寫過aop用註解實現的這次是用配置實現,個人感覺配置實現比較好,畢竟程式是給人看的嗎,配置裡寫的一清二楚,別人看來也好懂,而且配置修改起來也比較容易,便於後期維護及修改,而才用註解方式的修改,需要修改註解,或者重寫實現類,比較麻煩,建議採用配置方式實現,至於效能方

spring aop 獲取攔截類中的屬性的值

最近搭建一個ssh的通用架子時,想做個通用日誌的攔截方法,可以利用反射獲取攔截類中的屬性 不多說,上程式碼 日誌類 public class MyLog { public void doBefore(JoinPoint jp) throws SecurityExcepti

spring boot 使用spring AOP實現攔截

在spring boot中,簡單幾步,使用spring AOP實現一個攔截器: 1、引入依賴: <dependency> <groupId>org.springframework.boot</groupId> <art