<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Vincent

    Vicent's blog
    隨筆 - 74, 文章 - 0, 評論 - 5, 引用 - 0
    數(shù)據(jù)加載中……

    Spring技巧之活用FactoryBean

    Spring中有兩種類型的Bean,一種是普通Bean,另一種是工廠Bean,即FactoryBean。工廠Bean跟普通Bean不同,其返回的對象不是指定類的一個實例,其返回的是該工廠Bean的getObject方法所返回的對象。在Spring框架內(nèi)部,AOP相關(guān)的功能及事務(wù)處理中,很多地方使用到工廠Bean,本文簡單分析工廠Bean的用法。
    首先回顧一下普通Bean,普通的Bean直接返回指定類(配置中的class屬性的值)的一個實例,如下面的bean1將返回一個String字符串:
    <bean?name="bean1"?class="java.lang.String">
    ?
    <constructor-arg?value="我是字符串!"?/>
    ?
    </bean>?

    下面,看看一個簡單的工廠Bean:
    import?java.util.Date;
    import?org.springframework.beans.factory.FactoryBean;
    public?class?FactoryBeanDemo?implements?FactoryBean?{
    ?
    private?String?name;
    ?
    public?void?setName(String?name)
    ?{
    ??
    this.name=name;
    ?}
    ?
    public?Object?getObject()?throws?Exception?{
    ??
    if("date".equals(name))return?new?Date();
    ??
    else?return?new?String("這是一個字符串!");
    ?}
    ?
    public?Class?getObjectType()?{??
    ??
    return?"date".equals(name)?Date.class:String.class;
    ?}
    ?
    public?boolean?isSingleton()?{??
    ??
    return?false;
    ?}
    }

    下面看這個工廠Bean的配置:
    <bean?name="myFactoryBean"?class="springroad.deomo.chap4.FactoryBeanDemo"/>
    <bean?name="myFactoryBean1"?class="springroad.deomo.chap4.FactoryBeanDemo"><property?name="name"?value="date"/></bean>

    下面是測試代碼:
    Resource?res=new?ClassPathResource("springroad/deomo/chap4/demo-bean.xml");
    BeanFactory?factory
    =new?XmlBeanFactory(res);
    System.out.println(factory.getBean(
    "myFactoryBean").getClass());
    System.out.println(factory.getBean(
    "myFactoryBean1").getClass());


    輸出結(jié)果:
    class?java.lang.String
    class?java.util.Date


    由此可見,通過使用FactoryBean,我們可以得到不同類型的對象實例。這也就是我們在AOP中通過設(shè)置calss為 ProxyFactoryBean可以返回不同類型的業(yè)務(wù)對象的原理。在實際應(yīng)用中若能靈活使用FactoryBean,則可以給應(yīng)用程序增加很多的魔幻功能。

    一個小竅門:
      FactoryBean還藏有一個技巧,也就是在我們實際需要返回FactoryBean實例時,應(yīng)該怎么辦。也就是我們在應(yīng)用程序中需要通過容器得到一個FactoryBean。此時,需要使用特殊的方式,即在bean的名稱前加上一個特殊符號“&”即可。
      如,下面的代碼:
    System.out.println(factory.getBean("&myFactoryBean").getClass());
    ?System.out.println(factory.getBean(
    "&myFactoryBean1").getClass());

    輸出的結(jié)果將會是:
    class ?springroad.deomo.chap4.FactoryBeanDemo
    class ?springroad.deomo.chap4.FactoryBeanDemo?

    posted @ 2006-08-22 09:52 Binary 閱讀(270) | 評論 (0)編輯 收藏

    Spring2.0中新的Bean類型實現(xiàn)原理

    我們知道,在Spring2.0中,除了singleton及prototype兩種類型的Bean以外。默認情況下還增加了request、 session及global?session三種類型的Bean,增加的三種類型的Bean主要應(yīng)用于Web應(yīng)用程序中。本文不打算分析三種類型的 Bean的用法,只是簡單分析框架的實現(xiàn)原理。
      Spring2.0中新增了一個用來表示Bean范圍的Scope接口
      public?interface?Scope?{
      Object?get(String?name,?ObjectFactory?objectFactory);
    //根據(jù)名稱及創(chuàng)建工廠得到一個Bean實例
      Object?remove(String?name);//刪除一個指定名稱的Bean
      }


      在容器ConfigurableBeanFactory接口中定義了Bean工廠有關(guān)Scope注冊的相關(guān)方法,使得可往Bean工廠中加入新類型的Bean。
      public?interface?ConfigurableBeanFactory?extends?HierarchicalBeanFactory,
      
    void?registerScope(String?scopeName,?Scope?scope);//往Bean工廠中添加一個新的范圍(默認只有兩種范圍:singleton及prototype)
      void?destroyScopedBean(String?beanName);//銷毀B?ean工廠中范圍Bean
      }


      在AbstractFactoryBean的getBean方法中實現(xiàn)了對特定Scope?Bean支持,核心代碼摘要:

    ????String?scopeName?=?mergedBeanDefinition.getScope();//取得當(dāng)前Bean的范圍,也即在定義中的scope=”request”的部分。
    ????Scope?scope?=?(Scope)?this.scopes.get(scopeName);//得到Bean工廠中的范圍處理器
    ????if?(scope?==?null)?{
    ?????
    throw?new?IllegalStateException("No?Scope?registered?for?scope?'"?+?scopeName?+?"'");
    ????}
    ????
    try?{
    //使用scope.get(beanName,ObjectFactory)從指定的范圍中得到或創(chuàng)建Bean實例
    ?????Object?scopedInstance?=?scope.get(beanName,?new?ObjectFactory()?{
    ??????
    public?Object?getObject()?throws?BeansException?{
    ???????beforePrototypeCreation(beanName);
    //前攔截
    ???????try?{
    ????????
    return?createBean(beanName,?mergedBeanDefinition,?args);//調(diào)用子類的createBean實現(xiàn)真正的Bean創(chuàng)建工作
    ???????}
    ???????
    finally?{
    ????????afterPrototypeCreation(beanName);
    //后攔截
    ???????}
    ??????}
    ?????});
    ?????bean?
    =?getObjectForBeanInstance(scopedInstance,?name,?mergedBeanDefinition);//返回正確類型的Bean實例
    ????}
    ????
    catch?(IllegalStateException?ex)?{
    ?????
    throw?new?BeanCreationException(beanName,?"Scope?'"?+?scopeName?+?"'?is?not?active",?ex);
    ????}


      默認情況下,低層的Bean工廠中只支持singleton及prototype兩種類型的Bean。當(dāng)把scope設(shè)置成request及 session時將會出現(xiàn)不能正確識別Scope的錯誤。這是因為普通的Bean工廠都沒有注冊新的Scope。只有在 WebApplicationContext中注冊才注冊了新類型的Bean。
      下面看實現(xiàn)注冊Scope的代碼:
      在WebApplicationContext中定義常量
    public?interface?WebApplicationContext?extends?ApplicationContext?{
      String?SCOPE_REQUEST?
    =?"request";
      String?SCOPE_SESSION?
    =?"session";
    ?????????String?SCOPE_GLOBAL_SESSION?
    =?"globalSession";
    }


      然后在所有類型的Web應(yīng)用上下文的實現(xiàn)中,都在Bean工廠的攔載過程中通過postProcessBeanFactory方法來注冊新類型 Scope,如GenericWebApplicationContext、StaticWebApplicationContext、
    AbstractRefreshableWebApplicationContext等WebApplication應(yīng)用上下文實現(xiàn)中。
      
    protected?void?postProcessBeanFactory(ConfigurableListableBeanFactory?beanFactory)?{
      ??beanFactory.registerScope(SCOPE_REQUEST,?
    new?RequestScope());//注冊request類型的Bean
      ??beanFactory.registerScope(SCOPE_SESSION,?new?SessionScope(false));//注冊session類型的Bean
      ??beanFactory.registerScope(SCOPE_GLOBAL_SESSION,?new?SessionScope(true));//注冊glogalsession  的Bean
    }


      結(jié)合上面的代碼,現(xiàn)在應(yīng)該明白為什么只有在Web應(yīng)用上下文中才能使用新增加三種類型的Bean了吧。當(dāng)然,由于有了Scope,我們也可以非常輕松的實現(xiàn)我們自己的Scope,增加新用戶自定義類型的Bean,然后設(shè)計出一個適合我們自己的Bean工廠。

    posted @ 2006-08-22 09:49 Binary 閱讀(270) | 評論 (0)編輯 收藏

    MYSQL的master/slave數(shù)據(jù)同步配置

    我的測試環(huán)境.基本上數(shù)據(jù)是瞬間同步,希望對大家有幫助


    redhat 9.0
    mysql3.23.57



    mysql數(shù)據(jù)同步備份


    A服務(wù)器: 192.168.1.2 主服務(wù)器master
    B服務(wù)器: 192.168.1.3 副服務(wù)器slave



    A服務(wù)器設(shè)置


    #mysql ?u root ?p
    mysql>GRANT FILE ON *.* TO backup@192.168.1.3 IDENTIFIED BY ‘1234’;
    mysql>\exit


    上面是Master開放一個賬號backup密碼1234給IP:192.168.1.3有檔案處理的權(quán)限



    mysqladmin ?u root ?p shutdown


    備份Master所有數(shù)據(jù)庫..通常都用tar指令.
    #tar ?cvf /tmp/mysql.tar /var/lib/mysql
    注意:tar的時候,MySQL是要在stop情況下


    在A機器上修改/etc/my.cnf
    在[mysqld]區(qū)段內(nèi)加入?yún)?shù)
    log-bin
    server-id=1
    sql-bin-update-same
    binlog-do-db=vbb


    重啟A服務(wù)器mysql


    此時因為有加入log-bin參數(shù),因此開始有index產(chǎn)生了,在/var/lib/mysql目錄下有.index檔案紀錄數(shù)據(jù)庫的異動log.



    B服務(wù)器設(shè)置


    設(shè)定/etc/my.cnf
    在[mysqld]區(qū)段加入


    master-host=192.168.1.2
    master-user=backup
    master-password=1234
    master-port=3306
    server-id=2
    master-connect-retry=60 預(yù)設(shè)重試間隔60秒
    replicate-do-db=vbb 告訴slave只做vbb數(shù)據(jù)庫的更新
    log-slave-updates



    將A上的mysql.tar copy到B上
    用ftp傳B的/tmp
    9.解壓縮
    #cd /var/lib/



    狀況測試
    1.A跟B網(wǎng)絡(luò)及服務(wù)都正常情況下,由A端變化數(shù)據(jù)后,到B端瀏覽數(shù)據(jù),檢視是否有進行replication?!
    2.模擬B當(dāng)機,或是B不一定需要一直跟A有連接.
    將由A端變化數(shù)據(jù)后,到B端瀏覽數(shù)據(jù),B點應(yīng)該是沒有數(shù)據(jù)變化的



    #tar xvf /tmp/mysql-snapshot.tar
    #chown ?R mysql:mysql mysql


    1重啟B服務(wù)器的mysql


    這時在/var/lib/mysql目錄會出現(xiàn)master.info,此檔案紀錄了Master MySQL server的信息.


    ?


    狀況測試
    1.A跟B網(wǎng)絡(luò)及服務(wù)都正常情況下,由A端變化數(shù)據(jù)后,到B端瀏覽數(shù)據(jù),檢視是否有進行replication?!
    2.模擬B當(dāng)機,或是B不一定需要一直跟A有連接.
    將由A端變化數(shù)據(jù)后,到B端瀏覽數(shù)據(jù),B點應(yīng)該是沒有數(shù)據(jù)變化的

    posted @ 2006-08-22 09:43 Binary 閱讀(229) | 評論 (0)編輯 收藏

    加大MySQL的最大連接數(shù)

    mysql的最大連接數(shù)默認是100, 這個數(shù)值對于并發(fā)連接很多的數(shù)據(jù)庫應(yīng)用是遠遠不夠的,當(dāng)連接請求大于默認連接數(shù)后,就會出現(xiàn)無法連接數(shù)據(jù)庫的錯誤,因此我們需要把它適當(dāng)調(diào)大一些,
    有兩種辦法可以修改最大連接數(shù),一種是修改safe_mysqld,另一種是直接修改原代碼并重新編譯。下面我們就分別介紹這兩種方法:

    1.修改safe_mysqld
    找到safe_mysqld編輯它,找到mysqld啟動的那兩行,在后面加上參數(shù) :

    -O max_connections=1000


    例如 :(其中前面有---的是原來的內(nèi)容,而+++是修改過以后的)
    --- safe_mysqld.orig Mon Sep 25 09:34:01 2000
    +++ safe_mysqld Sun Sep 24 16:56:46 2000
    @@ -109,10 +109,10 @@
    if test "$#" -eq 0
    then
    nohup $ledir/mysqld --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR \
    - --skip-locking >> $err_log 2>&1
    + --skip-locking -O max_connections=1000 >> $err_log 2>&1
    else
    nohup $ledir/mysqld --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR \
    - --skip-locking "$@" >> $err_log 2>&1
    + --skip-locking "$@" -O max_connections=1000 >> $err_log 2>&1
    fi
    if test ! -f $pid_file # This is removed if normal shutdown
    then
    然后關(guān)閉mysql重啟它,用
    /mysqladmin所在路徑/mysqladmin -uroot -p variables
    輸入root數(shù)據(jù)庫賬號的密碼后可看到
    | max_connections | 1000 |
    即新改動已經(jīng)生效。

    2.修改原代碼

    解開MySQL的原代碼,進入里面的sql目錄修改mysqld.cc找到下面一行:

    { "max_connections", (long*) &max_connections,1000,1,16384,0,1},

    把它改為:

    { "max_connections", (long*) &max_connections,1000,1,16384,0,1},

    存盤退出,然后./configure make;make install可以獲得同樣的效果。

    ?

    posted @ 2006-08-22 09:42 Binary 閱讀(196) | 評論 (0)編輯 收藏

    僅列出標(biāo)題
    共8頁: 上一頁 1 2 3 4 5 6 7 8 
    主站蜘蛛池模板: 亚洲成年轻人电影网站www| 亚洲最大的黄色网| 亚洲人成在线免费观看| 亚洲中文字幕无码av| 亚洲一区二区视频在线观看| 国产精品免费大片| 亚洲码和欧洲码一码二码三码| 成人亚洲性情网站WWW在线观看| 99re这里有免费视频精品| 亚洲国产综合AV在线观看| 亚洲男人的天堂www| 114一级毛片免费| jizz免费观看| 亚洲国产激情在线一区| 亚洲熟妇av一区二区三区漫画| 老司机在线免费视频| 中国一级毛片视频免费看| 亚洲最大的成人网| 亚洲av无码潮喷在线观看 | 成全视频免费高清| 国产一级在线免费观看| 亚洲精品国产摄像头| 97亚洲熟妇自偷自拍另类图片| 手机看片久久国产免费| 四虎精品视频在线永久免费观看| 免费看一级一级人妻片| 亚洲成_人网站图片| 久久久久亚洲av无码专区喷水| 中文字幕亚洲专区| 四虎永久成人免费| 我的小后妈韩剧在线看免费高清版| 国产精品小视频免费无限app| 2020亚洲男人天堂精品| 亚洲人成在线影院| 亚洲欧洲中文日韩久久AV乱码| 18禁成年无码免费网站无遮挡| 久艹视频在线免费观看| 国产免费一级高清淫曰本片| 另类图片亚洲校园小说区| 亚洲综合av一区二区三区| 亚洲国产精品成人精品小说|