1. 程式人生 > >關於@Autowired後Spring無法注入的問題

關於@Autowired後Spring無法注入的問題

在使用Spring框架開發的時候,難免有時會遇到@Autowired後無法自動主動,然後報空指標異常的錯,下面說一下本人遇到的問題和解決辦法.

1.對於新手來說,最明顯的不過是在applicationContext.xml檔案上沒有加<context:component-scan base-package="com.xxx"/>,或者明明寫了,但Spring還是沒有將該類注入到容器中.其實,很多人都喜歡將包的路徑寫的非常的詳細,比如:com.xxx.xxx.service等,這樣做的好處是Spring啟動的時候,掃描的類更少了,效率更高了.這樣做其實無可厚非,但是有些時候,你難免會把所有需要交給Spring管理都放在這個包下,這就導致有些放在其它包下的,貼有@Controller,@Service,@Repository,@Component等註解的類也不會交給Spring管理了.所以,最穩妥的方法就是,掃描所有的包,如下

對於使用idea的同學來說,想要知道有沒有掃描到你想要的類,可以直接點選這個配置旁邊類似葉子的圖示,那裡可以看到當前所有被Spring所管理的類.

2.主要說一下本人最近遇到的一個比較常識性但又容易踩坑的地方,我們都知道,如果你想要通過@Autowired注入一個物件,那麼前提是當前你所在的這個類本身需要被Spring管理, 舉個例子: 你想要在一個Controller裡注入一個Service,那麼不僅這個Service要貼上@Service,這個Controller也要貼上@Controller, 如果當前的Controller並未貼上@Controller,那就無法注入,因為Spring並未管理當前Controller的生命週期.

重點來了,如果我的一個Service A明明已經貼上了註解,另一個Service B也貼上了註解,而且都被掃描到了,那為什麼還是無法通過@Autowired注入呢?

原理其實很簡單, 在SMSImpl裡要呼叫receiptService的方法,首先SMSImpl這個類就要從容器中拿,而不能直接new出來,因為交給Spring管理的類一般預設是單例的,它會為這個物件注入屬性,但自己new出來的類,就不會注入這個屬性了,而我拿到的SMSImpl實現類其實就是我自己new出來的.

 如圖,在某個類中,啟動容器先載入靜態程式碼塊的時候,把所有實現了IMessageSMS介面的類都放入在一個Map中,而這些類其實都是newInstance出來的,所以這些類本身是沒有屬性的物件的,所以在呼叫的時候,就為null了,而解決的辦法也很簡單,直接去容器中拿出receiptService物件即可.

相關推薦

關於@AutowiredSpring無法注入的問題

在使用Spring框架開發的時候,難免有時會遇到@Autowired後無法自動主動,然後報空指標異常的錯,下面說一下本人遇到的問題和解決辦法. 1.對於新手來說,最明顯的不過是在applicationContext.xml檔案上沒有加<context:componen

Spring 無法注入靜態變數,直接在靜態方法中獲取bean

模組中想把一個類寫成工具類,提供靜態方法呼叫。但是方法中要用到@autowire注入的dao類變數,它要能在靜態方法中使用的話本身就加上static,但是static變數是無法用@autowire注入的。 @Autowired private AppConfMapper m

myeclipse 生成jar包,spring無法掃描到bean定義

myeclipse  jar add directory entries 之前,我曾經寫過一篇Java遍歷包中所有類,但經過一名網友提醒發現,只能適用於專案src中的包,當包在jar裡時就無法遍歷jar裡的類。就此我針對程式碼進行了細化,功能得到進一步的完善。 在分

【JavaWeb】Spring無法@Autowired注入

在用Spring依賴注入時發現@Autowired無法注入,程式碼如下: @Autowired private static MyBean1 bean1 ; public

spring自定義類中@AutoWired標識的元素注入為null

最近在做專案的時候,發現程式執行的時候有一個nullpointer exception,一臉懵逼因為感覺程式沒什麼邏輯。後來發現是因為new出來的component不會自動注入它的元素。 現象:@Component修飾的自定義普通類中@Autowired屬性為null 原因:如果是通過new例項化的物件,

端-框架-Spring-MyBatis-注入對映器

後端-框架-Spring-MyBatis-注入對映器 其中的配置檔案 <!-- 資料來源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <p

