java Spring 之IOC依賴註入

来源:https://www.cnblogs.com/fengjiejun/archive/2018/07/19/9302341.html
-Advertisement-
Play Games

內容簡介 spring ioc和xml配置文件實現註入 spring 註解模式實現註入 Java使用框架都需要導入jar包,xml配置需要導入4個核心包,java核心包基本都不提供日記功能,需要導入2個額外日記包,我的spring是4.x版本.導入包如下(下載地址不在這裡發了,百度下載) bean包 ...


內容簡介

  • spring ioc和xml配置文件實現註入
  • spring 註解模式實現註入

Java使用框架都需要導入jar包,xml配置需要導入4個核心包,java核心包基本都不提供日記功能,需要導入2個額外日記包,我的spring是4.x版本.導入包如下(下載地址不在這裡發了,百度下載)

  1. spring-beans-4.3.8.RELEASE.jar
  2. spring-context-4.3.8.RELEASE.jar
  3. spring-core-4.3.8.RELEASE.jar
  4. spring-expression-4.3.8.RELEASE.jar
  5. commons-logging-1.2.jar
  6. log4j-1.2.17.jar

bean包是標簽包,core是核心包,expression應該是驗證表達式包,context我估計是根據提供的路徑反射生成對象的包,(我學歷不夠,才小學畢業自學的java,自學理解的spring ioc註入,非程式員).

spring 包導入後,需要一個xml配置表,配置表第一步是導入約束,我下麵是一個完整的配置文件,比較常用的幾個配置....

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

     <bean id="user" class="cn.panda.model.user">
     <constructor-arg ref="book"/>
     <constructor-arg type="int" value="21"/>
   <bean>
<bean id="book" class="cn.panda.model.book">
<property name="bookname" value="西游記"/>
</bean> </beans>

在一一介紹 bean標簽的關鍵詞

id是一個唯一名稱.命名要規範,前面不能已特殊符號開頭,中間不能有空格這些特殊符號,我一般是用駱駝(UserName)命名法,不知道帕斯卡命名(user_name)行不行.

class 是需要生成的對象的全路徑(cn.panda.userDao)

scope 是生成對象保存在哪裡對象.總共7個屬性,基本用的最多是2個,singleton 單列模式(預設),每次獲取對象都是同一個對象記憶體地址是同一個. prototype是多列模式,每次生成都是新的對象. session. request ,globalssion,application 這幾個是關於HTTP有關的對象(不是很重要,基本很少用或者不用)最後只要知道就可以了websocket.

name 屬性好像是為了相容strut1.x版本和老版本.還有可以使用一些特殊符號的名稱,總體和ID關鍵詞差不多的功能

constructor-arg是對象構造函數註入參數.是bean子節點(可以多個參數節點),裡面有3個比較常用的屬性,ref對應是需要註入的對象id, type 是註入變數名稱如Int,java.lang.String這些, value指定的值.

property 是bean對象子節點的,裡面有個name屬性對應對象的屬性名稱,ref  需要賦值的bean 的ID值,value是指定的值...

下麵是複雜的屬性註入list,map,properties,set (複製官方文檔了)

<bean id="moreComplexObject" class="example.ComplexObject">
    <!-- results in a setAdminEmails(java.util.Properties) call -->
    <property name="adminEmails">
        <props>
            <prop key="administrator">[email protected]</prop>
            <prop key="support">[email protected]</prop>
            <prop key="development">[email protected]</prop>
        </props>
    </property>
    <!-- results in a setSomeList(java.util.List) call -->
    <property name="someList">
        <list>
            <value>a list element followed by a reference</value>
            <ref bean="myDataSource" />
        </list>
    </property>
    <!-- results in a setSomeMap(java.util.Map) call -->
    <property name="someMap">
        <map>
            <entry key="an entry" value="just some string"/>
            <entry key ="a ref" value-ref="myDataSource"/>
        </map>
    </property>
    <!-- results in a setSomeSet(java.util.Set) call -->
    <property name="someSet">
        <set>
            <value>just some string</value>
            <ref bean="myDataSource" />
        </set>
    </property>
</bean>

