深入ssm框架1--bean與spring容器( spring管理bean 注冊+裝配 )


@參考網絡 僅為學習筆記

深入ssm框架1--bean與spring容器(  spring管理bean 注冊+裝配  )

Bean配置信息定義了Bean的實現及依賴關系,Spring容器根據各種形式的Bean配置信息在容器內部建立Bean定義注冊表,然后根據注冊表加載、實例化Bean,並建立Bean和Bean的依賴關系,最后將這些准備就緒的Bean放到Bean緩存池中,以供外層的應用程序進行調用

(1)spring容器會根據含有Bean配置的XML文件(spring.xml),把配置文件的Bean配置信息與spring容器中Bean定義注冊表相對應起來;

(2)spring容器根據Bean注冊表實例化Bean;

(3)通過Bean的實現類,把實例化過的Bean放到spring容器中的Bean緩存池中;

(4)某個模塊要是使用的話,通過注解或者xml配置,讓spring把Bean緩存池中的實例Bean注入到該模塊當中;

1ApplicationContext.getBean(“id”);  Context = new 2ClassPathXmlApplicationContext(“配置文件xml”);

1接口讀取配置文件 管理對象的加載生成維護bean對象之間的依賴關系負責bean的生命周期

2接口實現類 從classpath路徑中讀取配置文件 除此之外還有其它實現類fileSystemXmlApplicationContext  applicationContext其實是建立在beanFactory基礎上的 beanFactory接口是spring ioc的核心 負責管理組件和它們之間的依賴關系 用用程序通過beanfactory 接口與ioc容器交互 applicationContext是beanFactory的子接口

1 Spring管理Bean兩個部分  注冊  1自動  2JavaConfig   3XML裝配Bean  1依賴  2注解

Spring容器啟動的三大要件分別是 bean定義信息 實現類 spring本身

xml配置

xml配置

<beans>默認命名空間

 xsi命名空間

自動注解  引入context命名空間

spring命名aop的命名空間 是用戶自定義的

 

用於為每個文檔中命名空間指定響應的schema

樣式文件是標准組織定義的標准命名空間  1指定名稱

2指定空間的schema文檔樣式文件的位置

用空格或回車換行進行分隔

 

<bean id="" class=""> 默認命名空間配置

定義對象信息與類信息是分離的

設值注入 而非直接為屬性賦值  

通過調用bean的setter方法實現

<?xml version=”1.0” encoding=”utf-8”?> xml聲明 讀取文檔字符集

<beans xmlns=”默認命名空間http://www.springframework.org/schema/beans

xmlns:xsi=”xsi標准命名空間指定自定義的scheme文件http://www.w3.org/2002/XMLSchema-instance

xmlns:context=“http://www.springframework.org/schema/context”//自動注解  引入context命名空間

xmlns:aop=”命名空間全稱必須在xsi命名空間為其指定空間對應scheme文件http://www.springframework.org/schema/aop

xsi:schemaLocation=” http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

http://www.springframework.org/schema/context/spring-context-3.0.xsd”    >

 

 <bean id="userDao" class="com.baobaotao.anno.UserDao"/>  <bean id="logDao" class="com.baobaotao.anno.LogDao"/>

 <bean id="logService" class="com.baobaotao.conf.LogonService"

        p:logDao-ref="logDao" p:userDao-ref="userDao"/>  

<aop:config><aop:  ></aop:config> aop命名空間配置

采用xml方式定義信息與實現類是分離的     基於注解的配置方式時bean定義信息即通過在bean實現類上標注注解實現

使用注解配置信息啟動spring容器            spring提供了一個context的命名空間 提供了通過掃描類以應用注解定義bean的方式   注解生效  xml配置顯示指定  xml配置文件中使用context/////重寫spring容器的context

自動配置

Component  == Repository+Service+Controller 

特殊注解 用途更清晰化 

@AutoWired注解去裝配Bean

(所謂裝配,就是管理對象直接的協作關系)

類上注解定義

bean定義信息通過bean實現類上標注注解實現 

context

這樣此類對象只有一個???

<context:component-scan base-package=”com.baobaotao.anno”  resource_pattern=””/>

掃描類包以用用注解定義的bean

<bean class=”com.baobaotao.anno.LogonService”></beans>???

<context:include-filter type=”regex” expression=”com\.baobaotao\anno.*Service”/>

<context:exclude-filter type=”aspectj” expression=”com\.baobaotao..*Controller+”/>

import org.springframework.stereotype.Component/Repository;

@Component("userDao")public class UserDao {} //①通過Repository定義一個DAO的Bean

java config 

普通pojo類標注@Configuration  spring容器如何配置

(怎么去注冊bean,怎么去處理bean之間的關系=裝配)

類的方法可以標注bean注解 類型由方法返回值類型確定

名稱默認同方法名

也可以通過入參顯示指定的bean名稱 @Bean(name=””)

@Bean意思,獲取此bean時,spring按照此方式去幫獲取

 在方法上,告訴Spring容器可以從下面這個方法中拿到一個Bean

每個標注了@bean的類方法都相當於提供了一個bean的定義信息  

 import org.springframework.context.annotation.Bean/ Configuration;

