Spring框架核心(1)

專業(yè)術(shù)語了解

  • 組件/框架設(shè)計(jì)
    • 侵入式設(shè)計(jì) : 引入了框架,對(duì)現(xiàn)有的類的結(jié)構(gòu)有影響;即需要實(shí)現(xiàn)或繼承某些特定類。例如:Struts框架
    • 非侵入式設(shè)計(jì) : 引入了框架,對(duì)現(xiàn)有的類結(jié)構(gòu)沒有影響。例如:Hibernate框架 / Spring框架
  • 控制反轉(zhuǎn)與依賴注入
    • 控制反轉(zhuǎn)IOC (Inversion on Control) : 對(duì)象的創(chuàng)建交給外部容器完成,這個(gè)就做控制反轉(zhuǎn).
  • 依賴注入 (dependency injection) : 處理對(duì)象的依賴關(guān)系
  • 區(qū)別 :
    • 控制反轉(zhuǎn), 解決對(duì)象創(chuàng)建的問題【對(duì)象創(chuàng)建交給別人】
    • 依賴注入,在創(chuàng)建完對(duì)象后,對(duì)象的關(guān)系處理就是依賴注入【通過set方法依賴注入】
  • AOP(面向切面編程)
    • 切面 : 簡(jiǎn)單來說來可以理解為一個(gè)類,由很多重復(fù)代碼形成的類。
    • 切面舉例:事務(wù)、日志、權(quán)限;

Spring框架

  1. 概述 :
  • Spring框架可以解決<strong>對(duì)象創(chuàng)建以及對(duì)象之間依賴關(guān)系</strong>的一種框架。且可以和其他框架一起使用 : Spring與Struts, Spring與hibernate (起到整合(粘合) 作用的一個(gè)框架)
  • Spring提供了一站式解決方案(六大模塊功能)
    1)Spring Core spring的核心功能(CORE) : IOC容器, 解決對(duì)象創(chuàng)建及依賴關(guān)系
    2)Spring Web Spring (WEB) : 對(duì)web模塊的支持
    • 可以與struts整合,讓struts的action創(chuàng)建交給spring
    • spring mvc模式
      3)Spring DAO Spring (DAO) : 對(duì)jdbc操作的支持(JdbcTemplate模板工具類)
      4)Spring ORM spring (ORM) : 對(duì)orm的支持
    • 既可以與hibernate整合(session)
    • 也可以使用spring的對(duì)hibernate操作的封裝
      5)Spring AOP (AOP) : 切面編程
      6)SpringEE spring (JEE) : 對(duì)javaEE其他模塊的支持
  1. 開發(fā)步驟
  • spring各個(gè)版本中:

    • 在3.0以下的版本,源碼有spring中相關(guān)的所有包 (spring功能 + 依賴包) ; 如2.5版本;
    • 在3.0以上的版本,源碼中只有spring的核心功能包 (沒有依賴包) (如果要用依賴包,需要單獨(dú)下載)
  • 開發(fā)步驟

  1. 源碼, jar文件:spring-framework-3.2.5.RELEASE
- `` commons-logging-1.1.3.jar `` : 日志
- `` spring-beans-3.2.5.RELEASE.jar `` : bean節(jié)點(diǎn)
- `` spring-context-3.2.5.RELEASE.jar `` : spring上下文節(jié)點(diǎn)
- `` spring-core-3.2.5.RELEASE.jar `` : spring核心功能
- `` spring-expression-3.2.5.RELEASE.jar `` : spring表達(dá)式相關(guān)表
- <strong>以上是必須引入的5個(gè)jar文件,在項(xiàng)目中可以用戶庫(kù)管理!</strong> 
  - jar包下載地址 : http://repo.spring.io/release/org/springframework/spring/
  1. 核心配置文件: applicationContext.xml
- Spring配置文件:applicationContext.xml / bean.xml
- 約束參考:spring-framework-3.2.5.RELEASE\docs\spring-framework-reference\htmlsingle\index.html
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        <!-- IOC容器的配置: 要?jiǎng)?chuàng)建的所有的對(duì)象都配置在這里 -->
     <bean id="user" class="sh.anderson.a_hello.User"></bean>
</beans>   
  1. Api
public class App {

    // 1. 通過工廠類得到IOC容器創(chuàng)建的對(duì)象
    @Test
    public void testIOC() throws Exception {
        // 創(chuàng)建對(duì)象
        // User user = new User();
        
        // 現(xiàn)在,把對(duì)象的創(chuàng)建交給spring的IOC容器
        Resource resource = new ClassPathResource("sh/anderson/a_hello/applicationContext.xml");
        // 創(chuàng)建容器對(duì)象(Bean的工廠), IOC容器 = 工廠類 + applicationContext.xml
        BeanFactory factory = new XmlBeanFactory(resource);
        // 得到容器創(chuàng)建的對(duì)象
        User user = (User) factory.getBean("user");
        
        System.out.println(user.getId());
        
    }
    
    //2. (方便)直接得到IOC容器對(duì)象 
    @Test
    public void testAc() throws Exception {
        // 得到IOC容器對(duì)象
        ApplicationContext ac = new ClassPathXmlApplicationContext("sh/anderson/a_hello/applicationContext.xml");
        // 從容器中獲取bean
        User user = (User) ac.getBean("user");
        
        System.out.println(user);
    }
}

bean對(duì)象創(chuàng)建的細(xì)節(jié)

  • 對(duì)象創(chuàng)建 :
    • scope="singleton" : 默認(rèn)值,即默認(rèn)是單例【service/dao/工具類】
    • scope="prototype" : 多例【Action對(duì)象】
  • 創(chuàng)建時(shí)間 :
    • scope="singleton" : 在啟動(dòng)(容器初始化之前),就已經(jīng)創(chuàng)建了bean,且整個(gè)應(yīng)用只有一個(gè)
    • scope="prototype" : 在用到對(duì)象的時(shí)候,才創(chuàng)建對(duì)象
  • 延遲創(chuàng)建 : (只對(duì)單例有效)
    • lazy-init="false" : 默認(rèn)為false, 不延遲創(chuàng)建,即在啟動(dòng)時(shí)候就創(chuàng)建對(duì)象
    • lazy-init="true" : 延遲初始化,在用到對(duì)象的時(shí)候才創(chuàng)建對(duì)象
  • 對(duì)象創(chuàng)建之后的初始化和銷毀
    • init-method="init_user" : 對(duì)應(yīng)對(duì)象的init_user方法, 在對(duì)象創(chuàng)建愛之后執(zhí)行
    • destroy-method="destroy_user": 在調(diào)用容器對(duì)象的destriy方法時(shí)候執(zhí)行 (容器用實(shí)現(xiàn)類)
  • 示例代碼 :
    @Test
    public void testIOC() throws Exception {
        // 得到IOC容器對(duì)象  【用實(shí)現(xiàn)類,因?yàn)橐{(diào)用銷毀的方法】
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("cn/itcast/a_hello/applicationContext.xml");
        System.out.println("-----容器創(chuàng)建-----");
        
        // 從容器中獲取bean
        User user1 = (User) ac.getBean("user");
        User user2 = (User) ac.getBean("user");
        
        System.out.println(user1);
        System.out.println(user2);
        
        // 銷毀容器對(duì)象 
        ac.destroy();
    }

SpringIOC容器

  • SpringIOC容器,是spring核心內(nèi)容。其作用是創(chuàng)建對(duì)象 & 處理對(duì)象的依賴關(guān)系
  • IOC容器創(chuàng)建對(duì)象:
    • 創(chuàng)建對(duì)象, 有幾種方式:
      1)調(diào)用無參數(shù)構(gòu)造器
      2)帶參數(shù)構(gòu)造器
      3)工廠創(chuàng)建對(duì)象
      • 工廠類,靜態(tài)方法創(chuàng)建對(duì)象
      • 工廠類,非靜態(tài)方法創(chuàng)建對(duì)象
