日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

SpringIoC-基于XML配置方式組件管理

作者:W-琑 更新時間: 2024-03-07 編程語言

目錄

1.組件(Bean)信息聲明配置(IoC)

1)基于無參構造函數

2)基于靜態工廠方法實例化

3)基于實例工廠方法實例化

2.組件(Bean)依賴注入配置(DI)

1)基于構造函數依賴注入(單個參數)

2)基于構造函數依賴注入(多個參數)

3)基于Setter方法依賴注入

總結:

3.IoC容器創建和使用

1)容器實例化

2)Bean對象獲取

4.組件作用域和周期方法配置

1)周期方法配置

①周期方法的聲明

②周期方法的配置

2)作用域配置

5.高級特性:FactoryBean特性和使用

1)FactoryBean實現類

2)配置FactoryBean實現類?

3)測試讀取FactoryBean和FactoryBean.getObject對象


1.組件(Bean)信息聲明配置(IoC)

1)基于無參構造函數

  • 組件類
package com.atguigu.ioc;


public class HappyComponent {

    //默認包含無參數構造函數

    public void doWork() {
        System.out.println("HappyComponent.doWork");
    }
}
  • xml配置文件編寫
<!-- 實驗一 [重要]創建bean -->
<bean id="happyComponent" class="com.atguigu.ioc.HappyComponent"/>

2)基于靜態工廠方法實例化

  • 組件類
public class ClientService {
  private static ClientService clientService = new ClientService();
  private ClientService() {}

  public static ClientService createInstance() {
  
    return clientService;
  }
}
  • xml配置文件編寫
<bean id="clientService"
  class="examples.ClientService"
  factory-method="createInstance"/>

3)基于實例工廠方法實例化

  • 組件類
public class DefaultServiceLocator {

  private static ClientServiceImplclientService = new ClientServiceImpl();

  public ClientService createClientServiceInstance() {
    return clientService;
  }
}
  • xml配置文件編寫
<!-- 將工廠類進行ioc配置 -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
</bean>

<!-- 根據工廠對象的實例工廠方法進行實例化組件對象 -->
<bean id="clientService"
  factory-bean="serviceLocator"
  factory-method="createClientServiceInstance"/>

2.組件(Bean)依賴注入配置(DI)

1.基于構造函數依賴注入(單個參數、多個參數)

2.基于Setter方法依賴注入

1)基于構造函數依賴注入(單個參數)

  • 組件類
public class UserDao {
}


public class UserService {
    
    private UserDao userDao;

    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
}
  • 配置文件
<beans>
  <!-- 引用類bean聲明 -->
  <bean id="userService" class="x.y.UserService">
   <!-- 構造函數引用 -->
    <constructor-arg ref="userDao"/>
  </bean>
  <!-- 被引用類bean聲明 -->
  <bean id="userDao" class="x.y.UserDao"/>
</beans>

2)基于構造函數依賴注入(多個參數)

  • 組件類
public class UserDao {
}


public class UserService {
    
    private UserDao userDao;
    
    private int age;
    
    private String name;

    public UserService(int age , String name ,UserDao userDao) {
        this.userDao = userDao;
        this.age = age;
        this.name = name;
    }
}
  • 配置文件
<!-- 場景1: 多參數,可以按照相應構造函數的順序注入數據 -->
<beans>
  <bean id="userService" class="x.y.UserService">
    <!-- value直接注入基本類型值 -->
    <constructor-arg  value="18"/>
    <constructor-arg  value="趙偉風"/>
    
    <constructor-arg  ref="userDao"/>
  </bean>
  <!-- 被引用類bean聲明 -->
  <bean id="userDao" class="x.y.UserDao"/>
</beans>


<!-- 場景2: 多參數,可以按照相應構造函數的名稱注入數據 -->
<beans>
  <bean id="userService" class="x.y.UserService">
    <!-- value直接注入基本類型值 -->
    <constructor-arg name="name" value="趙偉風"/>
    <constructor-arg name="userDao" ref="userDao"/>
    <constructor-arg name="age"  value="18"/>
  </bean>
  <!-- 被引用類bean聲明 -->
  <bean id="userDao" class="x.y.UserDao"/>
</beans>

<!-- 場景2: 多參數,可以按照相應構造函數的角標注入數據 
           index從0開始 構造函數(0,1,2....)
-->
<beans>
    <bean id="userService" class="x.y.UserService">
    <!-- value直接注入基本類型值 -->
    <constructor-arg index="1" value="趙偉風"/>
    <constructor-arg index="2" ref="userDao"/>
    <constructor-arg index="0"  value="18"/>
  </bean>
  <!-- 被引用類bean聲明 -->
  <bean id="userDao" class="x.y.UserDao"/>
</beans>

3)基于Setter方法依賴注入

  • 組件類
public Class MovieFinder{

}

public class SimpleMovieLister {

  private MovieFinder movieFinder;
  
  private String movieName;

  public void setMovieFinder(MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
  }
  
  public void setMovieName(String movieName){
    this.movieName = movieName;
  }

  // business logic that actually uses the injected MovieFinder is omitted...
}
  • 配置文件
<bean id="simpleMovieLister" class="examples.SimpleMovieLister">
  <!-- setter方法,注入movieFinder對象的標識id
       name = 屬性名  ref = 引用bean的id值
   -->
  <property name="movieFinder" ref="movieFinder" />

  <!-- setter方法,注入基本數據類型movieName
       name = 屬性名 value= 基本類型值
   -->
  <property name="movieName" value="消失的她"/>
</bean>

<bean id="movieFinder" class="examples.MovieFinder"/>

總結:

? 依賴注入(DI)包含引用類型和基本數據類型。

? 需要特別注意:引用其他bean,使用ref屬性。直接注入基本類型值,使用value屬性。