@Configuration  //①將一個POJO標注為定義Bean的配置類

public class AppConf {    //②以下兩個方法定義了兩個Bean,以提供了Bean的實例化邏輯

    @Bean    public UserDao userDao(){       return new UserDao();        }

    @Bean    public LogDao logDao(){        return new LogDao();    } //③定義了logonService的Bean

    @Bean    public LogonService logonService(){

        LogonService logonService = new LogonService();    //④將②和③處定義的Bean注入到LogonService Bean中

        logonService.setLogDao(logDao());  logonService.setUserDao(userDao());      return logonService;   }}

  

 傳統的spring時xml配置的,Javaconfig 是指基於java配置的spring   spring3.0新增了許多Java config的注解 特別是springboot   

1@configuration配置類 注解該類 等價於xml配置beans 用@bean等價於xml中配置bean 被注解的類內部包含一個或多個被@bean注解的

2注解@Autowried @Qualifier(“beanid”)/直接引用;  /@Resource() private 類 beanid

3通過bean元素聲明需要spring創建的實例 類型通過class屬性指定 並通過id屬性為該實例指定一個名稱Property為屬性賦值 bean引用可以用內部bean方式注入

基於java類的配置方式和基於xml或基於注解的配置方式相比 前置通過代碼的方式更加靈活的實現了bean的實例化及bean之間的裝配 但后面兩者都是通過配置聲明的當時 在靈活性上要稍遜一些但是配

裝配

依賴注入

  屬性注入setXxx()可選擇性和靈活性高的優點 最常用 要求bean有默認構造函數 反射方式注入<property name=”” ref=””></property>   <property name=””><value>…</value></property>

  構造函數注入  bean提供帶參構造函數<constructor ref=””></>

  工廠方式注入  非靜態工廠方法   <!-- 工廠方法-->  <bean id="carFactory" class="...CarFactory" /> <bean id="car5" factory-bean="carFactory" factory-method="createHongQiCar"> </bean>

             很多工程類都是靜態的   意味着用戶無須創建工廠類實例的情況下就可以調用工廠類方法 調用更加方便<bean id="car6" class="...CarFactory"  factory-method="createCar"></bean>

注解注入

注解注入  Autowired   默認按類型匹配,在容器查找匹配Bean,當有且僅有一個匹配的Bean時,將其注入

required即使找不到匹配的Bean也不用拋出異常,使用@Autowired(required=false)進行標注:  Qualifier限定注入bean名稱    @Autowired  @Qualifier("userDao")  private UserDao userDao;

  對類成員變量及方法的入參進行標注 public void init(@Qualifier("userDao")UserDao userDao,LogDao logDao){

Spring還支持@Resource名稱匹配也可屬性方法 和@Inject注解(無required) 

 

參考:  https://www.cnblogs.com/bossen/p/5824067.html

 Bean與spring容器關系  https://www.cnblogs.com/rainwang/p/7568238.html

 

詞組解釋:

javabean   JavaBean 是一種JAVA語言寫成的可重用組件。為寫成JavaBean,類必須是具體的和公共的,並且具有無參數的構造器。JavaBean 通過提供符合一致性設計模式的公共方法將內部域暴露成員屬性,set和get方法獲取  屬性名稱符合這種模式,其他Java 類可以通過自省機制(反射機制)發現和操作這些JavaBean 的屬性。

pojo 簡單的Java對象,實際就是普通JavaBeans 

pojo=普通Java類,具有一部分getter/setter方法的那種類就可以稱作POJO,它不包含業務邏輯或持久邏輯

但是JavaBean則比 POJO復雜很多, Java Bean 是可復用的組件,對 Java Bean 並沒有嚴格的規范.

 

 

xsi   web.xml遵守xml規范 與dtd類似   

schema  對文檔的限制   schemaLocation用於聲明了目標名稱空間的模式文檔

命名空間:schemaLocation用於聲明了目標名稱空間的模式文檔

命名 空間是用來組織和重用代碼的。如同名字一樣的意思,NameSpace(名字空間),之所以出來這樣一個東西,是因為人類可用的單詞數太少,並且不同的人寫的程序不可能所有的變量都沒有重名現象,對於庫來說,這個問題尤其嚴重,如果兩個人寫的庫文件中出現同名的變量或函數(不可避免),使用起來就有問題了。為了解決這個問題,引入了名字空間這個概念,通過使用 namespace xxx;你所使用的庫函數或變量就是在該名字空間中定義的,這樣一來就不會引起不必要的沖突了。
通常來說,命名空間是唯一識別的一套名字,這樣當對象來自不同的地方但是名字相同的時候就不會含糊不清了。使用擴展標記語言的時候,XML的命名空間是所有元素類別和屬性的集合。元素類別和屬性的名字是可以通過唯一XML命名空間來唯一。
在XML里,任何元素類別或者屬性因此分為兩部分名字,一個是命名空間里的名字另一個是它的本地名。在XML里,命名空間通常是一個統一資源識別符(URI)的名字。而URI只當名字用。主要目的是為了避免名字的沖突。

 

 

 


免責聲明!

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



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