<?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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">  
    <!-- ###############對(duì)象創(chuàng)建############### -->
    <!-- 1. 默認(rèn)無參數(shù)構(gòu)造器 
    <bean id="user1" class="cn.itcast.b_create_obj.User"></bean>
    -->
    <!-- 2. 帶參數(shù)構(gòu)造器, 引用參數(shù)類型一定要寫全名 -->
    <bean id="user2" class="cn.itcast.b_create_obj.User">
        <constructor-arg index="0" type="int" value="100"></constructor-arg>
        <constructor-arg index="1" type="java.lang.String" value="Jack"></constructor-arg>
    </bean>
    <!-- 定義一個(gè)字符串,值是"Jack" ;  String s = new String("jack")-->
    <bean id="str" class="java.lang.String">
        <constructor-arg value="Jacks"></constructor-arg>
    </bean>
    <bean id="user3" class="cn.itcast.b_create_obj.User">
        <constructor-arg index="0" type="int" value="100"></constructor-arg>
        <constructor-arg index="1" type="java.lang.String" ref="str"></constructor-arg>
    </bean>
    <!-- 3. 工廠類創(chuàng)建對(duì)象 -->
    <!-- # 3.1 工廠類,實(shí)例方法 -->
    <!-- 先創(chuàng)建工廠 -->
    <bean id="factory" class="cn.itcast.b_create_obj.ObjectFactory"></bean>
    <!-- 在創(chuàng)建user對(duì)象,用factory方的實(shí)例方法 -->
    <bean id="user4" factory-bean="factory" factory-method="getInstance"></bean>
    <!-- # 3.2 工廠類: 靜態(tài)方法 -->
    <!-- 
        class 指定的就是工廠類型
        factory-method  一定是工廠里面的“靜態(tài)方法”
     -->
    <bean id="user" class="cn.itcast.b_create_obj.ObjectFactory" factory-method="getStaticInstance"></bean>
</beans>      

2)對(duì)象依賴關(guān)系

  • Spring中,如何給對(duì)象的屬性賦值? 【DI, 依賴注入】
    1. 通過構(gòu)造函數(shù)
    2. 通過set方法給屬性注入值
<!-- dao instance -->
    <bean id="userDao" class="cn.itcast.c_property.UserDao"></bean>
    <!-- service instance -->
    <bean id="userService" class="cn.itcast.c_property.UserService">
        <property name="userDao" ref="userDao"></property>
    </bean>
    <!-- action instance -->
    <bean id="userAction" class="cn.itcast.c_property.UserAction">
        <property name="userService" ref="userService"></property>
    </bean>
3) p名稱空間
<?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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    
    <!-- ###############對(duì)象屬性賦值############### -->
    
    <!-- 
        給對(duì)象屬性注入值:
            # p 名稱空間給對(duì)象的屬性注入值
             (spring3.0以上版本才支持)
     -->
     <bean id="userDao" class="cn.itcast.c_property.UserDao"></bean>
     
     <bean id="userService" class="cn.itcast.c_property.UserService" p:userDao-ref="userDao"></bean>
     
     <bean id="userAction" class="cn.itcast.c_property.UserAction" p:userService-ref="userService"></bean>
    
    <!-- 傳統(tǒng)的注入: 
     <bean id="user" class="cn.itcast.c_property.User" >
        <property name="name" value="xxx"></property>
     </bean>
    -->
    <!-- p名稱空間優(yōu)化后 -->
    <bean id="user" class="cn.itcast.c_property.User" p:name="Jack0001"></bean>
</beans>   
4)自動(dòng)裝配(了解)
  - 根據(jù)名稱自動(dòng)裝配:autowire="byName"
- 自動(dòng)去IOC容器中找與屬性名同名的引用的對(duì)象,并自動(dòng)注入
<!-- ###############自動(dòng)裝配############### -->  
    <bean id="userDao" class="cn.itcast.d_auto.UserDao"></bean> 
    <bean id="userService" class="cn.itcast.d_auto.UserService" autowire="byName"></bean>
    <!-- 根據(jù)“名稱”自動(dòng)裝配: userAction注入的屬性,會(huì)去ioc容器中自動(dòng)查找與屬性同名的對(duì)象 -->
    <bean id="userAction" 