Spring Boot 整合Mybatis非starter時,mapper一直無法注入解決

本來呢,直接使用mybatis-spring-boot-starter還是挺好的,但是我們系統比較複雜,有多個數據源,其中一個平臺自己的資料來源,另外一些是動態配置出來的,兩者完全沒有關係。所以直接使用mybatis-spring-boot-starter就很麻煩了,會報下列錯誤: Caused by

Spring Boot問題】--authenticationManager無法注入

在更換spring-boot-auto-config的版本從1.5.13升級至2.0.6的過程中出現問題 <dependency> <groupId>org.springframework.boot</groupId> <ar

Spring Boot 整合Mybatis時,mapper一直無法注入

今天在使用spring boot整合mybatis時一直無法注入mapper,不管怎麼配置註解掃描包等,都不行,移動了Application這個類也不行。後來發現了應該不是Spring Boot掃描包的問題,因為我不管怎麼配置,改程式碼除錯都會報那個錯,於是去pom.xml檔

利用Lombok編寫優雅的spring依賴注入程式碼,去掉繁人的@Autowired

大家平時使用spring依賴注入,都是怎麼寫的? @Service public class OrderService { @Autowired private UserService userService; } 是不是很熟悉的感覺?但是呢 如果你用IDEA的

Spring Boot 注入介面 @Autowired interface

1.若介面只有唯一一個實現類的注入方式 先建立一個介面VideoService public interface VideoService { String getVideoName(); } 建立一個介面的實現類VideoServiceImpl,使用@Se

spring資源注入註解 @Autowired @Qualifier @Resource的差異性

spring物件(@Controller @Service @Component @Repository)在注入其他spring物件(@Service @Component @Repository)的時候,可以在成員變數上使用注入註解@Autowired或者@Resource.如果被注入資源是繼承了

spring boot 攔截器中無法注入serivce

摘要 最近在專案中用攔截器去攔截使用者操作,並對操作日誌進行記錄, 在攔截器中記錄日誌時呼叫service 層 的save方法,發現service為null ,通過 @Autowired private LogService logService;這種方式無法注入;解決辦

spring這種@Resource或者@Autowired這種如何去注入bean

     對於這個,我是簡單寫一點,之前看spring的原始碼中,對於bean的定義的封裝中,我們發現其中用到了反射中的很多內容,簡單的做了一個dome模擬這個沒有set也沒有構造方法的注入:   首先如下:public class User {    private Str

service手動例項化(new)導致類中的spring物件無法注入的問題解決

    下面說的這個畫橫線的可能是錯誤的,因為我之前用controller繼承父類的註解物件的時候成功了,所以可能這次的唯一原因就是 不該把本該從ioc容器中拿出的物件通過new的方式例項化,至於繼承註解物件應該是可以的。 首先,如果打算用繼承,那麼父類被注入的物件是無法繼承的,手

Spring AOP操作action時無法注入,報空指標錯誤

Spring AOP操作action時無法注入,報NullPointer異常當使用Spring AOP對action層進行操作時,會出現注入失敗的問題,出現空指標異常。原因是一般struts2+spring應用中,spring的外掛只負責為action的ioc部分,但並沒有

Quartz Job類無法注入spring bean問題解決方法

問題描述: 在Quartz的任務類中,無法使用autowired注入spring bean @Component @PersistJobDataAfterExecution @DisallowConcurrentExecution publi

spring3.1整合quartz時,spring依賴注入無法注入到quartz的job中的處理方法

定時任務類 package cn.customercard.controller; import java.util.Date; import javax.servlet.ServletContextEvent; import javax.serv

spring Junit單元測試 bean 無法注入的問題

本人菜鳥在學習ssh 過程 ,遇見問題 向各位大佬請教。進行單元測試 爆出下面提示: 貼出下面配置資訊: applicationContext.xml 實現service 介面類 實現dao介面類 單元測試 進過本菜鳥的各種錯嘗試,上面的配置檔案內容沒有錯誤,只是整合框架的過

Spring boot 無法注入service

SpringBoot專案的Bean裝配預設規則是根據Application類所在的包位置從上往下掃描! “Application類”是指SpringBoot專案入口類。這個類的位置很關鍵: 如果Appl