1. 程式人生 > >讀書筆記之Spring實戰

讀書筆記之Spring實戰

《Spring實戰(第3版)》

第1章

(個人覺得可以忽略)

第2章 裝配Bean 1、宣告Bean 1)使用一個或多個XML檔案作為配置檔案; 普通spring配置檔案模板:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

</beans>
除了beanss名稱空間外,spring的核心框架自帶了10個名稱空間配置(aop/bean/context/jee/jms/lang/mvc/oxm/tx/util),和Spinrg Portfolio的其他名稱空間。
<bean id="duke" class="com.springinaction.springidol.Juhhler"/>
所有spring bean預設都是單利,當容器分配一個bean時(無論是通過裝配或呼叫容器的getBean()方法),他總返回同一個例項。但是當我們需要每次請求都新建立一個例項時,需要配置bean的scope屬性為prototype。 初始化和銷燬bean:方法1)使用init-method和destory-method引數配置bean元素;方法2)讓bean實現InitializingBean,DisposableBean介面。 2)提供基於java註解的配置方式; 2、構造器注入和Setter方法注入 3、裝配Bean 4、控制Bean的建立和銷燬 使用<property>元素配置bean屬性,呼叫屬性的setter方法注入值。(注入簡單值<property name="" value=""/> 引入其他bean<property name="" ref=""/> 注入內部bean<property name="" ><bean class="..."/></property>) 使用p標籤裝配屬性(引入xmlns:p="http://www.springframework.org/schema/p"),例如:
<bean id="northMan" class="com.wangxinxin.entity.NorthMan" p:a="testA" p:sonnet29-ref="sonnet29" />
-ref字尾作為一個標誌來告知裝配一個引用而不是字面量。
<!-- 裝配List、Set和Array Map -->
 <bean id="colloection1" class="com.wangxinxin.entity.Colloection1">
  <property name="northMans">
   <list>
    <ref bean="northMan"/>
    <ref bean="northMan2"/>
   </list>
  </property>
  <property name="set1">
   <set>
    <ref bean="northMan"/>
    <ref bean="northMan2"/>
   </set>
  </property>
  <property name="map1">
   <map>
    <entry key="no1" value-ref="northMan"/>
    <entry key="no2" value-ref="northMan2"/>
   </map>
  </property>
  <!-- map的key和value都是string時優先使用properties -->
  <property name="map2">
   <props>
    <prop key="no1">111111111</prop>
    <prop key="no2">222222222</prop>
   </props>
  </property>
 </bean>
<property>元素用於把值或Bean引用注入到Bean的屬性中; <props>元素用於定義一個java.util.Properties型別的集合值; <prop>元素用於定義<props>集合的一個成員。 通常預設屬性值為null,但是有些屬性預設不是null,這時我們需要顯式設定null值 <property name="test"><null/></property> 使用SpEL表示式裝配:#{} 1)可以存放基本資料型別;2)存放其他bean的id,或者bean的屬性或方法。(<property name="test1" value="#{class1.getA()?.toUpperCase()}"/>);3)操作類T{}(<property name="test2" value="#T(java.lang.Math).PI"/>);4)表示式;5)訪問集合成員;6)查詢集合成員(.?[] .^[] .$[]);
EQ 就是 EQUAL等於
NQ 就是 NOT EQUAL不等於 
GT 就是 GREATER THAN大於  
LT 就是 LESS THAN小於 
GE 就是 GREATER THAN OR EQUAL 大於等於 
LE 就是 LESS THAN OR EQUAL 小於等於

第3章 最小化spring xml配置 1、bean的自動裝配; 2、bean的自動檢測; 1)4種類型的自動裝配(byName/byType/constructor/autodetect) eg: <bean id="test" class="..." autowire="byName"></bean> 為屬性自動裝配ID與該屬性的名字相同的Bean。 <bean id="test" class="..." autowire="byType"></bean> 為屬性自動裝配ID與該屬性的型別相同的Bean。存在多個則報異常。可以通過標誌一個首選bean或取消某個bean的候選資格(排除首選primary的true/false,預設true;排除bean autowire-candidate="fasle")。 <bean id="test" class="..." autowire="constructor"></bean> constructor自動裝配 <bean id="test" class="..." autowire="autodetect"></bean> 最佳自動裝配 <beans ..... default-autowire="byType"></beans> 全域性預設自動裝配 可以混合使用自動裝配和顯式裝配。 3、面向註解的bean裝配; 容器預設禁用註解裝配。 <context:annotation-config /> 支援3種不同的註解(spring自帶的@Autowired註解;JSR-330的@Inject註解;JSR-250的@Resource註解) @Autowired可以標註set方法、構造器、屬性變數,其中屬性不一定要裝配,null值也是可以接受的。(@Autowire(required=fasle),預設true);存在多個相同bean時,@Autowire @Qualifier("class1")
/**
 * Spring自定義限定器
 * @author huawangxin
 * 2017年8月6日 上午11:11:30
 */
@Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface StringedInstrument {
}
藉助@Inject實現基於標準的自動裝配。和@Autowire用法一樣,但沒有required屬性。@Named類似於@Qualifier用法。 JSR-330的Provider介面可以實現Bean引用的延遲注入以及注入Bean的多個例項功能。JSR-330不建議使用javax.inject的@Qualifier,建議建立自定義的限定器註解。
/**
 * JSR-330自定義限定器
 * @author huawangxin
 * 2017年8月6日 下午1:09:38
 */
@Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface StringedInstrument2 {
}
在註解注入中使用表示式(@Value("112"),也可以是SpEL表示式) 自動檢測Bean:
<context:component-scan base-package="com.wangxinxin.entity">
     <context:include-filter type="assignable" expression="com.wangxinxin.entity.Jugger"/>
     <context:exclude-filter type="annotation" expression="com.wangxinxin.util.StringedInstrument2"/>
    </context:component-scan>
為自動檢測標註Bean:@Component-通用構造型註解;@Controller-標記該類定義為SpringMVC controller;@Repository標記該類為資料倉庫;@Service-標記該類為服務。 過濾器型別(annotation/assignable/aspectj/custom/regex) 4、基於java的spring配置; 除了載入自動註解的bean,還回自動載入使用@Configuration註解所標註的類。 @Configuration註解的類等價於<beans>元素
/**
 * 配置類
 * @author huawangxin
 * 2017年8月6日 下午1:51:06
 */
@Configuration
public class SpringIdolConfig {
 @Bean
 public NorthMan northMan() {
  return new NorthMan();
 }
}

第4章 待續。。。。。。