@Autowired註入為null問題分析

来源:https://www.cnblogs.com/cat-/archive/2018/11/25/10014477.html
-Advertisement-
Play Games

2018-11-24 22:57:33 問題說明 最近看到Spring事務,在學習過程中遇到一個很苦惱問題 搭建好Spring的啟動環境後出現了一點小問題 在啟動時候卻出現[java.lang.NullPointerException] 不過因為當時一個小小的疏忽 很low的問題 請往下看 ... ...


 2018-11-24 22:57:33

問題說明

最近看到Spring事務,在學習過程中遇到一個很苦惱問題                                                  

搭建好Spring的啟動環境後出現了一點小問題

在啟動時候卻出現[java.lang.NullPointerException]

不過因為當時一個小小的疏忽 很low的問題 請往下看 ... 

工程結構

代碼片段

spring.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="
 6         http://www.springframework.org/schema/beans
 7         http://www.springframework.org/schema/beans/spring-beans.xsd
 8         http://www.springframework.org/schema/context
 9         http://www.springframework.org/schema/context/spring-context.xsd">
10 
11     <!-- Spring註解掃描 -->
12     <context:component-scan base-package="com.*" />
13 
14     <!-- 1. 數據源對象: C3P0連接池 -->
15     <bean id="dataSource"
16         class="com.mchange.v2.c3p0.ComboPooledDataSource">
17         <property name="driverClass" value="org.h2.Driver"></property>
18         <property name="jdbcUrl"
19             value="jdbc:h2:tcp://192.168.190.1/~/test"></property>
20         <property name="user" value="sa"></property>
21         <property name="password" value="123"></property>
22     </bean>
23 
24     <!-- 2. JdbcTemplate工具類實例 -->
25     <bean id="jdbcTemplate"
26         class="org.springframework.jdbc.core.JdbcTemplate">
27         <property name="dataSource" ref="dataSource"></property>
28     </bean>
29 
30     <!-- 3.配置事務 -->
31     <bean id="dataSourceTransactionManager"
32         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
33         <property name="dataSource" ref="dataSource"></property>
34     </bean>
35 
36 </beans>
Spring.xml

 

 Test.java

1 public class Test {
2     public static void main(String[] args) {
3         ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext(
4                 "spring.xml");
5         ServiceIF service = (ServiceIF) classPathXmlApplicationContext.getBean("serviceImpl");
6         service.add("小王", 23);
7     }
8 }

TransactionUtil.java

 

 1 @Component("transactionUtil")
 2 public class TransactionUtil {
 3 
 4     /**
 5      * 初始化數據源
 6      */
 7     @Autowired
 8     private DataSourceTransactionManager dataSourceTransactionManager;
 9 
10     /**
11      * 開啟事務
12      * 
13      * @return
14      */
15     public TransactionStatus begin() {
16         TransactionStatus transaction = dataSourceTransactionManager.getTransaction(new DefaultTransactionDefinition());
17         System.out.println(" 開啟事務成功 ");
18         return transaction;
19     }
20 
21     /**
22      * 提交事物
23      * 
24      * @param transaction
25      */
26     public void commit(TransactionStatus transaction) {
27         dataSourceTransactionManager.commit(transaction);
28         System.out.println(" 事物提交成功 ");
29     }
30 
31     /**
32      * 回滾事務
33      * 
34      * @param transaction
35      */
36     public void rollback(TransactionStatus transaction) {
37         dataSourceTransactionManager.rollback(transaction);
38         System.err.println(" 事物進行回滾 ");
39     }
40 }
TransactionUtil.java

 

ServiceImpl.java

 1 @Service("serviceImpl")
 2 public class ServiceImpl implements ServiceIF {
 3 
 4     @Autowired
 5     TransactionUtil transactionUtil;
 6 
 7     private TransactionStatus transactionStatus = null;
 8 
 9     @Override
10     public void add(String name, Integer age) {
11         transactionStatus = transactionUtil.begin();
12         try {
13             new DaoImpl().add(name, age);
14             transactionUtil.commit(transactionStatus);
15         } catch (Exception e) {
16             System.err.println("ERROR >>> 執行出現異常 即將進行回滾操作");
17             transactionUtil.rollback(transactionStatus);
18         }
19     }
20 }

DaoImpl.java

 1 public class DaoImpl implements DaoIF{
 2 
 3     /**
 4      * 註入jdbc模板類
 5      */
 6     @Autowired
 7     private JdbcTemplate jdbcTemplate;
 8 
 9     /**
10      * 第一條插入語句
11      */
12     private final String SQL_INSERT_01 = "insert into user values (?,?)";
13 
14     /**
15      * 添加sql執行
16      * 
17      * @param name
18      * @param age
19      */
20     public void add(String name, Integer age) {
21         jdbcTemplate.update(SQL_INSERT_01, name, age);
22     }
23 }

