Spring學(xué)習(xí)筆記

在配置好需要的文件后就可以進行編程學(xué)習(xí)了疾渣。共郭。
Spring基于XML文件配置Bean的方法:
在IOC容器中配置:

 <beans  ... ...>
 <bean id="helloWorld" class="com.spring.beans.HelloWorld">
 <property name="name" value="spring"></property>     //屬性注入
 <property name="sex" value="man"></property>
 <constructor-arg value="spring" ></constructor-arg> //構(gòu)造器注入
 <constructor-arg value="sex"></constructor-arg>
 <constructor-arg value="spring" index="0"></constructor-arg>  //和上例效果相同
 <constructor-arg value="sex" index="1">
 <constructor-arg value="spring" type="String"></constructor-arg>
 <constructor-arg value="sex" type="String"></constructor-arg>
 </bean>
</beans>

1.創(chuàng)建spring的IOC容器
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
2.從IOC容器中獲取Bean的實例
HelloWorld helloWorld=(HelloWorld)ctx.getBean(HelloWorld.class); //只能有一個HelloWorld類型的Bean

HelloWorld helloWorld=ctx.getBean("helloWorld");

屬性配置細節(jié)
1.當(dāng)要給變量賦值特殊符號時可用<![CDATA["賦值內(nèi)容"]]>包裹起來豪筝。
2.屬性值也可以用 value 直接點進行配置
3.可以使用property的 ref 屬性建立 bean之間的引用關(guān)系符喝。
4.內(nèi)部 Bean 不能被外部影響威沫,只能內(nèi)部使用绩卤。
5.可以使用 <null/> 標(biāo)簽為某些屬性注入 null 值
6.使用級聯(lián)屬性賦值時,必須先初始化后才可以為級聯(lián)屬性賦值土涝,當(dāng)前 Bean 內(nèi)必須有 get和set -ref對象的方法佛寿。
7.使用<list>標(biāo)簽時,若引用的 Bean 是另一個包里的同名類,則應(yīng) import 另一個包的該同名類冀泻。
8.使用 util 標(biāo)簽來配置單例的集合bean常侣,以供多個bean進行引用,需要導(dǎo)入util命名空間弹渔。
9.使用 P命名空間為 bean 的屬性賦值胳施,需要導(dǎo)入p命名空間。相對于傳統(tǒng)的方式更加簡潔肢专。
格式 : <bean id="person" class="com.spring.beans.Person" p:name="name" p:age="15" ></bean>
10.可以使用 autowire 自動裝配舞肆,有byName,byType,constructor等方式。
<bean id="person" class="com.spring.beans.autowire.Person"
autowire="byName">
</bean>
11.bean之間的關(guān)系:bean 可以繼承 (parent)博杖、依賴(depends-on)椿胯,bean的abstract屬性為true,這樣的bean不能被IOC容器實例化剃根,只用來被繼承配置
不會繼承 bean 的所有屬性哩盲,例如:autowire、abstract……若某一個bean的 class 屬性沒有指定狈醉,則該 bean 必須是一個抽象 bean廉油。
depends-on 屬性會將 前置依賴的Bean在本Bean實例化之前創(chuàng)建好。如果依賴于多個Bean苗傅,則可以通過 逗號抒线、空格 配置Bean的名稱。
12.Bean的作用域 : 可以用 scope 屬性配置渣慕。 singleton 是默認(rèn)值十兢,容器初始時創(chuàng)建實例,在整個容器生命周期內(nèi)至創(chuàng)建這一個 bean摇庙。 prototype 是原型的旱物,容器初始化時不創(chuàng)建 bean 的實例,而是在每次請求時創(chuàng)建新的 bean實例并返回卫袒。
13.可以使用外部屬性文件配置Bean宵呛。<context:property-placeholder location="classpath: db.source" /> <property name="user" value="${user}">.
14.SpEL : 可以使用 SpEL 來給 Bean 配置 。
(1) 當(dāng)要給 字符串類型賦值時 : value="#{'abc'}"
(2) 當(dāng)賦 整型夕凝、浮點型時 : value="#{14}" value="#{123.321}"
(3) 當(dāng)引用其他 屬性時 : value="#{car}" value="#{car.price}"
(4) 當(dāng)引用類的靜態(tài)屬性時: value="#{T(java.lang.Math).PI*8}"
(5) 當(dāng)使用運算符時: value="#{ 10>5? '大于' : '小于' }"

  1. 可以自行設(shè)置 Bean 的 init()方法 和 destroy() 方法宝穗。 先在 Bean Class 里將init()和destroy()方法寫好,名字自訂码秉,然后在xml文件里配置逮矛。
    例:

    <bean id="person" class="com.spring.beans.Person" init-method="init3" destroy-method="destroy"></bean>
    

