2-Spring-IOC

IOC概念

IOC:Inversion of Control(控制反轉),既將對象的創建過程交由Spring的IOC容器來進行管理,從而做到解耦合的效果。

Spring的XML配置文件結構

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    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 
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd ">

    <!-- 導入hello配置文件 -->
    <import resource="hello/hello.xml"/>
    <!-- 實例化hello -->
    <bean id="hello" class="com.wzw.spring.ioc.impl.HelloImpl"></bean>
    <!-- hello別名Hello -->
    <alias name="hello" alias="Hello"/>

</beans>

Bean實例化的三種方式

1. 基於構造方法

    <!-- 基於無參構造 -->
    <bean id="user" class="com.wzw.spring.ioc.model.User"></bean>
    <!-- 基於有參構造 -->
    <bean id="user2" class="com.wzw.spring.ioc.model.User2">
        <constructor-arg name="name" value="root"></constructor-arg>
        <constructor-arg name="password" value="password"></constructor-arg>
    </bean>

2. 基於靜態工廠

靜態工廠

/**
 * 靜態工廠
 * 項目名稱:com.wzw.spring<br/>
 * 類名稱:UserStaticFactory<br/>
 * 類描述:
 * 時間 2018年4月17日 下午3:38:34
 * @author wzw
 * @version
 */
public class UserStaticFactory {

    public static User getUser(String name, String password) {
        return new User(name, password);
    }
}
    <!-- 基於靜態工廠 -->
    <bean id="user3" class="com.wzw.spring.ioc.factory.UserStaticFactory"
        factory-method="getUser">
        <constructor-arg name="name" value="root"></constructor-arg>
        <constructor-arg name="password" value="password"></constructor-arg>
    </bean>

3. 基於實例工廠

實例工廠

/**
 * 實例工廠
 * 項目名稱:com.wzw.spring<br/>
 * 類名稱:UserFactory<br/>
 * 類描述:
 * 時間 2018年4月17日 下午3:42:08
 * @author wzw
 * @version
 */
public class UserFactory {

    public User getUser(String name, String password) {
        return new User(name, password);
    }
}
    <!-- 基於實例工廠 -->
    <bean id="userfactory" class="com.wzw.spring.ioc.factory.UserFactory"></bean>
    <bean id="user4" factory-bean="userfactory" factory-method="getUser">
        <constructor-arg name="name" value="root"></constructor-arg>
        <constructor-arg name="password" value="password"></constructor-arg>
    </bean>

Bean命名

    <!-- id, name相同 -->
    <bean id="user5" name="user6" class="com.wzw.spring.ioc.model.User">
        <constructor-arg name="name" value="root"></constructor-arg>
        <constructor-arg name="password" value="password"></constructor-arg>
    </bean>
    <!-- 無id -->
    <bean class="com.wzw.spring.ioc.model.User">
        <constructor-arg name="name" value="root"></constructor-arg>
        <constructor-arg name="password" value="password"></constructor-arg>
    </bean>
    <!-- id, 唯一 -->
    <bean id="user7" class="com.wzw.spring.ioc.model.User">
        <constructor-arg name="name" value="root"></constructor-arg>
        <constructor-arg name="password" value="password"></constructor-arg>
    </bean>
    <!-- name, 唯一 -->
    <bean name="user8" class="com.wzw.spring.ioc.model.User">
        <constructor-arg name="name" value="root"></constructor-arg>
        <constructor-arg name="password" value="password"></constructor-arg>
    </bean>
    <!-- 多name -->
    <bean name="user9,user10;user11" class="com.wzw.spring.ioc.model.User">
        <constructor-arg name="name" value="root"></constructor-arg>
        <constructor-arg name="password" value="password"></constructor-arg>
    </bean>
    <!-- alias標籤 -->
    <alias name="user7" alias="user12"/>

測試類

    /**
     * Bean命名測試
     * @return void
     * 時間:2018年4月17日
     */
    @Test
    public void fun2() {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        String[] aliases = context.getAliases("user9");
        System.out.println(aliases.length);
        for (String string : aliases) {
            System.out.println(string);
        }
        User bean = (User) context.getBean("user9");
        System.out.println(bean);
    }

IOC容器實例化方式(Spring讀取配置文件的方式)

在Spring Ioc容器的代表就是org.springframework.beans包中的BeanFactory接口,BeanFactory接口提供了IoC容器最基本功能;而org.springframework.context包下的ApplicationContext接口擴展了BeanFactory,還提供了與Spring AOP集成、國際化處理、事件傳播及提供不同層次的context實現 (如針對web應用的WebApplicationContext)。簡單說, BeanFactory提供了IoC容器最基本功能,而 ApplicationContext 則增加了更多支持企業級功能支持。ApplicationContext完全繼承BeanFactory,因而BeanFactory所具有的語義也適用於ApplicationContext。
容器實現一覽:
• XmlBeanFactory:BeanFactory實現,提供基本的IoC容器功能,可以從classpath或文件系統等獲取資源;
(1) File file = new File(“fileSystemConfig.xml”);
Resource resource = new FileSystemResource(file);
BeanFactory beanFactory = new XmlBeanFactory(resource);
(2)
Resource resource = new ClassPathResource(“classpath.xml”); BeanFactory beanFactory = new XmlBeanFactory(resource);
• ClassPathXmlApplicationContext:ApplicationContext實現,從classpath獲取配置文件;
BeanFactory beanFactory =
new ClassPathXmlApplicationContext(“classpath.xml”);
• FileSystemXmlApplicationContext:ApplicationContext實現,從文件系統獲取配置文件。
BeanFactory beanFactory =
new FileSystemXmlApplicationContext(“fileSystemConfig.xml”);

發佈了44 篇原創文章 · 獲贊 42 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章