運行結果

 

 問題分析

 


解決思路

我在想 為什麼會沒有註入進來呢 我明明加了@Autowired註解

後來猜到可能是Spring.xml配置的問題

看完也沒有問題 我就從Java Source一步一步看 發現....

我靠 我就猜測是不是如果用「new Object()」的方式創建實例後 其class中的Bean的註解會失效呢?

然後我嘗試在ServiceImpl.java中以註解的方式把DaoIF的實例註入到ServiceImpl,

併在DaoImpl.java的類上面添加@Repository,

把ServiceImpl.java中new DaoImpl()替換成註入的daoImpl。

 

改修代碼

ServiceImpl.java修改後

DaoImpl.java修改後


改修後調試

 


 

其實我懂得也不太多 Spring註入的流程那

首先他會把項目中target -> classes 目錄下的「.class」文件進行解析

通過Spring.xml中的「context:component-scan」進行註解掃描

如果這個路徑下的「.class」文件的類上面是否存在@Component聲明的註解

如果被此類註解修飾,Spring會把所有被註解修飾的bean進行實例化操作  供給@Autowired進行註入

(在spring註解的源碼中@Service和@Repository等等都繼承了@Component註解)

 

 

  結論 

在使用Spring的Bean容器時 千萬要確保

                配置的註解掃描路徑正確

                Jar的依賴是否存在

                是否在bean的上面加「@Service @Repository @Component … 」

                要細心 遇到異常不要緊 慢慢分析!!!

 


 

 

謝謝你這麼忙還來我的看我的博客奧

如果有哪些地方寫的不好希望能夠指出!

為了變得更強 一起加油吧~

 

 

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • tang先生 Django~1 一 什麼是web框架? 框架,即framework,特指為解決一個開放性問題而設計的具有一定約束性的支撐結構,使用框架可以幫你快速開發特定的系統,簡單的說,就是你用別人搭建好的舞臺來做表演。 對於所有的Web應用,本質上其實就是一個socket服務端,用戶的瀏覽器其實 ...
  • 什麼是ui-router ui-router是AngularUI庫最有用的組件之一(AngularUI庫由AngularJS社區構建)。它是一個第三方路由框架,允許通過狀態機制組織介面,而不是簡單的URL路由。 什麼是ocLoayLoad ocLoayLoad是AngularJS的模塊按需載入器。按 ...
  • setInterval()和setTimeout()方法都是js原生的定時方法,當然它們兩個的作用也是不同的,並且最近在做上下滾動公告欄的時候,發現了setInterval()非常令人抓狂的問題,那就是用setInterval()做的定時滾動會隨著瀏覽器頁面切換變得無法控制!為什麼會說無法控制呢,因 ...
  • @[toc] 轉載請註明出處 初識jQuery 為什麼要使用jQuery? 1.什麼是jquery? jQuery是js的一個庫,簡化了js代碼的書寫(註:jQuery語句中用逗號分隔各個css,因為一條css對應一個對象屬性,對象屬性之間是用逗號分隔而非分號) 舉例: 例1:簡化了獲取元素的語句 ...
  • 本文針對react navigation^3.0.0版本,版本不對的話,請不要看本文,直接看官方英文文檔 ​ 最近一直在學習RN,沒找到什麼好的視頻,所以一直看文檔,一路上來雖然遇到一些亂七八糟的bug,但是能比較友好的解決掉 直到我使用 ,這個官方文檔上說 的導航組件,搞的我心態爆照,調試了一下午 ...
  • 微服務的目標是通過將應用程式分解為可以獨立部署的小型自治服務來提高應用程式版本的速度。微服務架構也帶來了一些挑戰,這些模式可以幫助緩解這些挑戰。設計模式(design pattern)是對軟體設計中普遍存在(反覆出現)的各種問題,所提出的解決方案。當然微服務中的雲設計模式也是對微服務中普遍存在的問題... ...
  • 一.在Servlet中,表單提交的非字元串類型需要手動轉換 1.在struts中,表單提供的常見數據類型struts框架自動轉換,無需手動轉換 2.在某些情況下,某些自定義類型struts不能完成自動轉換,需要進行手動轉換,如果需要轉換的類型轉換頻率較高時,手動轉換的代碼增多,這時可以使用strut ...
  • 撩課Java+系統架構 視頻 點擊開始學習 81.Servlet的會話機制? 82.Filter是什麼?有什麼作用? 83.Listener是什麼?有什麼作用? 84.你瞭解過Servlet3.0嗎? 85.JSP和Servlet有哪些相同點和不同點? ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...