1. 程式人生 > >Spring之 IOC的繼續---bean標籤 --依賴注入 DI

Spring之 IOC的繼續---bean標籤 --依賴注入 DI

引用官方的 標準配置

IOC 中 bean 標籤和管理物件細節

bean 標籤作用:用於配置物件讓 spring 來建立的。

*

預設情況下它呼叫的是類中的無參建構函式。如果沒有無參建構函式則不能建立成屬性
:id:給物件在容器中提供一個唯一標識。用於獲取物件。
class:指定類的全限定類名。用於反射建立物件。預設情況下呼叫無參建構函式
scope:指定物件的作用範圍。*
singleton :預設值,單例的.*
prototype :多例的.*
request :WEB 專案中,Spring 建立一個 Bean 的物件,將物件存* session :WEB 專案中,Spring 建立一個 Bean 的物件,將物件存*
global session :WEB 專案中,應用在 Portlet 環境.如果沒globalSession 相當於 session.init-method:指定類中的初始化方法名稱。
destroy-method:指定類中銷燬方法名稱。

bean 的作用範圍和生命週期單例物件


scope="singleton"一個應用只有一個物件的例項。它的作用範圍就是整個引用。
生命週期:
物件出生:當應用載入,建立容器時,物件就被建立了。
物件活著:只要容器在,物件一直活著。物件死亡:當應用解除安裝,銷燬容器時,物件就被銷燬了。多例物件:scope="prototype"每次訪問物件時,都會重新建立物件例項。
生命週期:物件出生:當使用物件時,建立新的物件例項。物件活著:只要物件在使用中,就一直活著。物件死亡:當物件長時間不用時,被 java 的垃圾回收器回收----GC機制

編碼實現建立maven 的module----》

pom.xm 的擷取

4.0.0

<groupId>com.fhw</groupId>
<artifactId>fhw01_04bean_detail</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>


    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.26</version>
    </dependency>

package com.fhw.factory的

package com.fhw.factory;

import com.fhw.service.impl.IAccountServiceImpl;

public class InstanceFactory {
public IAccountServiceImpl getIAccountServiceImpl(){
return new IAccountServiceImpl();
}
}

package com.fhw.factory;

import com.fhw.service.IAcconutService;
import com.fhw.service.impl.IAccountServiceImpl;

public class staticFactory {
public static IAcconutService getIAcconutService(){
return new IAccountServiceImpl();
}
}
l

Service裡的

package com.fhw.service;
/*賬戶 :業務層的介面

  • /
    public interface IAcconutService {
    /
    *
    • 模擬儲存賬戶
      */
      void saveAccount();
      }

package com.fhw.service.impl;

import com.fhw.service.IAcconutService;

public class IAccountServiceImpl implements IAcconutService{
public IAccountServiceImpl() {
System.out.println(" 建立 物件");
}

public void saveAccount() {
    System.out.println("service 中的saveAccount()方法執行了");
}
public void init(){
    System.out.println("service 中初始化 的 init()方法執行了");
}
public void destroy(){
    System.out.println("service 中銷燬 的 destroy()方法執行了");
}

}

測試類

package com.fhw.ui;

import com.fhw.service.IAcconutService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

public class Client {
    /**
 *Bean物件的細節 可以撤職為Bean的類是
 * @param args
 */
public static void main(String[] args) {

   //獲取 spring 的核心容器物件:  引數就是 bean.xml
    ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
    //ApplicationContext acFile= new FileSystemXmlApplicationContext("");
    IAcconutService as1 = (IAcconutService)ac.getBean("accountService");
    IAcconutService as2 = (IAcconutService)ac.getBean("accountService");
 System.out.println(as1 == as2);//true

// as.saveAccount();

}

xml 配置 實現類的時候
DI:依賴注入有 2個
就是依據 與 ---->建構函式 與set 的方式
建構函式 —xml裡的配置
建構函式:beans–id=""–class=“”–
有參構造方法:
1:constructor-arg 裡屬性是的 說明 name type index—》定位引數(常用的是name)
(基本資料型別 --Value)

2:set —》是常用 的 無參的規則方法

3:集合 注入資料
常用集合:

<!--constructor-arg建構函式 的

優勢 : 必須要注入所有的 引數 否則 失敗
弊端:用不到的引數也要提供 死板 -->

<constructor-arg name="name" value="fhw"></constructor-arg>
<constructor-arg name="age" value="20"></constructor-arg>
<constructor-arg name="birthday" ref="date"></constructor-arg>
<!-- DI :之set 注入===常用的方式
標籤: property  在bean 裡
property  屬性:
 name:  最直接 最常用 : 寫上 set的方法名稱(不寫set這幾個字 , 首字母就不大寫了 )
         變數名稱=======》這是指定 引數的賦值
    value:要注入 的元素
      ref: 引用關聯的bean物件
 優勢:    沒有明確的限制 ,直接用預設建構函式
 劣勢:成員 必須有值 , 無法保持 一定注入 獲取物件時  有時set 沒有執行
 呼叫物件的時候  可能 通過建構函式 已用完了,
 -->
<?xml version="1.0" encoding="UTF-8"?>