class="cn.itcast.d_auto.UserAction" autowire="byName"></bean>
    - 也可以定義到全局, 這樣就不用每個(gè)bean節(jié)點(diǎn)都去寫autowire=”byName”
<?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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd" default-autowire="byName">   根據(jù)名稱自動(dòng)裝配(全局)
    <!-- ###############自動(dòng)裝配############### -->  
    <bean id="userDao" class="cn.itcast.d_auto.UserDao"></bean> 
    <bean id="userService" class="cn.itcast.d_auto.UserService"></bean>
    <bean id="userAction" class="cn.itcast.d_auto.UserAction"></bean>
</beans>   
  - 根據(jù)類型自動(dòng)裝配:autowire="byType"
    - 必須確保改類型在IOC容器中只有一個(gè)對(duì)象;否則報(bào)錯(cuò)
<?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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd" default-autowire="byType">
    <!-- ###############自動(dòng)裝配############### -->  
    <bean id="userDao" class="cn.itcast.d_auto.UserDao"></bean> 
    <bean id="userService" class="cn.itcast.d_auto.UserService"></bean>
    <!-- 如果根據(jù)類型自動(dòng)裝配: 必須確保IOC容器中只有一個(gè)該類型的對(duì)象 -->
    <bean id="userAction" class="cn.itcast.d_auto.UserAction"></bean>
    <!--   報(bào)錯(cuò): 因?yàn)樯厦嬉呀?jīng)有一個(gè)該類型的對(duì)象,且使用了根據(jù)類型自動(dòng)裝配
    <bean id="userService_test" class="cn.itcast.d_auto.UserService" autowire="byType"></bean>
     -->
</beans>  
  - 總結(jié) : Spring提供的自動(dòng)裝配主要是為了簡(jiǎn)化配置; 但是不利于后期的維護(hù)(一般不推薦使用)

5) 注解
  - 注解方式可以簡(jiǎn)化spring的IOC容器的配置!
  - 使用注解步驟:
    1)先引入context名稱空間 : `` xmlns:context="http://www.springframework.org/schema/context" ``
    2)開啟注解掃描 : `` <context:component-scan base-package="cn.itcast.e_anno2"></context:component-scan> ``
    3)使用注解 : 通過注解的方式,把對(duì)象加入ioc容器
      - 創(chuàng)建對(duì)象以及處理對(duì)象依賴關(guān)系,相關(guān)的注解:
        - `` @Component `` : 指定把一個(gè)對(duì)象加入IOC容器
        - `` @Repository `` : 作用同@Component, 在持久層使用
        - `` @Service `` : 作用同@Component, 在業(yè)務(wù)邏輯層使用
        - `` @Controller `` : 作用同@Component, 在控制層使用 
        - `` @Resource `` : 屬性注入
  - 總結(jié):
    1> 使用注解, 可以簡(jiǎn)化配置, 且可以把對(duì)象加入IOC容器及處理依賴關(guān)系(DI)   
    2> 注解可以和XML配置一起使用。

Spring與Struts框架整合

  • SSH整合:

    • Spring與Struts
      • Spring,負(fù)責(zé)對(duì)象對(duì)象創(chuàng)建
      • Struts, 用Action處理請(qǐng)求
      • 關(guān)鍵點(diǎn):讓struts框架action對(duì)象的創(chuàng)建,交給spring完成!
    • Spring與Hibernate
    • 關(guān)鍵點(diǎn) : sessionFactory對(duì)象交給spring創(chuàng)建!
  • 步驟:

    • 引入jar文件
      1)引入struts .jar相關(guān)文件
      2)spring-core 相關(guān)jar文件
      3)spring-web 支持jar包
      • spring-web-3.2.5.RELEASE.jar : Spring源碼
      • struts2-spring-plugin-2.3.4.1.jar : Struts源碼
    • 配置XML
      • struts.xml : struts路徑與action映射配置
      • bean.xml : spring ioc容器配置
      • web.xml : 核心過濾器, 引入struts功能
        【初始化spring的ioc容器】
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容