Spring項目的配置文件們(web.xml context servlet springmvc)


我們的spring項目目前用到的配置文件包括
1--web.xml文件,這是java的web項目的配置文件。我理解它是servlet的配置文件,也就是說,與spring無關。即使你開發的是一個純粹jsp頁面的web項目,你也必須配置這個文件。
我們的java web項目肯定寫了很多servlet代碼,這些servlet需要運行在servlet容器中,這個容器就是tomcat的重要組件。也就是,你的web項目需要運行在tomcat中,那么你必須提供一個web.xml文件作為配置文件。
在這個文件中,通過context,也就是上下文,配置Spring。
同樣filter,和servlet同等級別的概念的這個元素,也直接配置在web.xml中,因為filter是java中的web項目中本身就有的概念,而不是spring中才導入的概念。filter的意思就是看看request,不修改也不響應,但是可以對request中的信息進行匹配,看看是真的要交給servlet還是駁回去。
_

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>RepositoryCheck HUB</display-name> <!-- dao和service層的Spring配置文件 --> <!-- access的配置文件是accessContext.xml; mysql的配置文件是mysqlContext.xml --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/mysqlContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- web層的Spring配置文件 --> <servlet> <servlet-name>ruku</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ruku</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <!-- 過濾器 編碼 防止中文亂碼 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>*.html</url-pattern> </filter-mapping> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <!-- 默認入口訪問文件 --> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>

2--applicationContext文件,我們指的是Spring容器最基礎的配置文件,名字可以隨便起,但是整個項目被發布以后,它的默認位於WEB-INFclasses目錄下。開發的過程中可以在web.xml文件中通過contextparam來配置這個文件的路徑。它是spring進行依賴注入、事務管理等基礎功能的配置文件。配置數據源啦,jdbcTemplate啦,都要依靠這個。比如你正在開發一個與web無關的數據庫增刪改查的spring項目,那么只需要用這個配置文件就可以了。
SpringMVC並沒有在這個文件中配置,SpringMVC的配置文件是一個單獨的xml文件,該文件通過web.xml文件中的servlet元素配置,或者說SpringMVC的本質是Spring公司實現的一個servlet,我們在開發的一開始,通過web.xml文件將這個servlet導入了我們的項目,於是我們就可以使用spring MVC了。
_

3--[name]-servlet.xml配置文件,我指的是SpringMVC的配置文件,通常該文件位於WEB-INF目錄下,它的作用是配置Spring MVC,充當整個web項目的pipeline-value中的basevalue的角色,也就是最終的servlet。

上述內容,是我們開發的spring的web項目中用到的主要的配置文件,從上述內容我們可以看出來,和數據庫連接有關的內容,也就是數據源的配置,發生在第二個配置文件,也就是applicatioinContext.xml文件中(名字可以改),
_
我們來看看其中一個mysqlContext.xml文件的內容:

<?xml version="1.0" encoding="UTF-8"?> <!-- mysql dao和service層的Spring配置文件 --> <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" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans classpath:/org/springframework/beans/factory/xml/spring-beans.xsd http://www.springframework.org/schema/context classpath:/org/springframework/context/config/spring-context.xsd http://www.springframework.org/schema/aop classpath:/org/springframework/aop/config/spring-aop.xsd http://www.springframework.org/schema/tx classpath:/org/springframework/transaction/config/spring-tx.xsd"> <context:component-scan base-package="com.tsmi.mysql.dao"/> <context:component-scan base-package="com.tsmi.mysql.service"/> <context:component-scan base-package="com.tsmi.mysql.web"/> <!-- 配置mysql數據源 --> <bean id="dsmysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:6062/test2?useSSL=true&amp;characterEncoding=utf8&amp;serverTimezone=UTC" p:username="root" p:password="密碼不告訴你機密" p:defaultAutoCommit="true" /> <!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dsmysql" /> <!-- 配置JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dsmysql" /> </beans> 

我們的項目同時連接了mysql和access數據庫,上述配置文件時間上是mysql的配置文件部分。
我們都知道spring的配置有三種:基於xml,基於注解,基於java類。但是最常用的是第二種,基於注解的配置。
教材中也明確的說:筆者一般采用xml配置DataSource等資源Bean,在XML中利用aop,context命名空間進行相關主題的配置。但是所有項目中開發的Bean都通過基於注解的方式進行配置,也就是整個項目少量使用XML方式,大量使用基於注解方式,完全不采用java類方式。
通過我們自己開發的dao,service代碼我們也可以看出來,因為大量使用了@Autowired注解,如下面代碼示例所示

package com.tsmi.RepositoryCheck.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.stereotype.Repository; import com.tsmi.RepositoryCheck.domain.Lifnr; @Repository public class LifnrDao { /** * 聲明JdbcTemplate的一個變量 */ private JdbcTemplate jdbcTemplate; /** * @param 注入JdbcTemplate的變量的實例 */ @Autowired public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } final static String SELECT_ALL = "select * from 供應商評價等級"; /** * 獲取所有 * 供應商等級評價 * @return */ public List<Lifnr> getPernr(){ final List<Lifnr> prs = new ArrayList<Lifnr>(); jdbcTemplate.query(SELECT_ALL, new Object[] { }, new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { Lifnr pr = new Lifnr(); pr.setSn(rs.getInt("編號")); pr.setsName(rs.getString("供應商名稱")); pr.setsLevel(rs.getString("供應商評價等級")); pr.setsEval(rs.getString("供應商月度評價")); pr.setsMonth(rs.getString("評價月份")); prs.add(pr); } }); return prs; } }

我們聲明變量,然后通過注解的方式,用@Autowired為變量實例化,用@Repository將類注冊到spring容器中,供其他的類實例化的時候調用。

實例化的過程其實就是Spring的IOC容器按照某種規則對容器中的bean進行自動裝配,這種裝配不是顯式的方式進行的依賴配置,是自動裝配。那么裝配的規則是怎樣的呢?也就是,IOC容器根據什么做判斷,誰裝配給誰呢?
這其中最重要的就是mysqlContext.xml文件中的beans和bean元素,這兩個元素都可以添加autowire屬性,用來設置“自動裝配類型”。
基於注解的配置方式中,默認采用autowire=byType這種策略進行自動裝配。(記住是默認啊,就是這個屬性壓根不用出現在你的配置文件的bean中都可以,默認)
那么byType是什么意思呢?
假如說,我們要實例化的bean是一個JdbcTemplate,如果容器中剛好有一個JdbcTemplate,Spring就會將這個裝配給需要被實例化的那個變量。
現在的問題是,假如我們在容器中已經有了兩個備選的JdbcTemplate等着呢,容器怎么判斷用哪個去實例化變量呢?

容器中已經有了兩個備選的bean,怎么選?我覺得我們首先要搞清楚一下,默認情況下spring中的bean的作用域的問題。
教材5.8節表示,spring中bean的默認作用域是singleton,singleton的含義是說,在spring IOC容器中只存在一個bean的實例,bean以單例的方式存在。spring利用AOP和LocalThread功能,對非線程安全的變量進行處理,變成了線程安全。
Spring的ApplicationContext容器啟動時,會自動實例化所有singleton的bean並緩存在容器中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM