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仍是駁回去。
_html

<?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了。
_java

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

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

<?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註解,以下面代碼示例所示spring

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容器中,供其餘的類實例化的時候調用。sql

實例化的過程其實就是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並緩存在容器中。apache

相關文章
相關標籤/搜索