精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring AOP 中被代理的對象一定是單例嗎?

開發 前端
小伙伴們看到,setTarget 方法內部調用了 setTargetSource 方法,這個方法設置了一個 SingletonTargetSource 來作為 targetSource,從名字上就能看出來,這個 SingletonTargetSource 是一個單例的 targetSource。

今天我們來思考這樣一個問題:在 Spring AOP 中,被代理的對象是單例的嗎?當我們每次獲取到代理對象的時候,都會重新獲取一個新的被代理對象嗎?還是被代理的對象始終是同一個?

為什么要思考這個問題,因為在松哥接下來要講的 @Scope 注解高級用法中涉及到這個知識點。

1. 問題呈現

假設我有如下一個計算器接口:

public interface ICalculator {
    void add(int a, int b);

    int minus(int a, int b);
}

然后給這個接口提供一個實現類:

public class CalculatorImpl implements ICalculator {
    @Override
    public void add(int a, int b) {
        System.out.println(a + "+" + b + "=" + (a + b));
    }

    @Override
    public int minus(int a, int b) {
        return a - b;
    }
}

現在假設我要生成一個代理對象,利用編程式的方式,代碼如下:

ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(new CalculatorImpl());
proxyFactory.addInterface(ICalculator.class);
proxyFactory.addAdvice(new MethodInterceptor() {
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        Method method = invocation.getMethod();
        String name = method.getName();
        System.out.println(name+" 方法開始執行了。。。");
        Object proceed = invocation.proceed();
        System.out.println(name+" 方法執行結束了。。。");
        return proceed;
    }
});
ICalculator calculator = (ICalculator) proxyFactory.getProxy();
calculator.add(3, 4);

這里幾個方法應該都好理解:

  1. setTarget 方法是設置真正的被代理對象。這個在我們之前的 @Lazy 注解為啥就能破解死循環?一文中大家已經接觸過了。
  2. addInterface,基于 JDK 的動態代理是需要有接口的,這個方法就是設置代理對象的接口。
  3. addAdvice 方法就是添加增強/通知。
  4. 最后通過 getProxy 方法獲取到一個代理對象然后去執行。

最終打印結果如下:

圖片圖片

這是一個簡單的 AOP 案例。

現在我們的問題在于 setTarget 方法上。

我們點進來到 setTarget 方法上看一下這個方法做了什么:

public void setTarget(Object target) {
 setTargetSource(new SingletonTargetSource(target));
}

小伙伴們看到,setTarget 方法內部調用了 setTargetSource 方法,這個方法設置了一個 SingletonTargetSource 來作為 targetSource,從名字上就能看出來,這個 SingletonTargetSource 是一個單例的 targetSource。

因此,對于上面的代碼,我們可以推斷,多個不同的代理對象中持有的相同的被代理對象,例如下面這段代碼:

ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(new CalculatorImpl());
proxyFactory.addInterface(ICalculator.class);
proxyFactory.addAdvice(new MethodInterceptor() {
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        Method method = invocation.getMethod();
        String name = method.getName();
        System.out.println(name+" 方法開始執行了。。。");
        Object proceed = invocation.proceed();
        System.out.println(name+" 方法執行結束了。。。");
        return proceed;
    }
});
ICalculator calculator = (ICalculator) proxyFactory.getProxy();
ICalculator calculator2 = (ICalculator) proxyFactory.getProxy();
calculator2.add(2, 3);

我們分別獲取了 calculator 和 calculator2 兩個代理對象,但是實際上,這兩個代理對象中持有的是同一個被代理對象,如下圖:

圖片圖片

從這張圖可以看出,代理對象不是同一個,但是被代理對象其實是同一個。

2. TargetSource

在 Spring AOP 中,否則處理代理對象的接口是 TargetSource,TargetSource 有諸多實現類,不同實現類具備不同的能力:

圖片圖片

很多實現類單純從名字上就能看出來其特點了。

