Spring IOC容器-Bean管理——基於XML方式(續集)

Spring IOC容器-Bean管理——基於XML(續集)

1、IOC 操作 Bean 管理(FactoryBean)

​ 1、Spring 有兩種類型 bean,一種普通 bean,另外一種工廠 bean(FactoryBean)

​ 2、普通 bean:在配置文件中定義 bean 類型就是返回類型

​ 3、工廠 bean:在配置文件定義 bean 類型可以和返回類型不一樣 第一步 創建類,讓這個類作爲工廠 bean,實現接口 FactoryBean 第二步 實現接口裏面的方法,在實現的方法中定義返回的 bean 類型

public class MyBean implements FactoryBean<Course> {

    //定義返回bean
    @Override
    public Course getObject() throws Exception {
        Course course = new Course();
        course.setCname("abc");
        return course;
    }
}
<bean id="myBean" class="com.atguigu.spring5.factorybean.MyBean">
</bean>
@Test
public void test3() {
 ApplicationContext context =
 new ClassPathXmlApplicationContext("bean3.xml");
 Course course = context.getBean("myBean", Course.class);//返回值類型可以不是定義的bean類型!
 System.out.println(course);
}

2、IOC 操作 Bean 管理(bean 作用域)

​ 在 Spring 裏面,默認情況下,bean 是單實例對象,下面進行作用域設置:

(1)在 spring 配置文件 bean 標籤裏面有屬性(scope)用於設置單實例還是多實例

(2)scope 屬性值 第一個值 默認值,singleton,表示是單實例對象 第二個值 prototype,表示是多實例對象

<bean id="book" class="com.atguigu.spring5.collectiontype.Book" scope="prototype"><!--設置爲多實例-->
        <property name="list" ref="bookList"></property>
</bean>

(3)singleton 和 prototype 區別

​ a)singleton 單實例,prototype 多實例

​ b)設置 scope 值是 singleton 時候,加載 spring 配置文件時候就會創建單實例對象 ;設置 scope 值是 prototype 時候,不是在加載 spring 配置文件時候創建對象,在調用 getBean 方法時候創建多實例對象

3、IOC 操作 Bean 管理(bean 生命週期)

1、生命週期 :從對象創建到對象銷燬的過程

2、bean 生命週期

​ (1)通過構造器創建 bean 實例(無參數構造)

​ (2)爲 bean 的屬性設置值和對其他 bean 引用(調用 set 方法)

​ (3)調用 bean 的初始化的方法(需要進行配置初始化的方法)

​ (4)bean 可以使用了(對象獲取到了)

​ (5)當容器關閉時候,調用 bean 的銷燬的方法(需要進行配置銷燬的方法)

3、演示 bean 生命週期 :

        public class Orders {
         //無參數構造
         public Orders() {
         System.out.println("第一步 執行無參數構造創建 bean 實例");
         }
         private String oname;
         public void setOname(String oname) {
         this.oname = oname;
         System.out.println("第二步 調用 set 方法設置屬性值");
         }
         //創建執行的初始化的方法
         public void initMethod() {
         System.out.println("第三步 執行初始化的方法");
         }
         //創建執行的銷燬的方法
         public void destroyMethod() {
         System.out.println("第五步 執行銷燬的方法");
         }
        }

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;
    }
}
<!--配置文件的bean參數配置-->
<bean id="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">	<!--配置初始化方法和銷燬方法-->
    <property name="oname" value="手機"></property><!--這裏就是通過set方式(注入屬性)賦值-->
</bean>

<!--配置後置處理器-->
<bean id="myBeanPost" class="com.atguigu.spring5.bean.MyBeanPost"></bean>
 @Test
 public void testBean3() {
// ApplicationContext context =
// new ClassPathXmlApplicationContext("bean4.xml");
 ClassPathXmlApplicationContext context =
 new ClassPathXmlApplicationContext("bean4.xml");
 Orders orders = context.getBean("orders", Orders.class);
 System.out.println("第四步 獲取創建 bean 實例對象");
 System.out.println(orders);
 //手動讓 bean 實例銷燬
 context.close();
 }

4、bean 的後置處理器,bean 生命週期有七步 (正常生命週期爲五步,而配置後置處理器後爲七步)

​ (1)通過構造器創建 bean 實例(無參數構造)

​ (2)爲 bean 的屬性設置值和對其他 bean 引用(調用 set 方法)

(3)把 bean 實例傳遞 bean 後置處理器的方法 postProcessBeforeInitialization

​ (4)調用 bean 的初始化的方法(需要進行配置初始化的方法)

(5)把 bean 實例傳遞 bean 後置處理器的方法 postProcessAfterInitialization

​ (6)bean 可以使用了(對象獲取到了)

​ (7)當容器關閉時候,調用 bean 的銷燬的方法(需要進行配置銷燬的方法)


4、IOC 操作 Bean 管理(外部屬性文件)

方式一:直接配置數據庫信息 :(1)配置Druid(德魯伊)連接池 (2)引入Druid(德魯伊)連接池依賴 jar 包

<!--直接配置連接池-->
    <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/userDb"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>

方式二:引入外部屬性文件配置數據庫連接池

(1)創建外部屬性文件,properties 格式文件,寫數據庫信息(jdbc.properties

    prop.driverClass=com.mysql.jdbc.Driver
    prop.url=jdbc:mysql://localhost:3306/userDb
    prop.userName=root
    prop.password=root

(2)把外部 properties 屬性文件引入到 spring 配置文件中 —— 引入 context 名稱空間

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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"><!--引入context名稱空間-->
    
        <!--引入外部屬性文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--配置連接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${prop.driverClass}"></property>
        <property name="url" value="${prop.url}"></property>
        <property name="username" value="${prop.userName}"></property>
        <property name="password" value="${prop.password}"></property>
    </bean>
    
</beans>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章