激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: av免播放 | 欧美成人二区 | 一级在线| 国产精品嘿咻嘿咻在线播放 | 国产日韩在线观看一区 | 九一成人 | www噜噜偷拍在线视频 | 日韩黄色免费在线观看 | 91精品国产九九九久久久亚洲 | 亚洲国产女同久久 | 欧美精品一区二区三区在线播放 | 日韩一级精品 | 日韩美香港a一级毛片免费 久久精品视频1 | 污版视频在线观看 | 中文字幕精品在线视频 | 亚洲国产精久久久久久久 | 久久精品国产亚洲aa级女大片 | 国产午夜精品一区二区三区视频 | 成人性视频欧美一区二区三区 | 国产成人精品免高潮在线观看 | av不卡免费在线 | 久久久久免费精品国产小说色大师 | 一级欧美日韩 | 激情视频在线播放 | 日本娇小18xxxⅹhd | 激情久久免费视频 | 国产精品自拍片 | 亚洲第五色综合网 | 欧美人与禽性xxxxx杂性 | 蜜桃一本色道久久综合亚洲精品冫 | 欧美黄成人免费网站大全 | 青青操精品 | 九九看片| 久久99亚洲精品久久99果 | 九九精品在线 | 亚洲一区二区网址 | 日韩精品久久久久久久九岛 | 性猛交ⅹxxx乱巴西 在线播放中文 | 日韩视频在线视频 | 九色一区二区 | 免费黄网站在线播放 |