我們先來看下 TargetSource 接口:

public interface TargetSource extends TargetClassAware {
 @Override
 @Nullable
 Class<?> getTargetClass();
 boolean isStatic();
 @Nullable
 Object getTarget() throws Exception;
 void releaseTarget(Object target) throws Exception;
}

這個接口一共是四個方法:

  1. getTargetClass:這個是返回被代理對象的類型。
  2. isStatic:這個方法判斷被代理對象是否是不變的,也可以理解為返回被代理對象是否是單例的,不過這個方法并不控制單例的實現,這個方法存在意義在于,如果該方法返回 true,表示被代理的對象是單例的,那么將來就不用調用 releaseTarget 方法去釋放對象,反之,如果這個方法返回 false,表示被代理的對象不是單例的,那么就需要在使用完被代理的對象之后,調用 releaseTarget 方法將之釋放掉。
  3. getTarget:這個方法就是返回被代理對象。
  4. releaseTarget:釋放被代理的對象。

TargetSource 的實現類比較多,我們來看幾個典型的實現類。

2.1 SingletonTargetSource

先來看這個類的定義:

public class SingletonTargetSource implements TargetSource, Serializable {
    @SuppressWarnings("serial")
 private final Object target;
 public SingletonTargetSource(Object target) {
  Assert.notNull(target, "Target object must not be null");
  this.target = target;
 }
 @Override
 public Class<?> getTargetClass() {
  return this.target.getClass();
 }
 @Override
 public Object getTarget() {
  return this.target;
 }
 @Override
 public void releaseTarget(Object target) {
  // nothing to do
 }
 @Override
 public boolean isStatic() {
  return true;
 }
}

如果被代理的對象是單例的,那么我們就會選擇使用 SingletonTargetSource,被代理的對象總是在 getTarget 方法中被調用,然而這個方法返回的總是同一個對象,所以最終被代理的對象就是單例的。

同時,由于被代理對象是單例的,因此 isStatic 方法返回 true,releaseTarget 中不需要額外操作。

2.2 SimpleBeanTargetSource

SimpleBeanTargetSource 比較典型,這個是每當需要的時候,就去 Spring 容器中查找相應的被代理的 Bean,至于這個被代理的 Bean 是否為單例,就由 Spring 容器來控制了:

public class SimpleBeanTargetSource extends AbstractBeanFactoryBasedTargetSource {
 @Override
 public Object getTarget() throws Exception {
  return getBeanFactory().getBean(getTargetBeanName());
 }
}
public abstract class AbstractBeanFactoryBasedTargetSource implements TargetSource, BeanFactoryAware, Serializable {
 @Nullable
 private String targetBeanName;
 @Nullable
 private volatile Class<?> targetClass;
 @Nullable
 private BeanFactory beanFactory;
 public void setTargetBeanName(String targetBeanName) {
  this.targetBeanName = targetBeanName;
 }
 public String getTargetBeanName() {
  Assert.state(this.targetBeanName != null, "Target bean name not set");
  return this.targetBeanName;
 }
 public void setTargetClass(Class<?> targetClass) {
  this.targetClass = targetClass;
 }
 @Override
 public void setBeanFactory(BeanFactory beanFactory) {
  this.beanFactory = beanFactory;
 }
 public BeanFactory getBeanFactory() {
  Assert.state(this.beanFactory != null, "BeanFactory not set");
  return this.beanFactory;
 }
 @Override
 @Nullable
 public Class<?> getTargetClass() {
  Class<?> targetClass = this.targetClass;
  if (targetClass != null) {
   return targetClass;
  }
  synchronized (this) {
   targetClass = this.targetClass;
   if (targetClass == null && this.beanFactory != null && this.targetBeanName != null) {
    targetClass = this.beanFactory.getType(this.targetBeanName);
    if (targetClass == null) {
     Object beanInstance = this.beanFactory.getBean(this.targetBeanName);
     targetClass = beanInstance.getClass();
    }
    this.targetClass = targetClass;
   }
   return targetClass;
  }
 }
 @Override
 public boolean isStatic() {
  return false;
 }
 @Override
 public void releaseTarget(Object target) throws Exception {
  // Nothing to do here.
 }
}

