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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

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

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

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

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

問題說明

最近看到spring事務(wù),在學(xué)習(xí)過程中遇到一個很苦惱問題

搭建好spring的啟動環(huán)境后出現(xiàn)了一點小問題

在啟動時候卻出現(xiàn)[java.lang.nullpointerexception]

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

工程結(jié)構(gòu)

@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. 數(shù)據(jù)源對象: 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.配置事務(wù) -->
  <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 {
 
  /**
   * 初始化數(shù)據(jù)源
   */
  @autowired
  private datasourcetransactionmanager datasourcetransactionmanager;
 
  /**
   * 開啟事務(wù)
   *
   * @return
   */
  public transactionstatus begin() {
    transactionstatus transaction = datasourcetransactionmanager.gettransaction(new defaulttransactiondefinition());
    system.out.println(" 開啟事務(wù)成功 ");
    return transaction;
  }
 
  /**
   * 提交事物
   *
   * @param transaction
   */
  public void commit(transactionstatus transaction) {
    datasourcetransactionmanager.commit(transaction);
    system.out.println(" 事物提交成功 ");
  }
 
  /**
   * 回滾事務(wù)
   *
   * @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 >>> 執(zhí)行出現(xiàn)異常 即將進行回滾操作");
      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執(zhí)行
   *
   * @param name
   * @param age
   */
  public void add(string name, integer age) {
    jdbctemplate.update(sql_insert_01, name, age);
  }
}

運行結(jié)果

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

問題分析

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

解決思路

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

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

看完也沒有問題

我就從java source一步一步看 發(fā)現(xiàn)....

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

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

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

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

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

改修代碼

serviceimpl.java修改后

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

daoimpl.java修改后

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

改修后調(diào)試

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

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

其實我懂得也不太多 spring注入的流程那

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

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

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

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

(在spring注解的源碼中@service和@repository等等都繼承了@component注解)

結(jié)論

在使用spring的bean容器時 千萬要確保

配置的注解掃描路徑正確

jar的依賴是否存在

是否在bean的上面加「@service @repository @component … 」

要細(xì)心 遇到異常不要緊 慢慢分析!!!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品乱码高清在线观看 | 2022国产在线观看 | 交换年轻夫妇HD中文字幕 | 久久九九精品国产自在现线拍 | 欧亚专线欧洲m码可遇不可求 | 久久这里有精品 | 日韩一区二三区无 | 亚洲成av人片天堂网 | 成年男女免费视频网站 | 青青草一区二区免费精品 | 亚洲网站大全 | 亚洲高清国产品国语在线观看 | 亚洲上最大成网人站4438 | 国产 国语对白 露脸正在播放 | 亚洲视频免费在线观看 | 国产精品成人在线播放 | 微拍秒拍99福利精品小视频 | 亚洲国产精品一区二区首页 | 精品国产福利一区二区在线 | 国自产拍在线天天更新91 | 咪咪爱在线视频 | 欧美人曾交| 成人福利视频网址 | 边摸边吃奶又黄激烈视频韩国 | 99在线播放| 国产美女亚洲精品久久久综合91 | 欧美白虎逼 | 免费一级特黄特色大片在线 | 久久精品国产在热亚洲完整版 | 九九国产在线观看 | 欧美午夜精品久久久久久黑人 | 亚洲国产精品91 | 久久免费特黄毛片 | 男人插曲女人身体 | 被强迫调教的高辣小说 | 国产趴着打光屁股sp抽打 | 成人特级毛片69免费观看 | 欧美黑人性猛交╳xx╳动态图 | 女明星放荡高h日常生活 | 日本高清色视影www日本 | 秋霞午夜视频 |