Spring框架中如何使用IOC實現(xiàn)裝配Bean

今天就跟大家聊聊有關(guān)Spring框架中如何使用IOC實現(xiàn)裝配Bean,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務公司,擁有項目成都網(wǎng)站制作、網(wǎng)站設(shè)計網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元陜州做網(wǎng)站,已為上家服務,為陜州各地企業(yè)和個人服務,聯(lián)系電話:028-86922220

IOC裝配Bean

(1)Spring框架Bean實例化的方式提供了三種方式實例化Bean

  1. 構(gòu)造方法實例化(默認無參數(shù),用的最多)
  2. 靜態(tài)工廠實例化
  3. 實例工廠實例化

下面先寫這三種方法的applicationContext.xml配置文件:

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  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">
    
  <!-- Bean的三種實例化方式=================== -->  
   <!-- 2.1 使用無參的構(gòu)造器 -->
   <bean id="bean1" class="com.study.spring.b_instance.Bean1"></bean>
   <!-- 2.2使用靜態(tài)工廠方法 factory-method 是工廠提供的靜態(tài)方法 -->
   <bean id="bean2" class="com.study.spring.b_instance.Bean2" factory-method="createInstance"></bean>
   <!-- 2.3配置實例化工廠的方法 -->
   <bean id="bean3Factory" class="com.study.spring.b_instance.Bean3Factory"></bean>
   <bean id="bean3" factory-bean="bean3Factory" factory-method="getInstance"></bean>
  <!-- end.Bean的三種實例化方式==================== -->

Bean1類

public class Bean1 {
  
  //必須提供無參的構(gòu)造函數(shù) 系統(tǒng)有默認無參的構(gòu)造函數(shù)
}

Bean2類

public class Bean2 {
  private static Bean2 Bean2 = new Bean2();

  private Bean2() {
  }

  public static Bean2 createInstance() {
    return Bean2;
  }
}

Bean3類

public class Bean3 {

}

Bean3Factory類

public class Bean3Factory {
  
  private Bean3Factory(){
    
  }
   
  public Bean3 getInstance(){
    return new Bean3();
  }
}

測試類InstanceDemo

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class InstanceDemo {
  
  //實例化工廠方法
  @Test
  public void demo3(){
    //加載配置文件 創(chuàng)建工廠
    ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    
    Bean3 bean3 =(Bean3) applicationContext.getBean("bean3");
    System.out.println(bean3);
    
  }
  
  //靜態(tài)工廠方法
  @Test
  public void demo2(){
    //加載配置文件 創(chuàng)建工廠
    ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    
    Bean2 bean2 =(Bean2) applicationContext.getBean("bean2");
    System.out.println(bean2);
    
  }
  //構(gòu)造方法得到bean對象
  @Test
  public void demo1(){
    //加載配置文件 創(chuàng)建工廠
    ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    
    Bean1 bean1 =(Bean1) applicationContext.getBean("bean1");
    System.out.println(bean1);
    
  }
}
/*
 * 這三個都得到類似于com.study.spring.b_instance.Bean1@7229c204 的內(nèi)存地址
 */

 (2).Bean的其他配置:

一般情況下,裝配一個Bean時,通過指定一個id屬性作為Bean的名稱

id 屬性在IoC容器中必須是唯一的

id 的命名要滿足XML對ID屬性命名規(guī)范 必須以字母開始,可以使用字母、數(shù)字、連字符、下劃線、句話、冒號

如果Bean的名稱中含有特殊字符,就需要使用name屬性 例如: <bean name="#person" class="cn.itcast.bean.Person"/>

因為name屬性可以相同,所以后出現(xiàn)Bean會覆蓋之前出現(xiàn)的同名的Bean

id和name的區(qū)別:

id遵守XML約束的id的約束.id約束保證這個屬性的值是唯一的,而且必須以字母開始,可以使用字母、數(shù)字、連字符、下劃線、句話、冒號

name沒有這些要求

如果bean標簽上沒有配置id,那么name可以作為id.