從上面這段源碼中大家可以看到,SimpleBeanTargetSource 在使用的時候,需要傳入 targetBeanName,也就是被代理的 bean 名稱,還需要傳入 Spring 容器 BeanFactory,這樣,在每次需要被代理對象的時候去調用 getTarget 方法的時候,就直接從容器中查詢出來目標 Bean。因此,被代理的對象到底是不是單例,就要看 Spring 容器返回的對象到底是不是單例!

小伙伴們要記著 SimpleBeanTargetSource 的特點,因為在下一篇文章中,松哥要和大家聊的 @Scope 注解的高級用法,就涉及到這一點了。

2.3 LazyInitTargetSource

LazyInitTargetSource 有點類似于 SimpleBeanTargetSource,也是從 Spring 容器中查找被代理的 Bean,不同的是,LazyInitTargetSource 具備延遲初始化的能力,也就是在第一次進行調用的時候才會去獲取被代理對象:

public class LazyInitTargetSource extends AbstractBeanFactoryBasedTargetSource {

 @Nullable
 private Object target;


 @Override
 public synchronized Object getTarget() throws BeansException {
  if (this.target == null) {
   this.target = getBeanFactory().getBean(getTargetBeanName());
   postProcessTargetObject(this.target);
  }
  return this.target;
 }
 protected void postProcessTargetObject(Object targetObject) {
 }

}

好啦,其他的類我就不挨個說了,感興趣的小伙伴可以自行查看,這一塊的源碼還是比較好理解的~

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2022-12-06 09:00:11

MySQL自增主鍵查詢

2015-11-12 09:58:45

多租戶SaaS軟件架構設計

2023-08-02 10:48:47

SpringBean反射

2021-06-15 23:04:17

Localhost域名網絡

2024-03-06 08:15:03

@Autowired注入方式Spring

2022-05-26 09:24:09

volatile懶漢模式

2024-12-31 11:40:05

2024-04-01 08:38:57

Spring@AspectAOP

2021-04-29 07:18:21

Spring IOC容器單例

2016-09-19 10:01:08

NodeJSWeb

2022-09-29 08:39:37

架構

2021-07-01 10:45:18

Bean對象作用域

2023-10-14 17:49:25

Java存儲

2021-09-07 10:44:35

異步單例模式

2015-05-07 14:37:01

CoreOSAppC紅帽

2009-11-25 09:20:31

Windows 7網絡掉線

2023-02-27 08:09:42

SpringAOP代理

2022-09-01 10:40:29

SpringAOPJDK

2009-06-18 14:54:52

Spring AOP

2021-04-15 09:18:22

單例餓漢式枚舉
點贊
收藏

51CTO技術棧公眾號

