1. 程式人生 > >Spring相關知識點

Spring相關知識點

Spring

   目的:  解決企業應用開發的複雜性    功能:  使用基本的JavaBean代替EJB,並提供了更多的企業應用功能    範圍:  任何java應用   簡單來說,Spring是一個輕量級的控制反轉(IOC)和麵向切面(AOP)的容器框架

1.輕量: Spring是輕量的,基本版本大約2MB 

2.IOC(控制反轉):         之前我們都是自己建立物件,管理物件.控制反轉就是將物件的管理交給spring,我們只需要使用物件即可. 實現了鬆散耦合 

3.DI(依賴注入):        IOC的一個特殊體現.我們在使用A物件時,在A的內部必須依賴B的物件,我們在獲取A物件時,將B物件就注入到A物件中 

4.AOP(面向切面的程式設計):         對面向物件的一個完善和補充,就是將面向物件中各個不同的業務模組需要使用到的共同的功能提取出來,通過動態代理模式在不影響現有的業務模組的前提下,為業務模組擴充套件功能. 所以一般AOP就是用在一些系統級別的功能配置上. 

5.容器: Spring 包含並管理應用中物件的生命週期和配置 

6.MVC框架: Spring在原有的基礎上,有提供了web應用的MVC模組. 

7.事務管理:

         Spring提供了一個持續的事務管理介面,可以擴充套件上至本地事務下至全域性事務. 

8.異常處理:

Spring提供方便的API把具體技術異常相關的異常

     (比如由JDBC,Hibernate or JDO丟擲的)轉化為一致的unchecked 異常。

Spring中hibernate的配置 

<!--sessionFactory.xml-->
<!-- 配置hibernate session工廠類似於 cfg 配置 -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 其它配置 -->
        <property name="hibernateProperties">
            <props>
                <!-- 資料庫方言 -->
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
                <!-- 自動建表 -->
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <!-- 控制檯是否顯示sql語句 -->
                <!--show_sql: 是否把hibernate執行的sql語句顯示到控制檯 -->
                <prop key="hibernate.show_sql">true</prop>
                <!-- format_sql:輸出到控制檯的sql語句是否進行排版,便於閱讀 -->
                <prop key="hibernate.format_sql">true</prop>
            </props>
        </property>

        <!-- 交由註解掃描實體類,省去了以前hibernate的配置檔案,自動生成資料表 -->
        <property name="packagesToScan" value="com.xalo.model." />
    </bean>

<!--spring中hibernate事務配置 -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!--設定事務通知中的方法 -->
    <tx:advice transaction-manager="transactionManager" id="tx">
        <tx:attributes>     
            <tx:method name="*" read-only="false" />
        </tx:attributes>
    </tx:advice>    
    <!--哪些方法需要新增增強功能 -->
       <!-- aop配置 代理配置 proxy-target-class:不使用自動代理 -->
    <aop:config proxy-target-class="false">
     <!-- 切入點的配置 expression:要額外增加功能的方法 返回值 包名 類名 方法名-->
        <aop:pointcut expression="execution(* com.xalo.daoImpl.*.*(..))" id="mypointcut" />
        <!--環繞增強 -->
        <aop:advisor advice-ref="tx" pointcut-ref="mypointcut" />
    </aop:config>
    <!-- 自動指定代理 -->
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

<!--dataSource.xml-->
 <!-- 四本設定 -->
    <!-- 配置資料來源,資料庫連線池配置 -->
     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
         <!-- 資料庫驅動 -->
       <property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
        <!-- 資料庫地址 -->
        <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/MHMS?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false"/>
        <!-- 資料庫使用者名稱 -->
        <property name="user" value="root"/>
        <!--資料庫密碼 -->
        <property name="password" value="12345678"/>

        <property name="maxPoolSize" value="10"></property>
        <property name="minPoolSize" value="3"></property>
         <property name="maxIdleTime" value="600"></property>
         <property name="initialPoolSize" value="3"></property>
         <property name="acquireIncrement" value="5" />
         <property name="checkoutTimeout" value="300000"></property>
         <property name="idleConnectionTestPeriod" value="800"></property>
         <property name="acquireRetryAttempts" value="30" /> 
         <property name="maxStatements" value="0" />
         <property name="breakAfterAcquireFailure" value="false" />
     </bean>