3.IoC容器創建和使用

1)容器實例化

//方式1:實例化并且指定配置文件
//參數:String...locations 傳入一個或者多個配置文件
ApplicationContext context = 
           new ClassPathXmlApplicationContext("services.xml", "daos.xml");
           
//方式2:先實例化,再指定配置文件,最后刷新容器觸發Bean實例化動作 [springmvc源碼和contextLoadListener源碼方式]  
ApplicationContext context = 
           new ClassPathXmlApplicationContext();   
//設置配置配置文件,方法參數為可變參數,可以設置一個或者多個配置
iocContainer1.setConfigLocations("services.xml", "daos.xml");
//后配置的文件,需要調用refresh方法,觸發刷新配置
iocContainer1.refresh();           

2)Bean對象獲取

//方式1: 根據id獲取
//沒有指定類型,返回為Object,需要類型轉化!
HappyComponent happyComponent = 
        (HappyComponent) iocContainer.getBean("bean的id標識");
        
//使用組件對象        
happyComponent.doWork();

//方式2: 根據類型獲取
//根據類型獲取,但是要求,同類型(當前類,或者之類,或者接口的實現類)只能有一個對象交給IoC容器管理
//配置兩個或者以上出現: org.springframework.beans.factory.NoUniqueBeanDefinitionException 問題
HappyComponent happyComponent = iocContainer.getBean(HappyComponent.class);
happyComponent.doWork();

//方式3: 根據id和類型獲取
HappyComponent happyComponent = iocContainer.getBean("bean的id標識", HappyComponent.class);
happyComponent.doWork();

根據類型來獲取bean時,在滿足bean唯一性的前提下,其實只是看:『對象 instanceof 指定的類型』的返回結果,
只要返回的是true就可以認定為和類型匹配,能夠獲取到。

4.組件作用域和周期方法配置

1)周期方法配置

①周期方法的聲明

public class BeanOne {

  //周期方法要求: 方法命名隨意,但是要求方法必須是 public void 無形參列表
  public void init() {
    // 初始化邏輯
  }
}

public class BeanTwo {

  public void cleanup() {
    // 釋放資源邏輯
  }
}

②周期方法的配置

<beans>
  <bean id="beanOne" class="examples.BeanOne" init-method="init" />
  <bean id="beanTwo" class="examples.BeanTwo" destroy-method="cleanup" />
</beans>

2)作用域配置

c.作用域配置

<!--bean的作用域 
    準備兩個引用關系的組件類即可!!
-->
<!-- scope屬性:取值singleton(默認值),bean在IOC容器中只有一個實例,IOC容器初始化時創建對象 -->
<!-- scope屬性:取值prototype,bean在IOC容器中可以有多個實例,getBean()時創建對象 -->
<bean id="happyMachine8" scope="prototype" class="com.atguigu.ioc.HappyMachine">
    <property name="machineName" value="happyMachine"/>
</bean>

<bean id="happyComponent8" scope="singleton" class="com.atguigu.ioc.HappyComponent">
    <property name="componentName" value="happyComponent"/>
</bean>

d.作用域測試

@Test
public void testExperiment08()  {
    ApplicationContext iocContainer = new ClassPathXmlApplicationContext("配置文件名");

    HappyMachine bean = iocContainer.getBean(HappyMachine.class);
    HappyMachine bean1 = iocContainer.getBean(HappyMachine.class);
    //多例對比 false
    System.out.println(bean == bean1);

    HappyComponent bean2 = iocContainer.getBean(HappyComponent.class);
    HappyComponent bean3 = iocContainer.getBean(HappyComponent.class);
    //單例對比 true
    System.out.println(bean2 == bean3);
}

5.高級特性:FactoryBean特性和使用

1)FactoryBean實現類

// 實現FactoryBean接口時需要指定泛型
// 泛型類型就是當前工廠要生產的對象的類型
public class HappyFactoryBean implements FactoryBean<HappyMachine> {
    
    private String machineName;
    
    public String getMachineName() {
        return machineName;
    }
    
    public void setMachineName(String machineName) {
        this.machineName = machineName;
    }
    
    @Override
    public HappyMachine getObject() throws Exception {
    
        // 方法內部模擬創建、設置一個對象的復雜過程
        HappyMachine happyMachine = new HappyMachine();
    
        happyMachine.setMachineName(this.machineName);
    
        return happyMachine;
    }
    
    @Override
    public Class<?> getObjectType() {
    
        // 返回要生產的對象的類型
        return HappyMachine.class;
    }
}

2)配置FactoryBean實現類

<!-- FactoryBean機制 -->
<!-- 這個bean標簽中class屬性指定的是HappyFactoryBean,但是將來從這里獲取的bean是HappyMachine對象 -->
<bean id="happyMachine7" class="com.atguigu.ioc.HappyFactoryBean">
    <!-- property標簽仍然可以用來通過setXxx()方法給屬性賦值 -->
    <property name="machineName" value="iceCreamMachine"/>
</bean>

3)測試讀取FactoryBean和FactoryBean.getObject對象

@Test
public void testExperiment07()  {

    ApplicationContext iocContainer = new ClassPathXmlApplicationContext("spring-bean-07.xml");

    //注意: 直接根據聲明FactoryBean的id,獲取的是getObject方法返回的對象
    HappyMachine happyMachine = iocContainer.getBean("happyMachine7",HappyMachine.class);
    System.out.println("happyMachine = " + happyMachine);

    //如果想要獲取FactoryBean對象, 直接在id前添加&符號即可!  &happyMachine7 這是一種固定的約束
    Object bean = iocContainer.getBean("&happyMachine7");
    System.out.println("bean = " + bean);
}

原文鏈接:https://blog.csdn.net/weixin_69134926/article/details/136074201

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新