@參考網絡 僅為學習筆記
深入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用於聲明了目標名稱空間的模式文檔