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

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

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

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

目錄

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

1)基于無參構(gòu)造函數(shù)

2)基于靜態(tài)工廠方法實(shí)例化

3)基于實(shí)例工廠方法實(shí)例化

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

1)基于構(gòu)造函數(shù)依賴注入(單個(gè)參數(shù))

2)基于構(gòu)造函數(shù)依賴注入(多個(gè)參數(shù))

3)基于Setter方法依賴注入

總結(jié):

3.IoC容器創(chuàng)建和使用

1)容器實(shí)例化

2)Bean對象獲取

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

1)周期方法配置

①周期方法的聲明

②周期方法的配置

2)作用域配置

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

1)FactoryBean實(shí)現(xiàn)類

2)配置FactoryBean實(shí)現(xiàn)類?

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


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

1)基于無參構(gòu)造函數(shù)

  • 組件類
package com.atguigu.ioc;


public class HappyComponent {

    //默認(rèn)包含無參數(shù)構(gòu)造函數(shù)

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

2)基于靜態(tài)工廠方法實(shí)例化

  • 組件類
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)基于實(shí)例工廠方法實(shí)例化

  • 組件類
public class DefaultServiceLocator {

  private static ClientServiceImplclientService = new ClientServiceImpl();

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

<!-- 根據(jù)工廠對象的實(shí)例工廠方法進(jìn)行實(shí)例化組件對象 -->
<bean id="clientService"
  factory-bean="serviceLocator"
  factory-method="createClientServiceInstance"/>

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

1.基于構(gòu)造函數(shù)依賴注入(單個(gè)參數(shù)、多個(gè)參數(shù))

2.基于Setter方法依賴注入

1)基于構(gòu)造函數(shù)依賴注入(單個(gè)參數(shù))

  • 組件類
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">
   <!-- 構(gòu)造函數(shù)引用 -->
    <constructor-arg ref="userDao"/>
  </bean>
  <!-- 被引用類bean聲明 -->
  <bean id="userDao" class="x.y.UserDao"/>
</beans>

2)基于構(gòu)造函數(shù)依賴注入(多個(gè)參數(shù))

  • 組件類
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: 多參數(shù),可以按照相應(yīng)構(gòu)造函數(shù)的順序注入數(shù)據(jù) -->
<beans>
  <bean id="userService" class="x.y.UserService">
    <!-- value直接注入基本類型值 -->
    <constructor-arg  value="18"/>
    <constructor-arg  value="趙偉風(fēng)"/>
    
    <constructor-arg  ref="userDao"/>
  </bean>
  <!-- 被引用類bean聲明 -->
  <bean id="userDao" class="x.y.UserDao"/>
</beans>


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

<!-- 場景2: 多參數(shù),可以按照相應(yīng)構(gòu)造函數(shù)的角標(biāo)注入數(shù)據(jù) 
           index從0開始 構(gòu)造函數(shù)(0,1,2....)
-->
<beans>
    <bean id="userService" class="x.y.UserService">
    <!-- value直接注入基本類型值 -->
    <constructor-arg index="1" value="趙偉風(fēng)"/>
    <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對象的標(biāo)識id
       name = 屬性名  ref = 引用bean的id值
   -->
  <property name="movieFinder" ref="movieFinder" />

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

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

總結(jié):

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

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

3.IoC容器創(chuàng)建和使用

1)容器實(shí)例化

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

2)Bean對象獲取

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

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

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

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

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的作用域 
    準(zhǔn)備兩個(gè)引用關(guān)系的組件類即可!!
-->
<!-- scope屬性:取值singleton(默認(rèn)值),bean在IOC容器中只有一個(gè)實(shí)例,IOC容器初始化時(shí)創(chuàng)建對象 -->
<!-- scope屬性:取值prototype,bean在IOC容器中可以有多個(gè)實(shí)例,getBean()時(shí)創(chuàng)建對象 -->
<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實(shí)現(xiàn)類

// 實(shí)現(xiàn)FactoryBean接口時(shí)需要指定泛型
// 泛型類型就是當(dāng)前工廠要生產(chǎn)的對象的類型
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 {
    
        // 方法內(nèi)部模擬創(chuàng)建、設(shè)置一個(gè)對象的復(fù)雜過程
        HappyMachine happyMachine = new HappyMachine();
    
        happyMachine.setMachineName(this.machineName);
    
        return happyMachine;
    }
    
    @Override
    public Class<?> getObjectType() {
    
        // 返回要生產(chǎn)的對象的類型
        return HappyMachine.class;
    }
}

2)配置FactoryBean實(shí)現(xiàn)類

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

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

@Test
public void testExperiment07()  {

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

    //注意: 直接根據(jù)聲明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

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