什麼是Spring IOC容器: 

       之前我們都是自己建立物件,管理物件.控制反轉就是將物件的管理交給spring,我們只需要使用物件即可. 實現了鬆散耦合.        Spring IOC負責建立物件,管理物件(通過依賴注入(DI),裝配物件,配置物件,並且管理這些物件的整個生命週期). 

IOC的優點: 

       IOC把應用的程式碼量降到最低,使應用容易測試,單元測試不在需要單例和JND查詢機制.最小的代價和最小的侵入性使鬆散耦合得以實現.IOC容器支援載入時的惡漢式初始化和懶載入. 

Bean常用的屬性: 

autowire(自動裝配):       Spring簡化了Bean的配置,提供了自動裝配(autowire)機制,Spring本身為autowire屬性提供了五個選項: 1.no:

預設不採用autowire機制. 我們需要使用依賴注入,只能用標籤 2.byName:  

通過屬性的名稱自動裝配(注入). 3.byType:

           通過型別自動裝配(注入)        如果容器中包含多個這個型別的bean,Spring將會丟擲異常.如果沒有找到這個型別 的bean,那麼注入動作將不會執行. 4.constructor:

       通過建構函式的引數型別來匹配(注入), 如果在容器中找不到匹配的類的bean,將丟擲異常,因為Spring無法呼叫建構函式例項化這個bean 5.default:

       採用父級標籤(即beans的default-autowire屬性)的配置. 其中byType和constructor模式也支援陣列和強型別集合(指定集合元素型別).如果集合和Map集合,那麼Map的key必須是String型別. 

scope: spring支援的幾種bean的作用域 1.singleton:

單例模式 預設, bean在每個Spring IOC容器中只有一個例項 在beanFactory作用範圍內,只維護此bean的一個例項.在伺服器啟動時建立.主要用於service dao層還有一些utils工具類,只需要在伺服器啟動時初始化一次即可. 2.prototype:

原型模式,一個bean的定義可以有對個例項 每次getBean獲取物件時,都重新例項化一個物件.在SSH專案中主要作用於action物件,這種方式一般在伺服器啟動時不會建立物件,在每次使用時才會建立. 3.request:

      將該物件放在request域中 4.session:

將物件放在session域中 5.global session:

      全域性session

什麼是Spring 的依賴注入,有哪些方法進行依賴注入 

       IOC的一個特殊體現.我們在使用A物件時,在A的內部必須依賴B的物件,我們在獲取A物件時,將B物件就注入到A物件中  1.Setter注入: 根據property標籤的name屬性的值去找對應的setter方法

 <bean id="setter" class="com.xalo.action.SetterAction">
       <property name="loginService" ref="service" />
  </bean>

2.構造器注入:    保證了一些必要的屬性在Bean例項化時就設定,並且確保了bean例項在例項化後就可以使用         1.在類中,不用為屬性設定setter方法,只需要提供構造方法即可         2.在構造檔案中配置該類bean,並配置構造器,在配置構造器中使用         缺點: 不夠靈活,會影響物件的建立效率

<bean id="action" class="com.xalo.action.LoginAction">
      <constructor-arg name="loginService" ref="service" ></constructor-arg>
 </bean> 

3.靜態工廠注入  4.例項化工廠注入 

Spring應用程式看起來像什麼 

一個定義功能的介面  實現包括屬性,setter和getter方法,功能等  Spring AOP  Spring的XML配置檔案  使用該功能的客戶端程式設計  依賴注入 

BeanFactory和ApplicationContext區別 

BeanFactory:Spring裡面最底層的介面,提供了最簡單的容器的功能,只提供了例項化物件和拿物件的功能  ApplicationContext: 應用上下文,繼承BeanFactory介面,它是Spring的更高級別的容器,提供了更多的有用的功能.        (1)國際化        (2)訪問資源       (3)載入多個(有繼承關係)上下文,使得每一個上下文都專注於一個特定的層次,比如應用的web層  BeanFactory在啟動時不會去例項化Bean,在容器中拿Bean的時候才會去例項化  ApplicationContext在啟動的時候就把所有的Bean全部例項化了.它還可以為Bean配置lazy-int=true來讓Bean延遲例項化.  常見的ApplicationContext實現方式:         1.ClassPathXmlApplicationContext:  從classpath的XML配置檔案中讀取上下文,並生成上下文定義.應用程式上下文從程式環境變數中取得  ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);        2、FileSystemXmlApplicationContext :由檔案系統中的XML配置檔案讀取上下文。  ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);        3、XmlWebApplicationContext:由Web應用的XML檔案讀取上下文。 

