Spring IoC 容器和 bean 對象



  • 程序的耦合性:

    耦合性(Coupling),又叫耦合度,是對模塊間關聯程度的度量。耦合的強弱取決於模塊間接口的復雜性、調用模塊的方式以及通過界面傳送數據的多少。模塊間的耦合度是指模塊之間的依賴關系,包括控制關系、調用關 系、數據傳遞關系。模塊間聯系越多,其耦合性越強,同時表明其獨立性越差( 降低耦合性,可以提高其獨立 性)。

  • I o C容器

    IoCInversion of Control的縮寫,即控制反轉的意思,是解決程序耦合性的一種思想。通常創建對象的時候使用new關鍵字,控制權由程序員控制,而"控制反轉"是指new實例工作不由程序員來做而是交給Spring容器來做。解決程序耦合性的辦法有很多,而依賴注入(DI)這一功能就是IOC思想的一種具體實現

  • Spring pom.xml配置:

    <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.2.0.RELEASE</version>
            </dependency>
    </dependencies>
    
  • Spring 項目結構依賴:

  • Spring bean.xml的配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
        
    	//id 是自己定義的一個名字,相當於取一個別名 ,class是需要訪問實現類的全限定類名
        <bean id="daoService" class="com.Test.Dao.DaoServiceImpl"></bean>
    	<bean id="userService" class="com.Test.Service.UserServiceImpl"></bean>
    </beans>
    
  • 入門案例:

    import com.Test.Dao.DaoService;
    import com.Test.Service.UserService;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MyTest {
    
        public static void main(String[] args){
    
            ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
            //daoService,userService就是之前bean.xml文件里的id
            DaoService dao = (DaoService)context.getBean("daoService");
            UserService user = (UserService)context.getBean("userService");
    
            System.out.println(dao);
            System.out.println(user);
    
        }
    }
    

    Application Context 是 spring 中較高級的容器,它采用立即加載的策略。而BeanFactory 是采用延遲加載的策略,但是也可以加載配置文件中定義的 bean,將所有的 bean 集中在一起,當有請求的時候分配 bean。ApplicationContext 包含 BeanFactory 所有的功能,一般情況下,相對於 BeanFactoryApplicationContext 會更加優秀。

  • ApplicationContext的三個實現類:

    1.ClassXmlPathApplicationContext:加載類路徑下的配置文件,不需要提供 XML 文件 的完整路徑,只需正確配置 CLASSPATH 環境變量即可,因為,容器會從CLASSPATH 中搜索 bean 配置文件。

    2.FileSystemXmlApplicationContext:加載磁盤任意路徑下的配置文件。

    3.AnnotationConfingApplictionContext:用於讀取注解創建容器。


  • 創建bean的三種方式:

    1.使用默認構造函數創建:

     <bean id="daoService" class="com.Test.Dao.DaoServiceImpl"></bean>
    

    2.(使用別人創建好的類時)使用普通工廠中的方法創建對象(或使用某個類中的方法創建對象):

    import com.Test.Service.UserService;
    import com.Test.Service.UserServiceImpl;
    
    public class InstanceFactory {
        public UserService getUserService(){
            return new UserServiceImpl();
        }
    }
    

    bean配置:

    <bean id="userService" factory-bean="instanceFactory" factory-method="getUserService">
    

    3.使用工廠中的靜態方法創建bean對象:

    import com.Test.Service.UserService;
    import com.Test.Service.UserServiceImpl;
    
    public class InstanceFactory {
        public static UserService getUserService(){
            return new UserServiceImpl();
        }
    }
    
    <bean id="userService" class="com.Test.Factory.StaticInstanceFactory" factory-method="getUserService"></bean>
    
  • bean的作用域:

當在 Spring 中定義一個 bean 時,你必須聲明該 bean 的作用域的選項。例如,為了強制 Spring 在每次需要時都產生一個新的 bean 實例,你應該聲明 bean 的作用域的屬性為 prototype。同理,如果你想讓 Spring 在每次需要時都返回同一個bean實例,你應該聲明 bean 的作用域的屬性為 singleton

Spring 框架支持以下五個作用域,分別為singleton、prototype、request、session和global session,5種作用域說明如下所示,

注意,如果你使用 web-aware ApplicationContext 時,其中三個是可用的。

作用域 描述
singleton 在spring IoC容器僅存在一個Bean實例,Bean以單例方式存在,默認值
prototype 每次從容器中調用Bean時,都返回一個新的實例,即每次調用getBean()時,相當於執行newXxxBean()
request 每次HTTP請求都會創建一個新的Bean,該作用域僅適用於WebApplicationContext環境
session 同一個HTTP Session共享一個Bean,不同Session使用不同的Bean,僅適用於WebApplicationContext環境
global-session 一般用於Portlet應用環境,該運用域僅適用於WebApplicationContext環境

singleton 作用域:

singleton 是默認的作用域,也就是說,當定義 Bean 時,如果沒有指定作用域配置項,則 Bean 的作用域被默認為 singleton。

當一個bean的作用域為Singleton,那么Spring IoC容器中只會存在一個共享的bean實例,並且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。

也就是說,當將一個bean定義設置為singleton作用域的時候,Spring IoC容器只會創建該bean定義的唯一實例。

Singleton是單例類型,就是在創建起容器時就同時自動創建了一個bean的對象,不管你是否使用,他都存在了,每次獲取到的對象都是同一個對象。注意,Singleton作用域是Spring中的缺省作用域。你可以在 bean 的配置文件中設置作用域的屬性為 singleton,如下所示:

<!-- A bean definition with singleton scope -->
<bean id="..." class="..." scope="singleton">
    <!-- collaborators and configuration for this bean go here -->
</bean>

prototype 作用域

當一個bean的作用域為Prototype,表示一個bean定義對應多個對象實例。Prototype作用域的bean會導致在每次對該bean請求(將其注入到另一個bean中,或者以程序的方式調用容器的getBean()方法)時都會創建一個新的bean實例。Prototype是原型類型,它在我們創建容器的時候並沒有實例化,而是當我們獲取bean的時候才會去創建一個對象,而且我們每次獲取到的對象都不是同一個對象。根據經驗,對有狀態的bean應該使用prototype作用域,而對無狀態的bean則應該使用singleton作用域。

為了定義 prototype 作用域,你可以在 bean 的配置文件中設置作用域的屬性為 prototype,如下所示:

<!-- A bean definition with singleton scope -->
<bean id="..." class="..." scope="prototype">
   <!-- collaborators and configuration for this bean go here -->
</bean>

​ ----相關參考見w3cschool文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM