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

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

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

    隨筆-124  評(píng)論-49  文章-56  trackbacks-0
    IOC控制反轉(zhuǎn):應(yīng)用本身不負(fù)責(zé)依賴對(duì)象的創(chuàng)建及維護(hù),依賴對(duì)象的創(chuàng)建及維護(hù)是由外部容器負(fù)責(zé)的。
    依賴注入:在運(yùn)行期,由外部容器動(dòng)態(tài)地將依賴對(duì)象注入到組件中。
    -----------------------------------------------------------------------------
    第一個(gè)項(xiàng)目
    1    spring的依賴庫(kù)
         * SPRING_HOME/dist/spring.jar
         * SPRING_HOME/lib/jakarta-commons/commons-logging.jar
         * SPRING_HOME/lib/log4j/log4j-1.2.14.jar
         如果使用了切面編程(AOP),還需要下列jar文件
         * SPRING_HOME/lib/aspectj/aspectjweaver.jar和aspectjrt.jar
         * SPRING_HOME/lib/cglib/cglib-nodep-2.1_3.jar
         如果使用了JSR-250的注解,如@Resource/@postConstruct/@preDestroy,還需要下列jar文件
         * SPRING_HOME/lib/j2ee/common-annotations.jar
    2    拷貝spring配置文件到src下
    3    拷貝log4j配置文件到src下
    4(1) 在UserManager中提供構(gòu)造函數(shù),spring將實(shí)例化好的UserDao實(shí)現(xiàn)注入給我們
    public class UserManagerImpl implements UserManager {
                    
    private UserDao userDao;
                    
    public UserManagerImpl(UserDao userDao){
                        
    this.userDao=userDao;
                    }

                    
    public void save(String username, String password) {
                        
    this.userDao.save(username, password);
                    }

              }
    4(2) 在UserManager中提供set方法,spring將實(shí)例化好的UserDao實(shí)現(xiàn)注入給我們
    public class UserManagerImpl implements UserManager {
                    
    private UserDao userDao;
                    
    public UserDao getUserDao() {
                        
    return userDao;
                    }

                    
    public void setUserDao(UserDao userDao) {
                        
    this.userDao = userDao;
                    }

                    
    public void save(String username, String password) {
                        
    this.userDao.save(username, password);
                    }

             }
    5    讓spring管理我們的對(duì)象創(chuàng)建和依賴,必須在spring配置文件中(applicationContext.xml)進(jìn)行定義
         * 構(gòu)造函數(shù)
    <bean id="userDao4MySqlImpl" class="com.my.spring.dao.UserDao4MySqlImpl"/>
           
    <bean id="userDao4OracleImpl" class="com.my.spring.dao.UserDao4OracleImpl"/>
           
    <bean id="userManagerImpl" class="com.my.spring.manager.UserManagerImpl">
                
    <constructor-arg ref="userDao4MySqlImpl"/>
                //
    <constructor-arg index="0" type="com.my.spring.dao.UserDao4OracleImpl" ref="userDao4MySqlImpl"/>
           
    </bean>
           * set方法
           方法一:
           
    <bean id="userDao4MySqlImpl" class="com.my.spring.dao.UserDao4MySqlImpl"/>
           
    <bean id="userDao4OracleImpl" class="com.my.spring.dao.UserDao4OracleImpl"/>
           
    <bean id="userManagerImpl" class="com.my.spring.manager.UserManagerImpl">
                
    <property name="userDao" ref="userDao4OracleImpl"/>
           
    </bean>
           方法二(使用內(nèi)部bean)
           
    <bean id="userManagerImpl" class="com.my.spring.manager.UserManagerImpl">
                
    <property name="userDao">
                     
    <bean class="com.my.spring.manager.UserManagerImpl">
                
    </property>
           
    </bean>
    * 注解方式
          1 頭文件中必須加入
    xmlns:context="http://www.springframework.org/schema/context"
              http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
              
    <context:annotation-config/>//開啟注解
    2 在java代碼中使用@Autowired或@Resource注解方式進(jìn)行裝配,它們區(qū)別是:
             * @Autowired默認(rèn)按類型裝配,默認(rèn)情況下要求依賴對(duì)象必須存在,如果允許null值,可以設(shè)置它required為false,
             如果想使用按名稱裝配,可以結(jié)合@Qualifier注解一起使用,如下:
                @Autowired @Qualifier("userBean")
                private User user;
             * @Resource默認(rèn)按名稱裝配,找不到匹配的bean才會(huì)按類型裝配。它和@Autowired一樣可以標(biāo)注在字段或?qū)傩缘膕etter方法上。
             可以通過(guò)name屬性指定名稱,如果沒(méi)有指定name屬性,當(dāng)注解標(biāo)注在字段上,即默認(rèn)取字段的名稱為name屬性名稱,當(dāng)注注解
             標(biāo)注在屬性的setter方法上,即默認(rèn)取屬性名作為bean名稱尋找依賴對(duì)象。
             注意:一旦指定了name屬性,就只能按名稱裝配了。
                @Resource(name="userBean")
                private User user;
    6    實(shí)例化spring容器并調(diào)用相關(guān)方法
         //ApplicationContext ctx=new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
         BeanFactory factory =new ClassPathXmlApplicationContext("applicationContext.xml");
    7    獲取bean
    UserManager userManager=(UserManager)ctx.getBean("userManagerImpl");
           UserManager userManager
    =(UserManager)factory.getBean("userManagerImpl");

    8    調(diào)用業(yè)務(wù)碼
        userManager.save("張三", "123");
    spring IoC容器的關(guān)鍵點(diǎn):
         * 必須將被管理的對(duì)象定義到spring配置文件中
         * 必須定義構(gòu)造函數(shù)或setter方法,讓spring將對(duì)象注入過(guò)來(lái)
    手動(dòng)添加schema文件,方法如下:
    windows->preferences->myeclipse->files and editors->xml->xmlcatalog

    -------------------------------------------------------------------------------------------------------------------
    普通屬性的注入
      *多個(gè)配置文件可以放入String[]數(shù)組中,調(diào)用factory=new ClassPathXmlApplicationContext(String[] array);
      *多個(gè)配置文件可以使用*通配符,(測(cè)試未成功)factory=new ClassPathXmlApplicationContext("applicationContext-*.xml");
      *可以將一個(gè)類分成多個(gè)配置文件進(jìn)行配置,但id不能相同
    示例:

    Beans:
    private String strValue;
        
    private int intValue;
        
    private List listValue;
        
    private Set setValue;
        
    private String[] arrayValue;
        
    private Map mapValue;
        
    private Properties properties;
    applicationContext-beans.xml
    <bean id="beans" class="com.my.spring.Beans">
            
    <property name="strValue" value="Hello"/>
            
    <property name="intValue">
                
    <value>123</value>
            
    </property>
            
    <property name="listValue">
                
    <list>
                    
    <value>list1</value>
                    
    <value>list2</value>
                
    </list>
            
    </property>
            
    <property name="setValue">
                
    <set>
                    
    <value>set1</value>
                    
    <value>set2</value>
                
    </set>
            
    </property>
            
    <property name="arrayValue">
                
    <list>
                    
    <value>array1</value>
                    
    <value>array2</value>
                
    </list>
            
    </property>
            
    <property name="mapValue">
                
    <map>
                    
    <entry key="k1" value="v1"/>
                    
    <entry key="k2" value="v2"/>
                
    </map>
            
    </property>
            
    <property name="date">
                
    <value>2008-08-15</value>
            
    </property>
            
    <property name="properties">
                
    <props>
                    
    <prop key="key1">value1</prop>
                    
    <prop key="key2">value2</prop>
                    
    <prop key="key3">value3</prop>
                
    </props>
            
    </property>
        
    </bean>
    調(diào)用:
    private BeanFactory factory=new ClassPathXmlApplicationContext("applicationContext-beans.xml");
            Beans b
    =(Beans)factory.getBean("beans");
            System.out.println(b.getIntValue());
            System.out.println(b.getStrValue());
            System.out.println(b.getArrayValue());
            System.out.println(b.getListValue());
            System.out.println(b.getMapValue());
            System.out.println(b.getDate());

    ---------------------------------------------------------------------------------------------
    自定義屬性編輯器
    *作用:將spring配置文件中的字符串轉(zhuǎn)換成相應(yīng)的對(duì)象進(jìn)行注入
           spring已經(jīng)有內(nèi)置的屬性編輯器,我們可以根據(jù)需求自己定義屬性編輯器
    *定義方法:
           1 繼承PropertyEditorSupport類,復(fù)寫setAsText()方法
           2 將屬性編輯注冊(cè)到spring中
    1 編寫自定義處理類
    public class UtilDatePropertyEditor extends PropertyEditorSupport {
        
    private String format="yyyy-MM-dd";
        @Override
        
    public void setAsText(String text) throws IllegalArgumentException {
            SimpleDateFormat sdf
    =new SimpleDateFormat(format);
            
    try {
                Date d
    =sdf.parse(text);
                
    this.setValue(d);
            }
     catch (ParseException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        
    public String getFormat() {
            
    return format;
        }

        
    public void setFormat(String format) {
            
    this.format = format;
        }

    }
    2 配置apllicationContext-edition.xml
    <bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
            
    <property name="customEditors">
                
    <map>
                    
    <entry key="java.util.Date">
                        
    <bean class="com.my.spring.UtilDatePropertyEditor"/>
                    
    </entry>
                
    </map>
            
    </property>
    </bean>
    3 調(diào)用
    String[] contexts=new String[]{"applicationContext-beans.xml","applicationContext-edition.xml"};
            factory
    =new ClassPathXmlApplicationContext(contexts);

    -----------------------------------------------------------------------------------------------------
    公共屬性的注入
    依賴對(duì)象的注入方法,可以采用:
     * ref屬性
     * <ref>標(biāo)簽
     * 內(nèi)部<bean>來(lái)定義
    <bean id="beans2" class="com.my.spring.Beans2">
            
    <property name="beans3">
                
    <ref bean="beans3"/>
            
    </property>
            
    <property name="beans4" ref="beans4"/>
            
    <property name="beans5" ref="beans5"/>
    </bean>
    如何將公共的注入定義描述出來(lái)?
     * 通過(guò)<bean>標(biāo)簽定義的屬性,指定abstract="true"
     * 具有相同屬性的類在<bean>標(biāo)簽中指定其parent屬性
    <bean id="beanAbstract" abstract="true">
            
    <property name="id" value="1000"/>
            
    <property name="name" value="jack"/>
    </bean>
        
    <bean id="beans3" class="com.my.spring.Beans3" parent="beanAbstract">
            
    <property name="password" value="8888"/>
    </bean>

    <bean id="beans4" class="com.my.spring.Beans4" parent="beanAbstract"/>

    <bean id="beans2" class="com.my.spring.Beans2">
            
    <property name="beans3">
                
    <ref bean="beans3"/>
            
    </property>
            
    <property name="beans4" ref="beans4"/>
            
    <property name="beans5" ref="beans5"/>
    </bean>

    <bean id="beans5" class="com.my.spring.Beans5">
            
    <property name="age" value="123"/>
    </bean>

    --------------------------------------------------------------------------------------------------

    Bean的作用域

    scope可以取值:
      * singleton:每次調(diào)用getBean時(shí)返回相同的實(shí)例
      * prototype:每次調(diào)用getBean時(shí)返回不同的實(shí)例
     
    <bean id="beans" class="com.my.spring.Beans" scope="singletion">
    <bean id="beans" class="com.my.spring.Beans" scope="prototype">
    --------------------------------------------------------------------------------------------------
    自動(dòng)裝配
    1 根據(jù)名稱
      設(shè)置<beans>標(biāo)簽中default-autowire="byName"

    <bean id="beanAbstract" abstract="true">
                    
    <property name="id" value="1000"/>
                    
    <property name="name" value="jack"/>
            
    </bean>
            
    <bean id="beans3" class="com.my.spring.Beans3" parent="beanAbstract">
                    
    <property name="password" value="8888"/>
            
    </bean>
            
    <bean id="beans4" class="com.my.spring.Beans4" parent="beanAbstract"/>
            
            
    <bean id="beans2" class="com.my.spring.Beans2">
        
    <!-- 可以省略,會(huì)按名稱自動(dòng)裝配
                    <property name="beans3">
                        <ref bean="beans3"/>
                    </property>
                    <property name="beans4" ref="beans4"/>
                    <property name="beans5" ref="beans5"/>
        
    -->
            
    </bean>
            
            
    <bean id="beans5" class="com.my.spring.Beans5">
                    
    <property name="age" value="123"/>
            
    </bean>
    2 根據(jù)類型
     設(shè)置<beans>標(biāo)簽中default-autowire="byType"
    <bean id="beanAbstract" abstract="true">
                    
    <property name="id" value="1000"/>
                    
    <property name="name" value="jack"/>
            
    </bean>
            
    <bean id="beans33" class="com.my.spring.Beans3" parent="beanAbstract">
                    
    <property name="password" value="8888"/>
            
    </bean>
            
    <bean id="beans433" class="com.my.spring.Beans4" parent="beanAbstract"/>
            
            
    <bean id="beans2" class="com.my.spring.Beans2">
        
    <!-- 可以省略,會(huì)按類型自動(dòng)裝配
                    <property name="beans3">
                        <ref bean="beans3"/>
                    </property>
                    <property name="beans4" ref="beans4"/>
                    <property name="beans5" ref="beans5"/>
        
    -->
            
    </bean>
            
            
    <bean id="beans523" class="com.my.spring.Beans5">
                    
    <property name="age" value="123"/>
            
    </bean>

    ------------------------------------------------------------------------------------------

    <Bean>屬性
    1 id為bean的名稱,是唯一的
    2 name也是為bean取名的,作用相同,區(qū)別是id中不能有"/"符號(hào),name中可以有,如:
        * name="/login"
    3 class是bean類的全名
    4 init-method:bean的初始化方法
    5 destroy-method:bean消滅時(shí)調(diào)用的方法

    自動(dòng)裝配依賴對(duì)象,不建意使用[byType/byName]
    <bean id="..." class="..." autowire="byType"/>

    ------------------------------------------------------------------------------------------------
    注解方式

    1 spring的依賴庫(kù)
         * SPRING_HOME/dist/spring.jar
         * SPRING_HOME/lib/jakarta-commons/commons-logging.jar
         * SPRING_HOME/lib/log4j/log4j-1.2.14.jar
         如果使用了切面編程(AOP),還需要下列jar文件
         * SPRING_HOME/lib/aspectj/aspectjweaver.jar和aspectjrt.jar
         * SPRING_HOME/lib/cglib/cglib-nodep-2.1_3.jar
         如果使用了JSR-250的注解,如@Resource/@postConstruct/@preDestroy,還需要下列jar文件
         * SPRING_HOME/lib/j2ee/common-annotations.jar

    手動(dòng)添加schema文件,方法如下:
    windows->preferences->myeclipse->files and editors->xml->xmlcatalog
    文件在dist/resources目錄下的spring-beans-2.5.xsd

    2 applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context
    ="http://www.springframework.org/schema/context"
           xsi:schemaLocation
    ="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-2.5.xsd"
    >
        
    <context:annotation-config />//開啟配置項(xiàng)

        
    <bean id="personDao" class="org.spring.dao.impl.PersonDaoImpl"/>
    </beans>
    3 在java代碼中使用@Autowired或@Resource注解方式進(jìn)行裝配,它們區(qū)別是:
      @Autowired默認(rèn)按類型裝配,@Resource默認(rèn)按名稱裝配,當(dāng)找不到與名稱匹配的bean才會(huì)按類型裝配
     
      # 用于字段上
      @Autowired
      private PersonDao personDao;
      # 用于屬性的setter方法上
      @Autowired
      public void setPersonDao(PersonDao personDao){...}
             * @Autowired默認(rèn)按類型裝配,默認(rèn)情況下要求依賴對(duì)象必須存在,如果允許null值,可以設(shè)置它required為false,
             如果想使用按名稱裝配,可以結(jié)合@Qualifier注解一起使用,如下:
                @Autowired @Qualifier("personDaoBean")
                private PersonDao personDao;
             * @Resource默認(rèn)按名稱裝配,找不到匹配的bean才會(huì)按類型裝配。它和@Autowired一樣可以標(biāo)注在字段或?qū)傩缘膕etter方法上。
             可以通過(guò)name屬性指定名稱,如果沒(méi)有指定name屬性,當(dāng)注解標(biāo)注在字段上,即默認(rèn)取字段的名稱為name屬性名稱,當(dāng)注注解
             標(biāo)注在屬性的setter方法上,即默認(rèn)取屬性名作為bean名稱尋找依賴對(duì)象。
             注意:一旦指定了name屬性,就只能按名稱裝配了。
                @Resource(name="personDao")
                private PersonDao personDao;
      例(繼上):
    public class PersonBizImpl implements IPersonBiz {
        @Resource[或@Resource(name
    ="personDao")]//指定bean的名稱,和applicationContext.xml文件中bean名稱相同
        private IPersonDao personDao;//可以不用寫setter方法
        
        
    //或者在屬性的setter方法上
        
    //@Resource
        
    //public void setPersonDao(IPersonDao personDao) {
        
    //    this.personDao = personDao;
        
    //}

        
    public void say(){
            personDao.say();
        }

      }

    posted on 2009-11-30 08:58 junly 閱讀(351) 評(píng)論(0)  編輯  收藏 所屬分類: spring

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 边摸边吃奶边做爽免费视频99| 人与动性xxxxx免费| 国产成人高清精品免费观看| 99久久国产免费-99久久国产免费 99久久国产免费中文无字幕 | 亚洲综合免费视频| 国产亚洲成在线播放va| 久9这里精品免费视频| 国产大片51精品免费观看| 久久久久久亚洲精品成人| 国产AV日韩A∨亚洲AV电影 | 两个人的视频高清在线观看免费| 久久综合亚洲色HEZYO国产| 亚洲一区二区三区免费在线观看 | 99在线免费观看视频| 免费播放特黄特色毛片| 亚洲制服丝袜在线播放| 国内精品99亚洲免费高清| 麻豆国产人免费人成免费视频| 亚洲AV日韩精品久久久久久久 | 亚洲最大的成人网站| 精品一卡2卡三卡4卡免费视频 | 日产乱码一卡二卡三免费| 亚洲精品私拍国产福利在线| 污视频网站免费在线观看| 999久久久免费精品国产| 亚洲一区精品无码| 综合偷自拍亚洲乱中文字幕| 亚洲免费二区三区| 亚洲精品无码av人在线观看| 福利片免费一区二区三区| 国产91免费视频| 国产亚洲高清不卡在线观看| 精品一区二区三区免费毛片| 无码人妻精品一二三区免费| 91久久亚洲国产成人精品性色| 国产精品成人啪精品视频免费| 免费国产精品视频| 亚洲日韩亚洲另类激情文学| 亚洲成人免费电影| 99人中文字幕亚洲区| 日韩精品无码免费专区网站|