一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring 多線程下注入bean問題詳解

Spring 多線程下注入bean問題詳解

2021-01-19 11:05jijs Java教程

本篇文章主要介紹了Spring 多線程下注入bean問題詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

本文介紹了Spring 多線程下注入bean問題詳解,分享給大家,具體如下:

問題

Spring中多線程注入userThreadService注不進去,顯示userThreadService為null異常

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
public class UserThreadTask implements Runnable {
  @Autowired
  private UserThreadService userThreadService;
 
  @Override
  public void run() {
    AdeUser user = userThreadService.get("0");
    System.out.println(user);
  }
}

解決方案一

把要注入的Service,通過構造傳過去,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class UserThreadTask implements Runnable {
  private UserThreadService userThreadService;
 
  public UserThreadTask(UserThreadService userThreadService) {
    this.userThreadService = userThreadService;
  }
 
  @Override
  public void run() {
    AdeUser user = userThreadService.get("0");
    System.out.println(user);
  }
}
?
1
2
Thread t = new Thread(new UserThreadTask(userThreadService));
t.start();

解決方案二

通過ApplicationContext中獲取需要使用的Service

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
 
public class ApplicationContextHolder implements ApplicationContextAware {
  private static ApplicationContext context;
  @Override
  public void setApplicationContext(ApplicationContext context) throws BeansException {
    ApplicationContextHolder.context = context;
  }
  //根據bean name 獲取實例
  public static Object getBeanByName(String beanName) {
    if (beanName == null || context == null) {
      return null;
    }
    return context.getBean(beanName);
  }
  //只適合一個class只被定義一次的bean(也就是說,根據class不能匹配出多個該class的實例)
  public static Object getBeanByType(Class clazz) {
    if (clazz == null || context == null) {
      return null;
    }
    return context.getBean(clazz);
  }
  public static String[] getBeanDefinitionNames() {
    return context.getBeanDefinitionNames();
  }
}

Spring 加載自己定義的ApplicationContextHolder類

?
1
<bean class = "cn.com.infcn.applicationcontext.ApplicationContextHolder"></bean>

根據 bean 的名稱獲取實例

 

復制代碼 代碼如下:

UserService user = (UserService) ApplicationContextHolder.getBeanByName("userService");

 

 

根據 bean 的Class 獲取實例(如果該Class存在多個實例,會報錯的)

 

復制代碼 代碼如下:

UserService user = (UserService) ApplicationContextHolder.getBeanByType(UserService.class);

 

這種方式,不管是否多線程,還是普通的不收spring管理的類,都可以使用該方法獲得spring管理的bean。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.jianshu.com/p/c8a43d26bc0f?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 2021国产精品成人免费视频 | 天天久久综合网站 | 欧美精品成人a多人在线观看 | 好吊操这里有精品 | 国产精品亚洲精品青青青 | 国产高清视频免费最新在线 | bl双性小说 | 四虎国产视频 | 国产精品林美惠子在线观看 | 香蕉91xj.cc | 亚洲国产精品综合福利专区 | 乳 好大h | 肉色欧美久久久久久久蜜桃 | 天天做天天爱天天爽综合网 | 2015台湾永久免费平台 | 毛片大全免费看 | 国产高清视频免费最新在线 | 丝袜护士强制脚足取精 | 国产高清在线精品一区二区 | 欧美男男gaygaysxxx| 日本一道高清不卡免费 | 亚洲不卡高清免v无码屋 | 日韩欧一级毛片在线播无遮挡 | 国产小视频在线播放 | 暖暖 免费 高清 日本 中文 | 爽好大快深点一视频 | 果冻传媒九一制片厂 | 蜜桃免费| 国产日韩欧美精品在线 | 国产自在自拍 | 韩国女主播在线大尺无遮挡 | 欧美高清无砖专区欧美精品 | 亚洲国产欧美久久香综合 | 热久久最新网址 | 国产人人艹 | 美女被躁爽死 | 日本xxxxxl1820 | 亚洲视频免| 国产成人看片免费视频观看 | 国产大秀视频一区二区三区 | 99最新网址 |