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

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

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

服務器之家 - 編程語言 - Java教程 - @Autowired注入為null問題原因分析

@Autowired注入為null問題原因分析

2021-06-17 11:09吃魚不挑刺 Java教程

這篇文章主要介紹了@Autowired注入為null問題原因分析嗎,小編覺得挺不錯的,對日后比較有幫助,具有一定的參考價值,感興趣的小伙伴們可以參考一下

問題說明

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

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

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

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

工程結構

@Autowired注入為null問題原因分析

代碼片段

spring.xml

?
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
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemalocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">
 
  <!-- spring注解掃描 -->
  <context:component-scan base-package="com.*" />
 
  <!-- 1. 數據源對象: c3p0連接池 -->
  <bean id="datasource"
    class="com.mchange.v2.c3p0.combopooleddatasource">
    <property name="driverclass" value="org.h2.driver"></property>
    <property name="jdbcurl"
      value="jdbc:h2:tcp://192.168.190.1/~/test"></property>
    <property name="user" value="sa"></property>
    <property name="password" value="123"></property>
  </bean>
 
  <!-- 2. jdbctemplate工具類實例 -->
  <bean id="jdbctemplate"
    class="org.springframework.jdbc.core.jdbctemplate">
    <property name="datasource" ref="datasource"></property>
  </bean>
 
  <!-- 3.配置事務 -->
  <bean id="datasourcetransactionmanager"
    class="org.springframework.jdbc.datasource.datasourcetransactionmanager">
    <property name="datasource" ref="datasource"></property>
  </bean>
 
</beans>

test.java

?
1
2
3
4
5
6
7
8
public class test {
  public static void main(string[] args) {
    classpathxmlapplicationcontext classpathxmlapplicationcontext = new classpathxmlapplicationcontext(
        "spring.xml");
    serviceif service = (serviceif) classpathxmlapplicationcontext.getbean("serviceimpl");
    service.add("小王", 23);
  }
}

transactionutil.java

?
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
29
30
31
32
33
34
35
36
37
38
39
40
@component("transactionutil")
public class transactionutil {
 
  /**
   * 初始化數據源
   */
  @autowired
  private datasourcetransactionmanager datasourcetransactionmanager;
 
  /**
   * 開啟事務
   *
   * @return
   */
  public transactionstatus begin() {
    transactionstatus transaction = datasourcetransactionmanager.gettransaction(new defaulttransactiondefinition());
    system.out.println(" 開啟事務成功 ");
    return transaction;
  }
 
  /**
   * 提交事物
   *
   * @param transaction
   */
  public void commit(transactionstatus transaction) {
    datasourcetransactionmanager.commit(transaction);
    system.out.println(" 事物提交成功 ");
  }
 
  /**
   * 回滾事務
   *
   * @param transaction
   */
  public void rollback(transactionstatus transaction) {
    datasourcetransactionmanager.rollback(transaction);
    system.err.println(" 事物進行回滾 ");
  }
}

serviceimpl.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@service("serviceimpl")
public class serviceimpl implements serviceif {
 
  @autowired
  transactionutil transactionutil;
 
  private transactionstatus transactionstatus = null;
 
  @override
  public void add(string name, integer age) {
    transactionstatus = transactionutil.begin();
    try {
      new daoimpl().add(name, age);
      transactionutil.commit(transactionstatus);
    } catch (exception e) {
      system.err.println("error >>> 執行出現異常 即將進行回滾操作");
      transactionutil.rollback(transactionstatus);
    }
  }
}

daoimpl.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class daoimpl implements daoif{
 
  /**
   * 注入jdbc模板類
   */
  @autowired
  private jdbctemplate jdbctemplate;
 
  /**
   * 第一條插入語句
   */
  private final string sql_insert_01 = "insert into user values (?,?)";
 
  /**
   * 添加sql執行
   *
   * @param name
   * @param age
   */
  public void add(string name, integer age) {
    jdbctemplate.update(sql_insert_01, name, age);
  }
}

運行結果

@Autowired注入為null問題原因分析

問題分析

@Autowired注入為null問題原因分析

解決思路

我在想 為什么會沒有注入進來呢 我明明加了@autowired注解

后來猜到可能是spring.xml配置的問題

看完也沒有問題

我就從java source一步一步看 發現....

@Autowired注入為null問題原因分析

我靠 我就猜測是不是如果用「new object()」的方式創建實例后 其class中的bean的注解會失效呢?

然后我嘗試在serviceimpl.java中以注解的方式把daoif的實例注入到serviceimpl,

并在daoimpl.java的類上面添加@repository,

把serviceimpl.java中new daoimpl()替換成注入的daoimpl。

改修代碼

serviceimpl.java修改后

@Autowired注入為null問題原因分析

daoimpl.java修改后

@Autowired注入為null問題原因分析

改修后調試

@Autowired注入為null問題原因分析

@Autowired注入為null問題原因分析

其實我懂得也不太多 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 … 」

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

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

原文鏈接:http://www.cnblogs.com/cat-/p/10014477.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 黑人巨茎大战欧美白妇 | 男人晚上看的 | 久久国产视频网站 | 午夜无码国产理论在线 | 糖心vlog麻豆精东影业传媒 | 亚洲精品一区二区三区在线播放 | α片免费| 亚洲va国产日韩欧美精品色婷婷 | 国产精品亚洲精品日韩已满 | 欧美在线视频一区在线观看 | pron在线观看| 精品成人片深夜 | 日本免费高清在线 | 成年人免费在线看 | 秋霞一级黄色片 | 久久99热狠狠色一区二区 | 亚洲国产欧美在线成人aaaa | 日产国产精品亚洲系列 | 免费看日产一区二区三区 | 色婷婷在线播放 | 日韩在线视频一区二区三区 | 俄罗斯一级大片 | 果冻传媒在线播放观看228集 | 日本精品久久久久久久久免费 | 欧美一级特黄特色大片 | 国产精品va在线观看不 | 日本三级做a全过程在线观看 | 国模丰满美女冰漪34d | 免看一级a一片成人123 | 精品久久久久中文字幕日本 | 美女靠逼免费网站 | 91麻豆制片厂 | 亚洲第一色视频 | 激性欧美激情在线aa | 97爱干| 国内精品久久久久小说网 | 五月香婷婷 | 色人阁导航 | 好湿好紧太硬了我好爽 | 色人阁图片 | 天码毛片一区二区三区入口 |