免费观看在线综合| 欧美午夜网站| 国产精品美女久久久久高潮| 成人动漫网站在线观看| 欧美丰满熟妇bbbbbb| 99香蕉久久| 色天天综合色天天久久| 久久久一二三四| 色一情一乱一乱一区91av| 日本v片在线高清不卡在线观看| 久久久精品影院| 黄色在线免费播放| 日本在线中文字幕一区二区三区| 一区二区三区免费网站| 日本在线播放不卡| 亚洲黄色片视频| 日韩国产成人精品| 性欧美亚洲xxxx乳在线观看| 日本伦理一区二区三区| 国产精品久久久网站| 欧美亚洲国产bt| 人妻av无码专区| 午夜视频在线观看免费视频| av午夜一区麻豆| 成人深夜直播免费观看| www.国产com| 欧美色图首页| 日韩中文字幕免费看| 日本黄色网址大全| 国产成人av毛片| 欧美浪妇xxxx高跟鞋交| 日批视频在线免费看| 欧美aaa免费| 亚洲欧美怡红院| 视频在线99| 青青草视频在线免费观看| 国产成人激情av| 国产日韩精品在线观看| 中文字幕手机在线视频| 亚洲每日更新| 欧美激情中文字幕在线| √天堂中文官网8在线| 日本一二区不卡| 亚洲视频欧洲视频| 大又大又粗又硬又爽少妇毛片| 91蜜桃臀久久一区二区| 日韩一卡二卡三卡四卡| 一级淫片在线观看| 亚州精品国产| 在线成人av网站| 在线免费av播放| 欧美国产日韩电影| 欧美图片一区二区三区| 日韩中文字幕免费在线| 亚洲一区站长工具| 欧美性xxxx在线播放| 欧美视频在线观看视频| 蜜臀av国内免费精品久久久夜夜| 亚洲人亚洲人成电影网站色| 中文字幕av日韩精品| 美女写真理伦片在线看| 亚洲人成网站在线| 国产成人一二三区| 国产盗摄精品一区二区酒店| 亚洲午夜久久久久| 精品少妇在线视频| 欧美久久天堂| 91久久一区二区| 在线免费观看视频黄| 国产精品美女午夜爽爽| 制服.丝袜.亚洲.中文.综合| 亚洲黄色片免费| eeuss鲁片一区二区三区| 欧美精品一区二区三区很污很色的 | 天堂视频中文在线| 久久综合久久久久88| 日韩av不卡在线播放| 亚洲麻豆精品| 一区二区三区毛片| 久久9精品区-无套内射无码| 成人久久网站| 欧美一级夜夜爽| 韩国三级hd两男一女| 国产91久久精品一区二区| 在线亚洲午夜片av大片| 欧美第一页在线观看| 好看的av在线不卡观看| 国产精品va在线播放| 91精品中文字幕| 成人丝袜18视频在线观看| 美女亚洲精品| 激情视频在线观看| 午夜成人免费电影| 小明看看成人免费视频| 成人直播在线观看| 这里只有视频精品| 九九视频在线免费观看| 日本一区中文字幕| av电影成人| 成人资源www网在线最新版| 亚洲精品videosex极品| 成人在线观看a| 视频一区中文字幕精品| 亚洲欧美精品在线| 五月婷婷一区二区| 日韩av成人高清| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 久久精品一区中文字幕| 免费日韩一级片| 狠狠网亚洲精品| 麻豆久久久av免费| 日韩av官网| 欧美日韩成人综合| 91玉足脚交白嫩脚丫| 亚洲二区三区不卡| 国产成人精品视| 殴美一级特黄aaaaaa| 最近日韩中文字幕| 妺妺窝人体色www在线观看| 亚洲精品一区二区三区在线| 中文字幕九色91在线| 国产黄色免费观看| 成人小视频在线| 最新中文字幕久久| 高清在线一区| 亚洲精品一区久久久久久| 欧美高清视频一区二区三区| 日本不卡一区二区三区高清视频| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 日本中文字幕一区| 欧美不卡福利| 久草在线中文最新视频| 精品精品国产高清a毛片牛牛| 91大神福利视频| 日本欧洲一区二区| 欧美一区观看| 亚洲国产欧美日本视频| 日韩av网址在线| 日韩欧美亚洲国产| 高清不卡在线观看av| 国产在线拍揄自揄拍无码| 国产第一亚洲| 在线观看欧美www| 无码人妻精品一区二区三区蜜桃91| 91原创在线视频| 午夜精品久久久久久久无码| 波多野结衣一区二区三区免费视频| 美女精品视频一区| 亚洲成人黄色片| 夜夜精品视频一区二区 | 欧美这里只有精品| 一区二区三区免费在线看| 欧美日本在线视频中文字字幕| 国产露脸无套对白在线播放| 最好看的中文字幕久久| 亚洲一级片免费观看| 欧美aa国产视频| 国产精品国产三级欧美二区| 爱看av在线入口| 亚洲电影第1页| 99久在线精品99re8热| 97精品久久久久中文字幕 | 欧美在线视频一区二区三区| 精品3atv在线视频| 色偷偷噜噜噜亚洲男人的天堂| 一本色道久久综合精品婷婷| 亚洲啪啪综合av一区二区三区| 日本一区二区三区在线免费观看| 欧美日韩久久| 精品欧美日韩在线| 国模一区二区| 日韩在线免费视频| 精品人妻一区二区三区日产乱码 | 男人的天堂视频在线| 成人动漫视频| 欧美中文在线视频| 91美女视频在线| 日韩午夜激情电影| 国产精品久久久免费视频| 久久久久久免费毛片精品| www.日本一区| 欧美日韩午夜| 免费日韩av电影| 欧洲亚洲精品| 国内精久久久久久久久久人| 免费人成黄页在线观看忧物| 欧美老年两性高潮| 永久免费看片在线播放| 亚洲国产精品成人综合 | 性高潮视频在线观看| 亚洲欧洲精品天堂一级| 人妻激情偷乱频一区二区三区| 久久久噜噜噜久久狠狠50岁| 日韩不卡一二区| 亚洲bt欧美bt精品777| 91视频8mav| 亚洲同志男男gay1069网站| 另类色图亚洲色图| 毛片在线能看| 精品久久久久久久久久久久久久久久久 | 国产永久免费网站| 国产一区二区三区的电影| 宅男一区二区三区| 一区二区三区视频免费观看| 91久久精品国产91性色| 69久成人做爰电影| 九九热r在线视频精品| 成人精品一区二区三区免费| 日韩你懂的电影在线观看| 99成人精品视频| 香蕉影视欧美成人| 欧美激情图片小说| 欧美激情综合五月色丁香小说| 无码国产69精品久久久久网站| 日本不卡中文字幕| 人妻有码中文字幕| 激情视频一区二区三区| 四虎免费在线观看视频| 国产日产精品_国产精品毛片| 91免费版黄色| 青青在线精品| 国产精品久久久久久久久久| 国产在线美女| 久久手机精品视频| 337p日本欧洲亚洲大胆鲁鲁| 亚洲男人天堂视频| 婷婷开心激情网| 日韩精品影音先锋| 99精品国产99久久久久久97| 欧美色男人天堂| 无码人妻丰满熟妇区五十路| 欧美视频在线观看免费| 日韩免费视频网站| 午夜日韩在线电影| 国产一级一片免费播放| 依依成人综合视频| 在线观看亚洲网站| 中文字幕一区二区三区av| 一级黄色毛毛片| 欧美经典一区二区| 天堂网av2018| 国产精品国产三级国产有无不卡| 毛片久久久久久| 欧美国产一区二区在线观看| 免费在线观看a视频| 日本一区二区三区在线不卡| 久久久久久久毛片| 久久精品夜夜夜夜久久| 国产免费一区二区三区网站免费| 久久色成人在线| 少妇大叫太粗太大爽一区二区| 91社区在线播放| 黄瓜视频污在线观看| 久久久精品综合| 欧洲美一区二区三区亚洲| 国产午夜精品理论片a级大结局 | 1024成人网色www| 三级黄色免费观看| 亚洲视频1区2区| 91视频免费在线看| 亚洲国产一区二区视频| 日本韩国欧美中文字幕| 日本丰满少妇一区二区三区| 日本熟妇一区二区三区| 欧美日韩不卡视频| av中文字幕在线免费观看| 欧美成人a视频| 欧美性受xxxx狂喷水| 精品亚洲国产视频| 超碰免费97在线观看| 久久视频中文字幕| 阿v视频在线观看| 国产精品电影久久久久电影网| 精品乱码一区二区三区四区| 114国产精品久久免费观看| 大奶在线精品| 日韩福利视频| 欧美a级片网站| 国产91在线视频观看| 毛片av中文字幕一区二区| 99中文字幕在线| 99久久久精品| 亚洲无人区码一码二码三码的含义| 国产精品理论片在线观看| 久草视频免费在线播放| 色婷婷av一区二区三区之一色屋| 一区二区三区亚洲视频| 亚洲一级视频在线观看| 亚洲第一免费网站| www.亚洲资源| 高清一区二区三区日本久| 韩国成人在线| 国产激情一区二区三区在线观看| 国产欧美一区| 欧美性潮喷xxxxx免费视频看| 久久综合五月| 动漫美女无遮挡免费| 久久先锋影音av鲁色资源 | 午夜精品久久久久久久| 久久久久精彩视频| 精品久久一区二区三区| 男女av在线| 欧美日本高清一区| 国产69精品久久| 久久综合九色综合网站| 欧美xxx在线观看| 国产激情在线观看视频| 国产.精品.日韩.另类.中文.在线.播放| 尤物视频最新网址| 亚洲一级二级三级| 国产精品久久久久久久免费看 | 香蕉视频黄色在线观看| 亚洲人成网站在线| 在线观看不卡的av| 亚洲美女av在线| 成人超碰在线| 亚洲va久久久噜噜噜| 成人网18免费网站| 欧美性久久久久| 福利一区在线观看| 欧美精品久久久久久久久46p| 欧洲精品在线观看| 深夜福利视频在线免费观看| 欧美黑人性猛交| 9999在线精品视频| 一本一道久久久a久久久精品91| 免费在线成人| 亚洲一区二区乱码| 精品国产乱码久久久久久虫虫漫画| 国产黄色高清视频| 久久久999国产| 国产精品原创视频| 先锋影音亚洲资源| 日韩成人av影视| b站大片免费直播| 色综合久久88色综合天天免费| 无套内谢的新婚少妇国语播放| 高清在线视频日韩欧美| 一区二区三区视频免费视频观看网站 | 久久视频www| 欧美一级视频在线观看| 欧美一区 二区| 1024av视频| xfplay精品久久| 中文字幕在线观看视频网站| 亚洲国产高清自拍| 17videosex性欧美| 国偷自产av一区二区三区小尤奈| 亚洲三级视频| 国产精品300页| 欧美性xxxx18| 国产视频网站在线| 国产精品偷伦一区二区| 国产精品久久久久久久免费观看 | 亚洲深夜福利网站| 欧美日韩在线精品一区二区三区激情综合 | 国产精品福利一区二区| 国产精品久久久久久久成人午夜| 久久精品国产69国产精品亚洲 | 欧美一区二区三区影视| 伊人影院蕉久影院在线播放| 国产高清自拍99| 亚洲综合精品四区| 男生草女生视频| 欧美日韩高清在线播放| 最爽无遮挡行房视频在线| 高清视频在线观看一区| 国产欧美一级| 日本免费www| 欧美一级免费大片| heyzo高清国产精品| 免费av在线一区二区| 免费在线看一区| 在线免费日韩av| 精品盗摄一区二区三区| 亚洲精品国产精品国产| 亚洲精品成人自拍| 国产很黄免费观看久久| 四虎精品永久在线| 中文字幕av一区二区| 无人区乱码一区二区三区| 久久综合色视频| 中文字幕av不卡| 亚洲精品国产片| 日本精品免费一区二区三区| 欧美xxxx中国| 中文字幕天堂av| 欧美亚洲动漫另类| 日韩123区| 亚洲激情一区二区三区| 高清av一区二区| 中文字幕视频免费观看| 久久久影视精品| 色乱码一区二区三区网站| 中国xxxx性xxxx产国| 欧美日韩成人综合天天影院| 麻豆视频在线看| 免费看污污视频| 久久亚洲私人国产精品va媚药| 国产片在线播放|