使用spring集成其他技術(shù)仙蛉,最基本的配置都是模板化的,比如配置視圖模板引擎碱蒙、數(shù)據(jù)庫連接池荠瘪、orm框架、緩存服務赛惩、郵件服務巧还、rpc調(diào)用等,以spring的xml配置為例坊秸,我將這些配置過程整理出來麸祷,并不時更新,以備參考褒搔!
spring
在普通的java工程中引入spring阶牍,只需要配置以下依賴
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.17.RELEASE</version>
</dependency>
實際開發(fā)中喷面,如果你用了log4j等日志框架,最好排除掉spring對commons-logging的依賴走孽,寫demo就不用了
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
建一個spring-conf.xml惧辈,放在src/main/java目錄(也就是所有包和類的根目錄,即classpath)磕瓷,內(nèi)容如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.xmyself.Test" />
</beans>
建一個Test.java類盒齿,這個類就是spring-conf.xml文件中定義的那個bean
package com.xmyself;
public class Test {
public void test() {
System.out.println("spring is running");
}
}
寫帶有main方法的主類
package com.xmyself;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
@SuppressWarnings("resource")
ApplicationContext context = new ClassPathXmlApplicationContext("spring-conf.xml");
Test test = context.getBean(Test.class);
test.test();
}
}
運行Main,就能看到“spring is running”輸出困食,spring配置完成
spring mvc
spring mvc是配置在web工程中的边翁,使用spring mvc也只要配置一個依賴
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.17.RELEASE</version>
</dependency>
整一個Test.java類,這是個controller
package com.xmyself.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class Test {
@RequestMapping("/test")
@ResponseBody
public String test() {
return "spring mvc running";
}
}
在src/main/resources目錄下建一個spring目錄硕盹,里面放一個mvc-init.xml符匾,內(nèi)容如下
<?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">
<context:component-scan base-package="com.xmyself.controller" />
</beans>
這個配置文件掃描了Test.java,最后修改web.xml來加載這個配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>spring3mvc</display-name>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/spring/mvc-init.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
初始化DispatcherServlet如果沒有指定xml文件地址瘩例,spring默認去WEB-INF目錄找[servlet-name]-servlet.xml啊胶,這里就是spring-servlet.xml
啟動工程,瀏覽器訪問 http:localhost:8080/springmvc/test 就能看到返回 test 值了垛贤,spring mvc配置完成
freemarker模板引擎
spring mvc通常要配置模板引擎焰坪,因為jsp太復雜了,而且有損mvc模型
freemarker是一種嚴格遵循mvc模型的模板引擎聘惦,現(xiàn)在介紹它的spring mvc中的配置
首先配置依賴
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.17.RELEASE</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
為什么要依賴spring-context-support某饰?因為freemarker使用的視圖解析器是由spring提供的,這個解析器就在spring-context-support的jar中部凑,下面的配置過程會讓你明白露乏,在spring mvc的mvc-init.xml中配置freemarker
<!-- freemarker config -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/page/" />
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="suffix" value=".ftl" />
<property name="contentType" value="text/html; charset=UTF-8" />
</bean>
配置freemarker的本質(zhì)是初始化上面的兩個bean,所以涂邀,你可以把這段配置寫在任意的xml文件瘟仿,只要spring mvc能加載就行
在WEB-INF目錄建一個page目錄,里面放一個freemarker.ftl文件比勉,內(nèi)容只有一句話“freemarker page 中文亂碼測試”
最后劳较,在控制器寫一個方法
@RequestMapping("/freemarker")
public String freemarker() {
return "freemarker";
}
啟動工程,訪問 http://localhost:8080/springmvc/freemarker
就能看到『freemarker page 中文亂碼測試』這句話了
thymeleaf模板引擎
thymeleaf
也是一個mvc模型的模板引擎浩聋,它的后綴是.html观蜗,所以thymeleaf模板的好處是不用渲染就能看到內(nèi)容,現(xiàn)在spring也是推薦用thymeleaf作為spring mvc的模板引擎
配置依賴
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring3</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
這是thymeleaf與spring連接用的jar衣洁,它依賴了thymeleaf的jar墓捻,對于spring3和spring4,thymeleaf的依賴是不同的坊夫,配置也稍有不同,這點要注意,下面就開始配置thymeleaf
<!-- thymeleaf config -->
<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".html" />
<property name="templateMode" value="HTML5" />
</bean>
<bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
<property name="templateResolver" ref="templateResolver" />
</bean>
<bean class="org.thymeleaf.spring3.view.ThymeleafViewResolver">
<property name="templateEngine" ref="templateEngine" />
<property name="characterEncoding" value="UTF-8" />
</bean>
這段配置放在spring mvc能讀到的任意xml文件都可以
在WEB-INF目錄建一個page目錄西壮,里面放一個thymeleaf.html,內(nèi)容只有一行“thymeleaf page 中文亂碼測試”
最后十饥,在控制器寫一個方法
@RequestMapping("/thymeleaf")
public String thymeleaf() {
return "thymeleaf";
}
啟動工程,訪問 http://localhost:8080/springmvc/thymeleaf就能看到“thymeleafpage 中文亂碼測試”這句話了
tomcat pool數(shù)據(jù)庫連接池
可能用dbcp、c3p0連接池的人多一點,其實tomcat pool更好渡紫,具體怎么好請google,下面介紹針對mysql數(shù)據(jù)庫的配置過程
配置依賴
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>7.0.73</version>
</dependency>
tomcat-jdbc依賴了tomcat-juli考赛,所以如果你在eclipse中為工程加入了tomcat的庫惕澎,還需要單獨加一個tomcat-juli的jar
下面整一個Main.java來測試連接
package com.xmyself;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;
public class Main {
public static void main(String[] args) throws Exception {
PoolProperties p = new PoolProperties();
p.setUrl("jdbc:mysql://localhost:3306/mysql");
p.setDriverClassName("com.mysql.jdbc.Driver");
p.setUsername("root");
p.setPassword("root");
p.setJmxEnabled(true);
p.setTestWhileIdle(false);
p.setTestOnBorrow(true);
p.setValidationQuery("SELECT 1");
p.setTestOnReturn(false);
p.setValidationInterval(30000);
p.setTimeBetweenEvictionRunsMillis(30000);
p.setMaxActive(100);
p.setInitialSize(10);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(60);
p.setMinEvictableIdleTimeMillis(30000);
p.setMinIdle(10);
p.setLogAbandoned(true);
p.setRemoveAbandoned(true);
p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"
+ "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
DataSource datasource = new DataSource();
datasource.setPoolProperties(p);
Connection con = null;
try {
con = datasource.getConnection();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select * from user");
int cnt = 1;
while (rs.next()) {
System.out.println((cnt++) + ". Host:" + rs.getString("Host")
+ " User:" + rs.getString("User") + " Password:"
+ rs.getString("Password"));
}
rs.close();
st.close();
} finally {
if (con != null)
try {
con.close();
} catch (Exception ignore) {
}
}
}
}
這個例子是tomcat官方文檔給出的,運行結(jié)果如下
1. Host:localhost User:root Password:*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
2. Host:127.0.0.1 User:root Password:*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
3. Host:::1 User:root Password:*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
4. Host:localhost User: Password:
5. Host:% User:root Password:*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
那spring怎么集成tomcat pool呢欲虚?配置xml讓spring加載就好了
<bean id="datasource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
<property name="url" value="jdbc:mysql://localhost:3306/mysql" />
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
這里配置的屬性與官方例子set方法中的屬性完全相同集灌,其余的我就不配置了
然后寫一個測試悔雹,這里以spring mvc為例复哆,寫一個controller,具體代碼與上例相同
@Controller
public class Test {
@Autowired
private DataSource datasource;
@RequestMapping("/test")
@ResponseBody
public String test() throws Exception {
Connection con = datasource.getConnection();
// 拿到con就可以操作了
return "spring mvc running";
}
}
mybatis持久化框架
mybatis輕量級腌零,配置簡單梯找,使用方便,我們在tomcat pool基礎上來配置益涧,當然锈锤,使用tomcat pool配置只是為了得到dataSource,如果你用dbcp闲询、c3p0等連接池久免,只要修改下這個dataSource的配置就好,mybatis本身的配置不用修改
配置依賴
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
我們定義一個TestDao.java
接口扭弧,這就是mybatis要實現(xiàn)的東西
package com.xmyself.dao;
public interface TestDao {
public String test();
}
在src/main/resources
目錄建一個mapper
目錄阎姥,里面放一個TestDao.xml
,內(nèi)容如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xmyself.dao.TestDao">
<select id="test" resultType="java.lang.String">
select "test"
</select>
</mapper>
mybatis通過一個xml文件實現(xiàn)了TestDao.java接口鸽捻,很顯然呼巴,這個實現(xiàn)過程肯定要用到dataSource,接下來的配置就是將TestDao.java御蒲、TestDao.xml衣赶、dataSource三者關(guān)聯(lián)起來,在spring的xml配置文件(哪個配置文件沒關(guān)系厚满,只要spring能加載)添加如下內(nèi)容
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
<property name="url" value="jdbc:mysql://localhost:3306/mysql" />
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:mapper/*.xml" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.xmyself.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
這個配置我其實有點疑惑府瞄,TestDao.xml中有對TestDao.java接口的聲明,所以應該只需要將dataSource與TestDao.xml做關(guān)聯(lián)就夠了碘箍,但實際上我沒有找到這種方式
這時候啟動工程遵馆,spring加載過程會報錯续崖,其實我是故意的,_
Caused by: java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean
因為spring內(nèi)部沒有直接對mybatis的支持团搞,所以需要依賴中間層jar包严望,另外,還需要spring-jdbc提供對dao的支持
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.17.RELEASE</version>
</dependency>
我們整一個類來測試吧逻恐,還是以spring mvc為例像吻,整一個controller
@Controller
public class Test {
@Autowired
private TestDao testDao;
@RequestMapping("/test")
@ResponseBody
public String test() throws Exception {
System.out.println(testDao.test());
return "spring mvc running";
}
}
瀏覽器訪問 http://localhost:8080/springmvc/test
就能看到后臺輸出“test”,mybatis配置完成
redis緩存服務
redis是一種key-value非關(guān)系型數(shù)據(jù)庫复隆,特點是運行于內(nèi)存中拨匆,速度快,作為緩存服務器非常不錯
java對redis數(shù)據(jù)庫的訪問是通過jedis完成的
配置依賴
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
初始化jedis連接挽拂,假設redis服務器地址為:192.168.253.128惭每,端口:6379
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="100" />
<property name="maxTotal" value="300" />
<property name="maxWaitMillis" value="1000" />
<property name="testOnBorrow" value="true" />
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1" value="192.168.253.128" type="java.lang.String" />
<constructor-arg index="2" value="6379" type="int" />
</bean>
這段代碼放在哪沒關(guān)系,只要spring能加載到亏栈,注意台腥,構(gòu)造器注入一定要指明type類型然后我們整一個類來測試,以spring mvc為例绒北,整一個controller
@Controller
public class Test {
@Autowired
private JedisPool pool;
@RequestMapping("/test")
@ResponseBody
public String test() {
Jedis redis = pool.getResource();
redis.set("test", "test");
System.out.println(redis.get("test"));
return "spring mvc running";
}
}
瀏覽器訪問 http://localhost:8080/springmvc/test
黎侈,就能看到后臺輸出“test”,jedis配置完成
dubbo分布式服務
dubbo是阿里巴巴開源的分布式rpc框架闷游,現(xiàn)在假設服務提供方正常工作峻汉,我們只配置在spring中使用dubbo服務
配置依賴,假設dubbo使用zookeeper作為注冊中心
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.4</version>
<exclusions>
<exclusion>
<artifactId>org.apache.zookeeper</artifactId>
<groupId>zookeeper</groupId>
</exclusion>
<exclusion>
<artifactId>zookeeper</artifactId>
<groupId>org.apache.zookeeper</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
在src/main/resources的spring目錄放一個dubbo-client.xml
脐往,內(nèi)容如下
<?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:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 服務名稱 -->
<dubbo:application name="dubbo-demo" />
<!-- 注冊中心 -->
<dubbo:registry protocol="zookeeper" address="172.17.210.124:2181" />
<!-- 服務接口 -->
<dubbo:reference id="demoService" interface="org.dubbo.demo.client.DemoService" version="0.0.1" />
</beans>
然后讓spring加載dubbo-client.xml
<import resource="classpath*:/spring/dubbo-client.xml" />
啟動工程休吠,DemoService接口提供的方法就可以用了,就像調(diào)用本地方法一樣
@Controller
public class Test{
@Autowired
private DemoService demoService;
@RequestMapping("/test")
@ResponseBody
public String test() {
return demoService.test("dubbo-demo-test");
}
}
當然业簿,服務使用者需要拿到服務提供者聲明服務接口的jar瘤礁,在公司內(nèi)部,這通常也是一個依賴
<dependency>
<groupId>com.xmyself</groupId>
<artifactId>dubbo-demo-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>