精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品国产三级国产aⅴ无密码| 最新亚洲激情| 欧美一区二区视频在线观看2022| 香蕉视频免费版| 欧美一区二区公司| 日韩中文字幕麻豆| 欧美日本高清视频| 性欧美精品男男| 天堂va欧美ⅴa亚洲va一国产| 亚洲成a天堂v人片| 亚洲一区3d动漫同人无遮挡| 亚洲av少妇一区二区在线观看| 午夜亚洲福利在线老司机| 日韩在线一区二区三区免费视频| 极品白嫩的小少妇| 玖玖精品在线| 无码av免费一区二区三区试看| 亚洲欧美国产不卡| 日韩精品123| 国产高清精品网站| 国产精品女主播| 久久国产精品系列| 欧美另类视频| 色综合影院在线| 麻豆av免费观看| 国产精品xxx在线观看| 欧美日韩夫妻久久| 日韩中文字幕免费在线| 白白色在线观看| 亚洲人123区| 亚洲精品高清视频| 激情小说 在线视频| www.欧美.com| 99re热精品| 国产理论视频在线观看| 国产精品普通话对白| 欧美人与禽猛交乱配| 99re国产在线| 国产精品久久久久无码av| 亚洲欧美另类人妖| 无码一区二区精品| av日韩精品| 日韩欧美中文字幕制服| 亚洲一区二区三区观看| 国产精品亚洲d| 欧美色爱综合网| 手机视频在线观看| av免费在线一区| 在线亚洲免费视频| 青青草av网站| 素人啪啪色综合| 欧美四级电影在线观看| caoporn超碰97| 成人四虎影院| 欧美日本精品一区二区三区| 少妇一级淫免费播放| 欧美一级做一级爱a做片性| 欧美日韩免费高清一区色橹橹 | 欧美在线啊v一区| 日韩精品一区二区三区色欲av| 桃色av一区二区| 色久综合一二码| 男操女免费网站| 欧美在线一级| 欧美放荡的少妇| 亚洲午夜精品在线观看| 超碰97久久国产精品牛牛| 亚洲第一av网站| 波多野结衣福利| 欧洲乱码伦视频免费| 最新69国产成人精品视频免费| www深夜成人a√在线| 欧美午夜视频| 欧美在线影院在线视频| 无码久久精品国产亚洲av影片| 麻豆国产精品一区二区三区| 亚洲精品欧美日韩专区| 亚洲欧美另类视频| 久久免费电影网| 中文字幕一区二区三区最新| 伦理av在线| 欧美性xxxx在线播放| 日本 片 成人 在线| 国产精品久久久久久久久久辛辛| 精品国产一区二区三区四区四| 在线观看日韩精品视频| 日韩精品四区| 欧美精品久久久久久久免费观看| 国产欧美一区二区三区在线看蜜臂| 免费在线观看成人av| 成人国产精品一区| 性做久久久久久久久久| 国产农村妇女毛片精品久久麻豆| 欧美性受xxxx黑人猛交88| 涩涩视频在线播放| 欧美一区二区三区在线观看| 免费看黄色aaaaaa 片| 欧美激情黄色片| 91国产中文字幕| 国产一区二区小视频| 成a人片亚洲日本久久| 视频三区二区一区| av免费不卡| 欧美日韩成人一区| 国产在线观看无码免费视频| 91精品91| 国产精品91一区| 日批免费在线观看| 亚洲视频免费看| 北条麻妃在线视频| 国产精品对白久久久久粗| 中文字幕欧美日韩精品| 成年人午夜视频| 国产精品一区二区黑丝| 婷婷精品国产一区二区三区日韩| 大香伊人中文字幕精品| 欧美一区二区三区在线| 超碰人人人人人人人| 国产精品日本| 成人xxxxx色| 欧美三级黄网| 在线免费观看成人短视频| 日本国产在线视频| 欧美一区二区三区久久精品| 成人福利视频在线观看| 国产三级视频在线看| 亚洲成人免费在线| 国产精品熟女一区二区不卡| 欧美gayvideo| 国产成人免费av电影| 青青久草在线| 大荫蒂欧美视频另类xxxx| 性xxxxxxxxx| 亚洲理论电影网| 国产原创欧美精品| 成人网视频在线观看| 色综合网站在线| 人人妻人人澡人人爽人人精品| 亚洲视频综合| 俄罗斯精品一区二区| 最新黄网在线观看| 欧美一区二区三区啪啪| 麻豆明星ai换脸视频| 久久成人18免费观看| 亚洲精品一区二区三区樱花| 日韩毛片在线| 最近2019中文字幕第三页视频| 中文字幕日韩第一页| 国产欧美日本一区二区三区| 妓院一钑片免看黄大片| 日韩欧美精品| 成人免费网站在线看| 中文字幕在线播放网址| 日韩欧美色综合网站| 青娱乐国产在线视频| 国产激情视频一区二区三区欧美| 91看片淫黄大片91| 综合成人在线| 69久久夜色精品国产69| 久草在线网址| 精品视频一区三区九区| 中日韩一级黄色片| 国产成人免费av在线| 分分操这里只有精品| 三级精品视频| 国产精品国内视频| 亚洲视频tv| 日韩写真欧美这视频| 国产无套粉嫩白浆内谢| 97aⅴ精品视频一二三区| 男人天堂网视频| 成人3d精品动漫精品一二三| 91久久精品国产91性色| 国产网红在线观看| 亚洲女在线观看| 97精品人妻一区二区三区在线 | 久久久久久久极品| 国产区在线观看成人精品| 日韩成人精品视频在线观看| 欧美激情1区| 鲁片一区二区三区| 四虎精品一区二区免费| 久久久久久久国产精品视频| 男人av在线| 91麻豆精品国产91久久久久| 国产成人亚洲欧洲在线| 中文幕一区二区三区久久蜜桃| 亚洲欧美一区二区三区不卡| 一区二区三区国产在线| 亚洲国产午夜伦理片大全在线观看网站 | 久久久久久久久丰满| 国产欧美在线一区二区| 91九色综合| 欧美精品videofree1080p| 国产视频网站在线| 日韩精品一区二区三区老鸭窝| 9i看片成人免费看片| 欧美激情一区二区| 99精品一区二区三区无码吞精| 石原莉奈在线亚洲二区| 欧美在线观看视频免费| 欧美三级三级| 国产欧美日韩一区| 欧美专区视频| 国产精品热视频| 手机在线理论片| 欧美精品一二区| √天堂资源地址在线官网| 亚洲白拍色综合图区| 伊人网av在线| 一本久久a久久免费精品不卡| 91aaa在线观看| 国产精品天天看| 亚洲av无码国产精品久久| 国产老肥熟一区二区三区| 午夜激情福利在线| 99热免费精品| 国产va亚洲va在线va| 亚洲国产精品日韩专区av有中文| 日本视频一区二区在线观看| 福利电影一区| 成人自拍网站| 麻豆一二三区精品蜜桃| 国产原创欧美精品| 福利一区二区三区视频在线观看| 午夜欧美不卡精品aaaaa| 2021国产在线| 欧美xxxx18性欧美| 精品51国产黑色丝袜高跟鞋| 中文字幕亚洲国产| 高清在线观看av| 国产香蕉精品视频一区二区三区| 污污网站在线免费观看| 亚洲国产成人久久综合一区| 性生活视频软件| 欧美一区二区三区成人| 国产乱码精品一区二区三区精东 | hs视频在线观看| 在线成人高清不卡| 国产精品视频a| 欧美一区二区人人喊爽| 国产成年妇视频| 日韩一区二区在线观看视频| www.黄色一片| 欧美va亚洲va国产综合| 亚洲欧美激情另类| 亚洲精品国产综合久久| 婷婷五月综合久久中文字幕| 亚洲国产天堂久久综合网| 欧美自拍偷拍第一页| 亚洲激情视频网站| 日本ー区在线视频| 国产一区二区三区在线观看视频| jizz日韩| 久久精品福利视频| 午夜小视频福利在线观看| 久久久久久国产精品| 麻豆成全视频免费观看在线看| 91a在线视频| av成人免费| 91亚洲一区精品| 国产精品美女在线观看直播| 国产亚洲欧美一区二区三区| 亚洲人成精品久久久 | 不卡一本毛片| 欧美一级视频在线观看| 成人免费av电影| 成人中文字幕在线观看 | 欧美最大成人综合网| 大片网站久久| 黄色污污在线观看| 妖精视频成人观看www| 爱情岛论坛成人| 精品一区二区在线免费观看| 在线播放第一页| 国产亚洲欧美中文| 国产探花在线播放| 欧美日韩在线免费观看| 亚洲中文字幕在线一区| 精品久久国产字幕高潮| 国产在线电影| 欧美国产日产韩国视频| 另类激情视频| 1卡2卡3卡精品视频| 亚洲涩涩av| 99久久99久久精品| 久久精品欧洲| 一级日本黄色片| 久久久久久久久免费| 国产av 一区二区三区| 粉嫩av一区二区三区免费野| 中文字幕在线网站| 亚洲国产精品资源| 欧美成人性生活视频| 98精品在线视频| 国色天香久久精品国产一区| 久久亚洲综合网| 午夜视频一区| 午夜激情福利在线| 97国产一区二区| caoporn91| 欧美性感一区二区三区| 狠狠躁日日躁夜夜躁av| 色av中文字幕一区| 久九九久频精品短视频| 国产精品午夜av在线| 围产精品久久久久久久| 99蜜桃臀久久久欧美精品网站| 国产精品亚洲成人| 99自拍偷拍视频| 91官网在线观看| 天天色棕合合合合合合合| 久久精品福利视频| 99久久伊人| 你懂的网址一区二区三区| 国产综合网站| 色噜噜狠狠一区二区三区狼国成人| 国产三级精品三级| 国产九色在线播放九色| 精品国产伦一区二区三区观看体验| 午夜不卡视频| 国产精品人成电影在线观看| 中文精品一区二区| 国产原创popny丨九色| 国产成人8x视频一区二区| 三级av在线免费观看| 欧美精品在线观看播放| 国产大片在线免费观看| 国产精品国产福利国产秒拍 | 国产成人在线看| 97在线观看免费高| 欧美日本一道本| 欧美性videos| 91精品美女在线| 欧美国产一区二区三区激情无套| 香蕉视频网站入口| 国产精品视频一二| 青青艹在线观看| 曰本色欧美视频在线| 写真福利精品福利在线观看| 美女被啪啪一区二区| 亚洲伊人观看| 久久久久亚洲av无码专区桃色| 狠狠躁夜夜躁人人爽天天天天97 | 欧美日韩激情视频在线观看| 成人av综合一区| 日韩av无码中文字幕| 亚洲国产精彩中文乱码av在线播放 | a级片免费观看| 欧美高清第一页| 老汉色老汉首页av亚洲| av之家在线观看| 久久久精品tv| 亚洲性在线观看| 久久精品国产2020观看福利| 美女日韩一区| 成年人午夜免费视频| 久久综合狠狠综合| 亚洲男人天堂网址| 久久精品国亚洲| jazzjazz国产精品久久| 日本韩国欧美在线观看| 久久久99久久| 国产一区二区在线视频观看| 久久国产精彩视频| 国产 日韩 欧美 综合 一区| 女人扒开屁股爽桶30分钟| 中文字幕+乱码+中文字幕一区| 国产精品视频一二区| 欧美激情欧美激情| 亚欧日韩另类中文欧美| 岛国毛片在线播放| 亚洲综合在线第一页| 人成在线免费视频| 国产在线播放91| 99riav国产精品| 香蕉成人在线视频| 精品久久久久99| 91亚洲视频| h无码动漫在线观看| 国产亚洲一区字幕| 国产伦理吴梦梦伦理| 97在线看福利| 97精品视频在线看| 亚洲av无码一区二区三区网址| 欧美性三三影院| 久久香蕉av| 日韩三级电影免费观看| 懂色av中文一区二区三区 | 日韩和欧美一区二区三区| 成人免费黄色小视频| 国产婷婷成人久久av免费高清| 欧美性aaa| av免费播放网址| 亚洲男同性恋视频| 黄色在线免费观看大全| 国产伦精品一区二区三区免| 久久se精品一区二区| 黄网在线观看视频| 美女啪啪无遮挡免费久久网站|