Bean的scope屬性

 <!-- 3.Bean的scope屬性==================== -->  
   <bean id="product" class="com.study.spring.c_scope.Product" scope="singleton"></bean>
 <!-- end.Bean的scope屬性=========== -->  

 * singleton :單例的.(默認的值.)

 * prototype :多例的.

* request :web開發(fā)中.創(chuàng)建了一個對象,將這個對象存入request范圍,request.setAttribute();

* session :web開發(fā)中.創(chuàng)建了一個對象,將這個對象存入session范圍,session.setAttribute();

* globalSession :一般用于Porlet應用環(huán)境.指的是分布式開發(fā).不是porlet環(huán)境,globalSession等同于session;

3.Bean屬性的依賴注入

前面已經(jīng)知道如何獲得對象,那我們接下來要知道如果給對象對象的屬性賦值。

 Spring框架中如何使用IOC實現(xiàn)裝配Bean

下面通過舉例說明: 

Car 類

public class Car {

  private String name;

  private double price;

  public Car(String name, double price) {
    super();
    this.name = name;
    this.price = price;
  }

  @Override
  public String toString() {
    return "Car [name=" + name + ", price=" + price + "]";
  }
}

Car2類

public class Car2 {
  private String name;

  private double price;

  public void setName(String name) {
    this.name = name;
  }

  public void setPrice(double price) {
    this.price = price;
  }

  @Override
  public String toString() {
    return "Car2 [name=" + name + ", price=" + price + "]";
  }

}

CarInfo類

public class CarInfo {
  
  public String getName(){
    return "哈弗H6";
  }
  
  public double caculatePrice(){
    return 110000;
  }
}

CollectionBean類

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class CollectionBean {
  private String name;

  private Integer age;

  private List<String> hobbies;

  private Set<Integer> numbers;

  private Map<String, String> map;

  private Properties properties;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

  public List<String> getHobbies() {
    return hobbies;
  }

  public void setHobbies(List<String> hobbies) {
    this.hobbies = hobbies;
  }

  public Set<Integer> getNumbers() {
    return numbers;
  }

  public void setNumbers(Set<Integer> numbers) {
    this.numbers = numbers;
  }

  public Map<String, String> getMap() {
    return map;
  }

  public void setMap(Map<String, String> map) {
    this.map = map;
  }

  public Properties getProperties() {
    return properties;
  }

  public void setProperties(Properties properties) {
    this.properties = properties;
  }

  @Override
  public String toString() {
    return "CollectionBean [name=" + name + ", age=" + age + ", hobbies=" + hobbies + ", numbers=" + numbers
        + ", map=" + map + ", properties=" + properties + "]";
  }
  
}

Employee類

public class Employee {

  private String name;

  private Car2 car2;

  public void setName(String name) {
    this.name = name;
  }

  public void setCar2(Car2 car2) {
    this.car2 = car2;
  }

  @Override
  public String toString() {
    return "Employee [name=" + name + ", car2=" + car2 + "]";
  }

}

TestDi測試類

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDi {
  
  @Test
  public void demo6() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

    CollectionBean collectionBean = (CollectionBean) applicationContext.getBean("collectionBean");

    System.out.println(collectionBean);
  }
  
  
  @Test
  public void demo5() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

    Car2 car2 = (Car2) applicationContext.getBean("car2_2");

    System.out.println(car2);
  }
  
  
  @Test
  public void demo4() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

    Employee e = (Employee) applicationContext.getBean("employee2");

    System.out.println(e);
  }
  
  @Test
  public void demo3() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

    Employee e = (Employee) applicationContext.getBean("employee");

    System.out.println(e);
  }

  @Test
  public void demo2() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

    Car2 car2 = (Car2) applicationContext.getBean("car2");

    System.out.println(car2);
  }

  @Test
  public void demo1() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

    Car car = (Car) applicationContext.getBean("car");

    System.out.println(car);
  }
}

上面這幾個類都不是最主要的,我們主要是來看配置文件怎么寫,這才是最關(guān)鍵的:

applicationContext.xml

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  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">
  
  
  <!-- Bean的依賴注入=========== -->  
   <!-- 4.1構(gòu)造器注入 -->
    <bean id="car" class="com.study.spring.e_di.Car">
      <!-- 方式一.根據(jù)索引的位置 -->
      <!-- <constructor-arg index="0" value="保時捷"></constructor-arg>
       <constructor-arg index="1" value="1500000"></constructor-arg> -->
       <!-- 方式二.根據(jù)名字配置 -->
       <!-- <constructor-arg name="name" value="寶馬"></constructor-arg>
       <constructor-arg name="price" value="500000"></constructor-arg> -->
       <!-- 方式三.根據(jù)類型配置 -->
       <constructor-arg type="java.lang.String" value="奔馳"></constructor-arg>
       <constructor-arg type="double" value="600000"></constructor-arg>
    </bean>
    
   <!-- 4.2setter方法中注入 --> 
   <bean id="car2" class="com.study.spring.e_di.Car2">
     <property name="name" value="雪佛蘭"></property>
     <property name="price" value="100000"></property>
   </bean>
   
   <bean id="employee" class="com.study.spring.e_di.Employee">
     <property name="name" value="張三"></property>
     <property name="car2" ref="car2"></property>
   </bean>
   
   <!-- 引用p命名空間 --><!-- 如果要引用p命名,那在最上面sxd中就要配置 xmlns:p="http://www.springframework.org/schema/p"-->
    <bean id="car22" class="com.study.spring.e_di.Car2" p:name="寶馬" p:price="500000">
   </bean>
   <bean id="employee2" class="com.study.spring.e_di.Employee" p:name="李四" p:car2-ref="car22"></bean>
   
    <!-- 引入spEL表達式 -->
   <bean id="carInfo" class="com.study.spring.e_di.CarInfo"></bean>
    <bean id="car2_2" class="com.study.spring.e_di.Car2">
      <property name="name" value="#{carInfo.name}"></property>
      <property name="price" value="#{carInfo.caculatePrice()}"></property>
    </bean>
    
   <!-- 復雜屬性的依賴注入 -->  
    <bean id="collectionBean" class="com.study.spring.e_di.CollectionBean">
      <!-- 簡單屬性的注入 -->
      <property name="name" value="歸谷"></property>
      <property name="age" value="12"></property>
      <!-- 注入list集合 -->
       <property name="hobbies">
         <list>
           <value>吃飯</value>
           <value>睡覺</value>
           <value>敲代碼</value>
         </list>
       </property>
       
       <!-- 注入set集合 -->
       <property name="numbers">
         <set>
           <value>10</value>
           <value>20</value>
           <value>30</value>
           <value>40</value>
           <value>50</value>
         </set>
       </property>
       <!-- 注入map集合 -->
       <property name="map">
         <map>
           <entry key="birthday" value="2017-1-1"></entry>
           <entry key="address" value="杭州西湖"></entry>
           <entry key="sex" value="female"></entry>
         </map>
       </property>
       
       <!-- 注入Properties -->
       <property name="properties">
         <props>
           <prop key="compamy">杭州歸谷</prop>
           <prop key="pnum">200</prop>
         </props>
       </property>
    </bean>
    
  <!-- end Bean的依賴注入============ -->  
  <import resource="classpath:bean1.xml"/>    
  <import resource="classpath:bean2.xml"/>    
  <!-- 這里導入是指如果在src下還有其它的beans.xml我們可以這樣去調(diào)用 -->  
    
</beans>

有關(guān)applicationContext.xml這個配置文件里的內(nèi)容一定要看懂,我寫的還是比較基礎(chǔ)和全面的。

有關(guān)命名空間p的使用我這里在解釋下:   

p:<屬性名>="xxx" 引入常量值

p:<屬性名>-ref="xxx" 引用其它Bean對象

看完上述內(nèi)容,你們對Spring框架中如何使用IOC實現(xiàn)裝配Bean有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

網(wǎng)頁名稱:Spring框架中如何使用IOC實現(xiàn)裝配Bean
URL地址:http://muchs.cn/article6/ghicog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、用戶體驗建站公司、電子商務靜態(tài)網(wǎng)站、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)