1. 程式人生 > 其它 >Spring-IOC (IOC的特點、生命週期、自動裝配)

Spring-IOC (IOC的特點、生命週期、自動裝配)

1.關於Spring的Bean  

  (1)Spring的bean有兩種:普通Bean 以及 工廠Bean(FactoryBean)

      普通 bean:在配置檔案中定義 bean 型別就是返回型別  

      工廠 bean:在配置檔案定義 bean 型別可以和返回型別不一樣

2.建立工廠Bean

  (1)建立類,讓這個類作為工廠 bean,實現介面 FactoryBean

  (2)實現接口裡面的方法,在實現的方法中定義返回的 bean 型別

public class MyBean implements FactoryBean<Course>{

    
//定義返回的bean @Override public Course getObject() throws Exception {  //返回值型別可以自行選擇 Course course = new Course(); course.setCname("abc"); return course; } @Override public Class<?> getObjectType() { return null; } @Override public boolean
isSingleton() { return false; } }

  

  (3)從ApplicationContext物件getBean方法時傳入的class型別必須為你設定的型別

 public void testCollection3(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean3.xml");
        Course course = context.getBean("myBean", Course.class
); System.out.println(course); }

  

3. 關於建立Bean時為單例項物件還是多例項物件 

  (1)在Spring中預設情況下,Bean為單例物件 ,即同一個bean只有一個例項

  (2)設定單例項還是多例項 

    ①在 spring 配置檔案 bean 標籤裡面有屬性(scope)用於設定單例項還是多例項

    ②scope 屬性值

        第一個值 預設值,singleton,表示是單例項物件         第二個值 prototype,表示是多例項物件         預設情況下,Bean為單例物件 ,即同一個bean只有一個例項

    ③singleton 和 prototype 區別

      第一 singleton 單例項,prototype 多例項       第二 設定 scope 值是 singleton 時候,載入 spring 配置檔案時候就會建立單例項物件       設定 scope 值是 prototype 時候,不是在載入 spring 配置檔案時候建立 物件,在呼叫           getBean 方法時候建立多例項物件
<!--
        scope:設該bean是單例項還是多例項
              singleton:預設引數 是單例項物件 ,在載入spring配置檔案時就會建立單例物件
              prototype:    是多例項物件     在呼叫getBean方法時建立物件
    -->
    <bean id="book" class="com.jianghao.collectiontype.Book" scope="prototype">
        <property name="list" ref="booklist"></property>
    </bean>

  

4.Bean的生命週期

  一般的Bean生命週期  (共五步):

(1)通過構造器建立 bean 例項(無引數構造) (2)為 bean 的屬性設定值和對其他 bean 引用(呼叫 set 方法) (3)呼叫 bean 的初始化的方法(需要進行配置初始化的方法) (4)bean 可以使用了(物件獲取到了) (5)當容器關閉時候,呼叫 bean 的銷燬的方法(需要進行配置銷燬的方法)
public class Orders {
    private String oname;

    public Orders() {
        System.out.println("第一步 執行無參構造器建立bean例項");
    }

    public void setOname(String oname) {
        this.oname = oname;
        System.out.println("第二步 呼叫set方法設定屬性值");
    }

    //建立執行的初始化方法
    public void initMethod(){
        System.out.println("第三步 執行初始化方法");
    }
    //建立執行的銷燬方法
    public void destroyMethod(){
        System.out.println("第五步 執行銷燬方法");
    }
}

  設定初始化方法,以及銷燬方法

<!--
    init-method屬性 :設定初始化方法
    destroy-method屬性:設定銷燬方法
    -->
    <bean id="orders" class="com.jianghao.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
        <property name="oname" value="手機"></property>
    </bean>

新增後置處理器的Bean生命週期 (共有七步)

(1)通過構造器建立 bean 例項(無引數構造) (2)為 bean 的屬性設定值和對其他 bean 引用(呼叫 set 方法) (3)把 bean 例項傳遞 bean 後置處理器的方法 postProcessBeforeInitialization (4)呼叫 bean 的初始化的方法(需要進行配置初始化的方法)(5)把 bean 例項傳遞 bean 後置處理器的方法 postProcessAfterInitialization (6)bean 可以使用了(物件獲取到了) (7)當容器關閉時候,呼叫 bean 的銷燬的方法(需要進行配置銷燬的方法)

   新增後置處理器

    (1)建立類,實現介面 BeanPostProcessor,建立後置處理器

public class MyBeanPost implements BeanPostProcessor {
    @Override
    public  Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("在初始化之前執行的方法");
        return bean;
    }

    @Override
    public  Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("在初始化之後執行的方法");
        return bean;
    }
}

    (2)配置核心配置檔案

<!--
        配置後置處理器:
            實現BeanPostProcessor介面後spring會自動識別為後置處理器
            會對所有bean新增後置處理器中的兩個方法
    -->
    <bean id="myBeanPost" class="com.jianghao.bean.MyBeanPost"></bean>

5.自動裝配

  (1)什麼是自動裝配:

      根據指定裝配規則(屬性名稱或者屬性型別),Spring 自動將匹配的屬性值進行注入

  (2)怎樣實現自動裝配

      ①根據屬性名注入:在xml檔案中尋找id名與自身屬性相同的Bean進行注入

 <!--實現自動裝配
        autowire屬性配置自動裝配
            byName根據屬性名注入:  注入值bean的id值和類的屬性名一致
            byType根據屬性型別注入: 注入的型別不能有兩個bean
    -->
    <bean id="emp" class="com.jianghao.autowire.Emp" autowire="byName">
        <!--<property name="dept" ref="dept"></property>-->

    </bean>
    <bean id="dept" class="com.jianghao.autowire.Dept"></bean>

      ②根據屬性型別注入:會根據屬性的全類名查詢Bean,但是不能同時全類名相同的兩個Bean

  <bean id="emp" class="com.jianghao.autowire.Emp" autowire="byType"></bean>
    <bean id="dept" class="com.jianghao.autowire.Dept"></bean>
    <!--<bean id="dept1" class="com.jianghao.autowire.Dept"></bean>-->

6.配置外部屬性檔案(如配置資料庫資訊)

  (1)直接配置連線池

 <!--直接配置連線池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
        <property name="username" value="root"></property>
        <property name="password" value="20010111"></property>
    </bean>

  

  (2)引入外部屬性檔案配置資料庫連線池

    ① 建立外部屬性檔案,properties 格式檔案,寫資料庫資訊

    

    ②把外部 properties 屬性檔案引入到 spring 配置檔案中

      引入context名稱空間

    
<
beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" 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/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    

    ③在 spring 配置檔案使用標籤引入外部屬性檔案
 <!--引入外部屬性檔案-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--配置連線池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${prop.driverName}"></property>
        <property name="url" value="${prop.url}"></property>
        <property name="username" value="${prop.userName}"></property>
        <property name="password" value="${prop.password}"></property>
    </bean>