16.可以添加 Bean后置處理器。通過寫一個 BeanPostProcessor 接口類转砖,然后在里面重寫 postProcessAfterInitialization(init后執(zhí)行)和postProcessBeforeInitialization(init前執(zhí)行) 方法须鼎,并在xml文件里配置鲸伴。
例:

 <bean class="com.spring.beans.MyBeanPostProcessor"></bean>

17.可以使用靜態(tài)工廠方法配置bean:先創(chuàng)建一個靜態(tài)工廠方法類,例:

public class StaticGameFactory {
private static Map<String,Game> games=new HashMap<String,Game>();
static{
    games.put("ChiJi", new Game("ChiJi",98));
    games.put("H1Z1", new Game("H1Z1",68.0));
}
//靜態(tài)工廠方法
public static Game getGame(String name){
    return games.get(name);

然后在xml文件里通過靜態(tài)工廠方法來配置bean晋控。
例:

  <bean id="game" class="com.spring.beans.factory.Game" factory-method="getGame">
<constructor-arg value="cf"></constructor-arg></bean>    //如果工廠方法需要傳入?yún)?shù)汞窗,則使用constructor-arg來配置參數(shù)

18.也可以使用實例工廠方法配置bean:

public class InstanceGameFactory {
private Map<String,Game> games;
public InstanceGameFactory(){
    games=new HashMap<String,Game>();
    games.put("CF", new Game("CF",0));
    games.put("dnf", new Game("dnf",1));
}
public Game getGame(String name){
    return games.get(name);
}

需要先配置工廠的實例:

<bean id="gameFactory" class="com.spring.beans.factory.InstanceGameFactory"></bean>

然后再配置 bean 實例: //factory-bean 指向?qū)嵗S方法的bean factory-method指向?qū)嵗S方法的名字; 如果工廠方法需要傳入?yún)?shù),則使用constructor-arg來配置參數(shù)

<bean id="game2" factory-bean="gameFactory" factory-method="getGame"><constructor-arg value="CF"></constructor-arg></bean>

19.通過FactoryBean 來配置 bean赡译。 首先自定義FactoryBean,需要實現(xiàn)FactoryBean 接口仲吏,然后在xml文件里 通過 FactoryBean 來配置Bean的實例,例:
class:指向FactoryBean的全類名蝌焚;property:配置FactoryBean的屬性裹唆; 實際返回的是 FactoryBean 的 getObejct() 方法的實例

<bean id="game" class="com.spring.beans.factorybeans.GameFactoryBean">
    <property name="name" value="qwe"></property>
</bean>

20.通過注解配置Bean

<!-- 指定Spring IOC 容器掃描的包 -->
<!-- context:component-scan 子節(jié)點base-package="" 指定掃描該包及其子包 -->
<!-- 可通過 resource-pattern 指定掃描的資源 -->
<!-- 
<context:component-scan base-package="com.spring.beans.annotation"
    resource-pattern="repository/*.class"
></context:component-scan>
-->
<!-- context:exclude-filter 子節(jié)點指定不包含哪些表達式的組件 -->
<!-- context:include-filter 子節(jié)點指定包含那些表達式的組件,該節(jié)點需要use-default-filters 配合使用(use-default-filters="false")-->
<context:component-scan base-package="com.spring.beans.annotation"
    use-default-filters="true"><!-- type="annotation" 是掃描base-package 包及其所有子包-->
     
<!--
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" />
 -->
      <!-- type="assignable" 是掃描指定類及implements它的類 -->
 <context:exclude-filter type="assignable" expression="com.spring.beans.annotation.repository.UserRepository" />
</context:component-scan>

使用@Autowired自動裝配Bean
一般情況下只洒,所有使用@Autowired注解的屬性都要被設(shè)置许帐,當(dāng)Spring找不到匹配的Bean時,會拋出異常红碑,若某一屬性允許不被設(shè)置舞吭,可以設(shè)置@Autowired 注解的 required 屬性 為fasle泡垃。
默認(rèn)情況下析珊,當(dāng)IOC容器里存在多個類型兼容的 Bean 時,通過類型的自動裝配將無法工作蔑穴,此時可以在 @Qualifier 注解里提供 Bean 的名稱忠寻,Spring 允許對方法的形參標(biāo)注 @Qualifier 以指定注入 Bean 的名稱。
--@Autowired 注解也可以應(yīng)用在 數(shù)組類型 的屬性上存和,此時Spring 會把所有匹配的 Bean 進行自動裝配奕剃。
--@Autowired 注解也可以應(yīng)用在 集合屬性 上,此時Spring 讀取該集合的類型信息捐腿,然后自動裝配所有與之兼容的 Bean纵朋。
--@Autowired 注解用在 java.util.Map 上時,若該 Map 的鍵值為 String 茄袖,那么 Spring 將自動裝配與之 Map 值類型兼容的 Bean 操软,此時Bean 的名稱作為鍵值。

21.泛型依賴輸入

public class BaseService<T> {
@Autowired
private BaseRepository<T> baseRepository;
public void add(){
    System.out.println("add...");
    System.out.println(baseRepository);
}
}
@Service
public class UserService extends BaseService<User>{
}
@Repository
public class UserRepository extends BaseRepository<User>{
}

當(dāng) userService 調(diào)用 add 方法時宪祥,會輸出
add...
com.spring.beeans.generic.di.UserRepository@2449a2da
22.動態(tài)配置(AOP基礎(chǔ)):

public class ArithmeticCalculatorLoggingProxy {
//要代理的對象
private ArithmeticCalculator target;
public ArithmeticCalculatorLoggingProxy (ArithmeticCalculator target) {
    this.target=target;
}
public ArithmeticCalculator getLoggingProxy(){
    //要代理的對象
    ArithmeticCalculator proxy ;
    //代理對象由哪一個類加載器負責(zé)加載
    ClassLoader loader= target.getClass().getClassLoader();
    //代理對象的類型聂薪,即其中有哪些方法
    Class[] interfaces=new Class[]{ArithmeticCalculator.class};
    //當(dāng)調(diào)用代理對象其中的方法時,該執(zhí)行的代碼
    InvocationHandler h=new InvocationHandler() {
       @Override
       /*
        * proxy:正在返回的那個代理對象蝗羊,一般情況下藏澳,在 invoke 方法中都不使用該對象
        * method:正在被調(diào)用的方法
        * args:調(diào)用方法時,傳入的參數(shù)
        */
       public Object invoke(Object proxy, Method method, Object[] args)
               throws Throwable {
           System.out.println("invoke...");
           //日志
           System.out.println("The method "+method.getName()+" begins with "+Arrays.asList(args));
           //執(zhí)行方法
           Object result=method.invoke(target, args);
           //日志
           System.out.println("The method "+method.getName()+" ends with "+result);
           return result;
       }
    };
    proxy=(ArithmeticCalculator) Proxy.newProxyInstance(loader, interfaces, h);
    return proxy;
  }
}
  public class ArithmeticCalculatorImpl implements ArithmeticCalculator {
public int add(int i, int j) {
    return i+j;
}
public int sub(int i, int j) {
    // TODO Auto-generated method stub
    return i-j;
}
public int mul(int i, int j) {
    // TODO Auto-generated method stub
    return i*j;
}
public double div(double i, double j) {
    return i/j;
}
}
public class Main {
public static void main(String[] args) {
ArithmeticCalculator target=new ArithmeticCalculatorImpl();
ArithmeticCalculator proxy=new ArithmeticCalculatorLoggingProxy(target).getLoggingProxy();

System.out.println(proxy.getClass().getName());

int result=proxy.add(1, 2);
System.out.println(result);

result=proxy.sub(3, 1);
System.out.println(result);
}
}  

輸出結(jié)果為:
com.sun.proxy.$Proxy0
invoke...
The method add begins with [1, 2]
The method add ends with 3
3
invoke...
The method sub begins with [3, 1]
The method sub ends with 2
2
23.(1)SpringAOP
①加入JAR包 ②在配置文件中加入 aop 的命名空間
③基于注解的方式:
i.在配置文件中加入如下配置:

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<bean class="Aspect.class" /  >
 <!--掃描AOP和代理對象的類-->
 <context:component-scan base-package="com.aop" />

AOP類:

@Aspect
public class LogginPerformance {
   @Pointcut("execution(** com.aop.Performance.perform(..))")
   public void cut() {}
   
   @Before("cut()")
   public void beforeMethod() {
         System.out.println("Before");
   }
}

代理對象類:

package com.aop;
public interface Performance {
     public void perform();
}

還需要講implements 該接口類的 類 加入掃描對象

package com.aop;
@Component
public class Singer implements Performance{
@Override
public void perform() {
    System.out.println("唱歌");
}
}

使用方法:

package com.aop;
@Component
public class TestAOP {
public static void main(String[] args) {
   ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
   Performance p=ctx.getBean(Performance.class);
   p.perform();
}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耀找,一起剝皮案震驚了整個濱河市翔悠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖凉驻,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腻要,死亡現(xiàn)場離奇詭異,居然都是意外死亡涝登,警方通過查閱死者的電腦和手機雄家,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胀滚,“玉大人趟济,你說我怎么就攤上這事⊙柿” “怎么了顷编?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長剑刑。 經(jīng)常有香客問我媳纬,道長,這世上最難降的妖魔是什么施掏? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任钮惠,我火速辦了婚禮,結(jié)果婚禮上七芭,老公的妹妹穿的比我還像新娘素挽。我一直安慰自己,他們只是感情好狸驳,可當(dāng)我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布预明。 她就那樣靜靜地躺著,像睡著了一般耙箍。 火紅的嫁衣襯著肌膚如雪撰糠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天辩昆,我揣著相機與錄音阅酪,去河邊找鬼。 笑死卤材,一個胖子當(dāng)著我的面吹牛遮斥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扇丛,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼术吗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帆精?” 一聲冷哼從身側(cè)響起较屿,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤隧魄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后隘蝎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體购啄,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年嘱么,在試婚紗的時候發(fā)現(xiàn)自己被綠了狮含。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡曼振,死狀恐怖几迄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冰评,我是刑警寧澤映胁,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站甲雅,受9級特大地震影響解孙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抛人,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一弛姜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧函匕,春花似錦娱据、人聲如沸蚪黑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忌穿。三九已至抒寂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掠剑,已是汗流浹背屈芜。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留朴译,地道東北人井佑。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像眠寿,于是被迫代替她去往敵國和親躬翁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,595評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 專題一(1)Spring Framework Runtime 遇到的問題:1,業(yè)務(wù)代碼都使用接口,按照接口編程,能...
    Hughman閱讀 580評論 0 3
  • 一盯拱、Spring框架 1.1 Spring框架是什么 Spring是一種容器框架盒发,用于配置各個組件(bean)并且...
    Jane_Static閱讀 387評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理例嘱,服務(wù)發(fā)現(xiàn),斷路器宁舰,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 上一篇:Spring學(xué)習(xí)筆記(三蛮艰、IoC) ** Bean常用的配置項** Id:在IoC容器中Bean的唯一標(biāo)識...
    魯克巴克詩閱讀 931評論 0 3
  • 時光匆匆 歲月一直靜靜地向前流淌著 生命里的那些人來了又走了 但是卻一直相信 有些相逢是命中注定 就像茫茫人海中 ...
    佳佳最美閱讀 297評論 0 1