Spring Bean的生命週期 

Spring Bean factory負責管理在spring容器中被建立的bean的生命週期.  Bean的生命週期由兩組(call back) 方法組成

//初始化之前呼叫的回撥方法
//銷燬之前呼叫的回撥方法

Spring框架提供了以下四種方式來管理bean的生命週期事件:

InitializingBean和DisposableBean回撥介面
針對特殊行為的其他Aware介面
Bean配置檔案中的Custom init()方法和destroy()方法
@PostConstruct和@PreDestroy註解方式
<beans>
    <bean id="demoBean" class="com.howtodoinjava.task.DemoBean"
            init-method="customInit" destroy-method="customDestroy"></bean>
</beans>

Spring框架中的單例Beans是執行緒安全的嗎? 

       Spring框架並沒有對bean進行任何多執行緒的封裝處理.  如果你的bean有多中狀態的話(比如 View Model物件),就需要自行保證執行緒安全. 

如何在Spring中注入一個Java Collection? 

Spring提供了以下四種集合類的配置元素:

<list> :   該標籤用來裝配可重複的list值。
<set> :    該標籤用來裝配沒有重複的set值。
<map>:   該標籤可用來注入鍵和值可以為任何型別的鍵值對。
<props> : 該標籤支援注入鍵和值都是字串型別的鍵值對。

Spring框架中都用到的設計模式

/*
 *代理模式:在AOP和remoting中被用的比較多
 *單例模式:在spring配置檔案中定義的bean預設為單例模式
 *模板方法:用來解決程式碼重複的問題.比如: RestTemplate, JmsTemplate, JpaTemplate
 *前端控制器: Spring提供了DispatcherServlet來對請求進行分發
 *檢視幫助(View Helper):Spring提供了一系列的JSP標籤,來輔助將分散的程式碼整合在視圖裡
 *依賴注入:貫穿於BeanFactory/ApplicationContext介面的核心理念
 *工廠模式: BeanFactory用來建立物件的例項
 */

Spring支援的事務管理型別: 

程式設計式事務管理: 通過程式設計的方式管理事務,靈活性高,但很難維護 
宣告式事務管理: 將事務管理和業務程式碼分離.只需要通過註解或者XML配置管理事務. 

Spring事務管理有哪些優點? 

   1.為不同的事務API(JTA, JDBC, Hibernate, JPA, JDO)提供了統一的程式設計模式     2.為程式設計式事務提供了一個簡單的API而非一系列複雜的事務API(如JTA)     3.支援宣告式事務管理     4.可以和Spring的多種資料訪問技術很好的融合 

Spring常用的註解?

<!--在Spring的IOC容器中指定一個dao層的bean,如果value不指定預設該物件為id的類名,如果指定,id為value的值-->
@Repository(value = "userDao")

<!--依賴注入:-->
@Autowire:  預設為byType  required:如果找不到bean注入ture(預設) 異常false: 不注入即可,不會報異常.
@Qualifier: 配合上面的註解使用,byName
@Resourse: javaEE提供的依賴注入的註解 1.6之後才可以使用

@Service("userService")

<!--將當前實體交給spring管理   等同於在IoC中配置了--><bean id="FirstController" class="包名.類名">
<!--value作用指定bean的id名稱,如果不指定預設為類名,如果Controller中只配置value,可以省略value直接寫值
     表明當前是一個處理器-->
@Controller("userAction") 

<!--action是多例模式,需要將scope設定為原型模式-->
@Scope("prototype")  

<!--如果我們只是給前端返回json資料,並不進行頁面的跳轉,package就繼承自json-default
     要使用json-default包需要匯入struts2的json外掛(struts2-json-plugin-jar)-->
@ParentPackage("json-default")

@Namespace("/user")

<!--接收前端傳遞過來的資料-->
@ResponseBody

@Action(value = "updateUser", results = { @Result(name = "success", type = "json", params = { "root", "result" }) })
    // 修改使用者資訊
    public String updateUser() {
        // System.out.println(user);
        System.out.println("都是:" + user);
        result = userService.updateUser(user);
        System.out.println(result);
        return SUCCESS;
    }