這裡介紹如何靜態方法和工廠方法生成對象.....先寫一段代碼(代碼命名對於java程式員來說不是很規範,以前自學c#,所以有些命名用c#方式命名了)

 1 public class A{
 2    public void Hello(){
 3         system.out.println("Hello world");
 4    }
 5 }
 6 
 7 
 8 public class FactoryA{
 9 
10        public static A GetA(){
11               A a=new A();
12               return a;
13       }
14 }
15 
16 public class  FactoryB{
17        public A GetA(){
18              A a=new A();
19               return a;
20        }
21 }
View Code

 如上代碼我們如何獲取A的對象.bean也提供了幾個關鍵詞,我還是在代碼里寫註解和解釋

<!--靜態方法獲取的A的註入生成的對象...class是工廠類的全路徑 ,factory-method是方法名稱-->
<bean id="A" class="factoryA" factory-method="GetA"/> 

<!--IOC註入生成A的對象我們先配置A和需要生成的A的對象factoryB的配置-->
<!--factory-bean對應實列工廠的bean名稱-->
<bean id="A"  factory-bean="factoryB"  factory-method="GetA"/>
<bean id="factoryB" class="factoryB"/>

 最後一個多xml文件引入,因為一個項目不同人開發不同的模塊,可以引入多個xml配置文件

<beans>
    <import resource="xml文件的路徑"/>
    <bean id=".." class="..."/>
</beans>

spring IOC依賴註入的xml文件比較常用都寫完了,下麵是註解模式.註解模式需要一個引入一個核心包 spring-aop-4.3.8.RELEASE.jar

在配置文件重新編輯約束包,我只寫一些比較常用的註解模式比較全建議看官方文檔.都是英文版

<?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">
   <context:component-scan base-package="cn.panda.*"/>
</beans>

可以看到此約束比xml約束多了一個xmlns:context約束和<context:component-scan base-package="cn.panda.*"/>  這個就是表示開啟註解模式...

base-package掃描那個包的註解,多個包可以用,分開如(cn.panda.model,cn.panda.dao)也可以用cn.panda.*表示掃描是cn.panda的包,後面所有的意思.不管你後面是啥都會掃描.

註解4個功能一樣註解的. @Component(實體層),@Service(邏輯處理層),@Controller(web層),@Repository(Dao層).不知道以後spring官方會不會給他們不同的功能,現在功能都差不多.

下麵用一段代碼+加註解可以更好講解比較常用的註解模式.

pakeage cn.panda.model;
/*實體層代碼,映射層*/
@Component(value="user")
/*scope("singleton") 這裡可以加singelton或者prototye,反正scope的7個不寫預設singelton*/
public class user{

}

pakeage cn.panda.dao;
/*數據訪問層*/
@Repository(value="userdao")
public class userdao(){
       public int add(user user){
             /*代碼處理邏輯代碼*/
       }
}


pakeage cn.panda.service;
@Service(value="userservice")
public class userservice{
   private cn.panda.dao.userdao userdao;
   /*@Autowired就是自動註入跟userdao欄位一樣名稱對象,如果不存在userdao就會報錯*/
   /*@Resource(name="userdao")  就是指定註入ID的對象.*/
   public void  cn.panda.dao.userdao setUserdao(cn.panda.dao.userdao userdao){
       this.userdao=userdao;
   }
   public  int add(cn.panda.user user){
    return   this.userdao.add(user);
  }
}


/*這裡介紹@controller 這個註解,一般這個註解是用於web層.詞義是控制器意思*/
@controller
/*ActionSuport是stucts2的一個類,我現在木有學到這裡整合對象這些,以後會介紹stucts2*/
public class Index extends ActionSuport{

}

 註解還有很多,還有configuration配置.還有引入過濾一些註解.這些暫時不寫了,我感覺作用不怎麼大,所以木有怎麼自學過.

混合模式就是xml加註解模式註入的註意事項,我也不知道正不正確驗證,我也是自學的.註解中指定ID不知道跟xml配置ID不能重覆.第二,xml配置ID可以指定給註解中.


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

-Advertisement-
Play Games
更多相關文章
  • 簡單工廠模式Simple Factory Pattern【Simple Factory Pattern】是設計模式里最簡單的一個模式,又叫靜態工廠模式【Static Factory Pattern】,這個模式沒有收錄在GOF 23 個模式中,因為他非常簡單,在項目中使用也非常廣泛,所以就用它來開篇。 ...
  • 一、要有命名空間 xmlns:context="http://www.springframework.org/schema/context" 二、作用:直接上解釋吧! Scans the classpath for annotated components that will be auto-reg ...
  • 第一種: File f = new File(this.getClass().getResource("/").getPath()); System.out.println(f); 結果: C:\Documents%20and%20Settings\Administrator\workspace\p ...
  • 【轉載請註明】https://www.cnblogs.com/igoslly/p/9339478.html ...
  • python的下載 python官網地址:https://www.python.org/ python的版本 Python2和python3建議都安裝,以便學習 安裝時最好安裝到磁碟的根目錄,方便以後操作 python環境變數的配置 向path環境變數里添加python和python下script的 ...
  • 獲取現在系統的時間和日期看起來是一件非常神奇的事情,但是當使用date和calendar之後發現仍然非常神奇。 1、date 使用date日期之前需要導入包: import java.text.SimpleDateFormat;//用來格式化date文本輸出;import java.util.Dat ...
  • 上一篇講了第一個mybatis程式的過程,這一篇咱們來談談mybatis的相關配置。 主要配置項如下 這次只簡單講解properties、settings、typeAliases、environments、databaseIdProvider、mappers六個配置,剩下的後面講解mybatis源碼 ...
  • 輸出函數:print() 示例: print('hello world') 輸入函數:input() 示例 input('等待鍵盤錄入') 判斷語句 if else 用法: if 條件 : #如果條件滿足,則執行if語句代碼塊裡面的代碼 ,否則執行else語句代碼塊裡面的代碼 示例: if 1 < ... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...