1.新建一個maven的web項目,項目結構和pom文件以下:html
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ly.mock</groupId> <artifactId>MockServer</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <mock.version>1.0.0-SNAPSHOT</mock.version> <spring.version>4.2.3.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> <exclusion> <artifactId>log4j</artifactId> <groupId>log4j</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> <exclusions> <exclusion> <groupId>com.sun.jdmk</groupId> <artifactId>jmxtools</artifactId> </exclusion> <exclusion> <groupId>com.sun.jmx</groupId> <artifactId>jmxri</artifactId> </exclusion> <exclusion> <artifactId>jms</artifactId> <groupId>javax.jms</groupId> </exclusion> <exclusion> <artifactId>mail</artifactId> <groupId>javax.mail</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.15</version> </dependency> <!--mysql數據庫驅動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <!-- mybatis-spring整合jar --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <!-- mybatis ORM框架 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.5</version> <type>pom</type> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.4</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.7.2</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.11</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.37</version> </dependency> </dependencies> <build> <finalName>mock_server</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build> </project>
pom文件引入了SpringMvc+Spring+Mybatis+Dubbo+zookeeeper 這些框架的必要jar,值得注意的是以前一直沒忽略dubbo中的spring的一些jar,致使SpringAop一直報錯only available on JDK 1.5 and higher,緣由是dubbo中的內置spring爲2.5,而我自己用的jdk爲1.8,因此屏蔽掉dubbo中的spring一些jar就能夠了。java
2.web.xml配置,由於是最簡單springmvc,因此web.xml只是用來加載下上下文,web.xml配置文件路徑:src\main\webapp\WEB-INF:mysql
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" metadata-complete="false" version="3.1"> <description>TestMock</description> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext.xml,classpath*:dubbo-provider.xml</param-value> </context-param> </web-app>
3.mybatis配置文件和代碼能夠用MyBatis Generator自動生成便可,mybatis的相關代碼和配置以下:web
3.1 數據庫爲mysql,表名books,表結構以下:spring
3.2 mapping文件BookMapper.xml路徑爲resources下的com\ly\mapping,以下:sql
<?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.ly.dao.BookDAO"> <!--id應該是接口中的方法,結果類型如沒有配置別名則應該使用全名稱 --> <!--得到全部圖書 --> <select id="getAllBooks" resultType="com.ly.model.Book"> select id,title,price,publistDate from books </select> <!--得到圖書對象經過編號 --> <select id="getBookById" resultType="com.ly.model.Book"> select id,title,price,publistDate from books where id=#{id} </select> <!-- 增長 --> <insert id="add"> insert into books(title,price,publistDate) values(#{title},#{price},#{publistDate}) </insert> <!-- 刪除 --> <delete id="delete"> delete from books where id=#{id} </delete> <!-- 更新 --> <update id="update"> update books set title=#{title},price=#{price},publistDate=#{publistDate} where id=#{id} </update> </mapper>
3.3 DAO代碼 BookDAO.java以下:shell
package com.ly.dao; import java.util.List; import org.apache.ibatis.annotations.Param; import com.ly.model.Book; public interface BookDAO { /** * 獲取全部圖書 * @return */ public List<Book> getAllBooks(); /** * 根據id獲取圖書 * @param id * @return */ public Book getBookById(@Param("id")int id); /** * 添加圖書 * @param entity * @return */ public int add(Book entity); /** * 根據id刪除圖書 * @param id * @return */ public int delete(int id); /** * 更新圖書 * @param entity * @return */ public int update(Book entity); }
3.4 model代碼 Book.java以下:數據庫
package com.ly.model; import java.util.Date; public class Book { private int id; private String title; private double price; private Date publistDate; public Book(){} public Book(int id, String title, double price, Date publistDate) { this.id = id; this.title = title; this.price = price; this.publistDate = publistDate; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public Date getPublistDate() { return publistDate; } public void setPublistDate(Date publistDate) { this.publistDate = publistDate; } }
3.5 BookServer.java代碼以下:apache
package com.ly.server; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ly.dao.BookDAO; import com.ly.model.Book; @Service public class BookServer { @Autowired private BookDAO bookDAO; public List<Book> getAllBooks() { return bookDAO.getAllBooks(); } public Book getBookById(int id) { return bookDAO.getBookById(id); } }
4. spring配置文件applicationContext.xml 位於 resources下,以下:json
<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 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-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> <!--1 引入屬性文件,在配置中佔位使用 --> <context:property-placeholder location="classpath*:stock.properties" /> <!-- 數據源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="url" value="${mock.jdbc.url}" /> <property name="driverClassName" value="${mock.jdbc.driver}" /> <property name="username" value="${mock.jdbc.username}" /> <property name="password" value="${mock.jdbc.password}" /> <property name="initialSize" value="${mock.jdbc.initialSize}" /> <property name="minIdle" value="${mock.jdbc.minIdle}" /> <property name="maxWait" value="${mock.jdbc.maxWait}" /> <property name="maxActive" value="${mock.jdbc.maxActive}" /> </bean> <!--3 會話工廠bean sqlSessionFactoryBean --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 數據源 --> <property name="dataSource" ref="dataSource"></property> <!-- sql映射文件路徑 --> <property name="mapperLocations" value="classpath:com/ly/mapping/*Mapper.xml"></property> </bean> <!--4 自動掃描對象關係映射 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--指定會話工廠,若是當前上下文中只定義了一個則該屬性可省去,多個數據庫啓用 --> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> <!-- 指定要自動掃描接口的基礎包,實現接口 --> <property name="basePackage" value="com.ly.dao"></property> </bean> <!--5 聲明式事務管理 --> <!--定義事物管理器,由spring管理事務 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!--支持註解驅動的事務管理,指定事務管理器 --> <tx:annotation-driven transaction-manager="transactionManager"/> <!--6 容器自動掃描IOC組件 --> <context:component-scan base-package="com.ly"></context:component-scan> <!--7 aspectj支持自動代理實現AOP功能 --> <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy> </beans>
其中stock.properties中的數據源配置爲你本身的mysql數據庫,個人以下:
mock.jdbc.url = jdbc:mysql://127.0.0.1:5508/mock?useUnicode=true&characterEncoding=UTF-8
mock.jdbc.driver = com.mysql.jdbc.Driver
mock.jdbc.username = mock
mock.jdbc.password = mock
mock.jdbc.initialSize = 1
mock.jdbc.minIdle = 2
mock.jdbc.maxWait = 5000
mock.jdbc.maxActive = 5
具體的applicationContext.xml含義基本有註釋
5. dubbo的配置和代碼
5.1 dubbo配置文件 dubbo-provider.xml 也位於 resources下,zookeeper本身本地安裝一個,以下:
<?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="TestMockServer" /> <!-- 註冊地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 接口的位置 --> <dubbo:service interface="com.ly.server.SayHelloServer" ref="frameService" executes="10" /> <!-- 實現bean,客戶端應用的bean就以這個id名稱爲主 --> <bean id="frameService" class="com.ly.server.impl.SayHelloServerImpl" /> </beans>
5.2 dubbo接口代碼 SayHelloServer.java以下:
package com.ly.server; public interface SayHelloServer { public String sayHello(String hello); }
5.2 接口實現代碼SayHelloServerImpl.java 以下:
package com.ly.server.impl; import com.ly.server.SayHelloServer; public class SayHelloServerImpl implements SayHelloServer { public String sayHello(String hello) { System.out.println("Client: "+ hello); return hello + " Server: "; } }
如今基本上SpringMvc+Spring+Mybatis+Mysql+Dubbo就已經整合完成了,本地下載一個tomcat,把項目打包發佈到tomcat下啓動,就能在dubbo的monitor中發現該項目的SayHelloServer接口已經註冊在zk上面了。
附上個人自動發佈shell腳本,一個很簡單的shell腳本:
#!/bin/sh #判斷進程存在 tomcatId=0 tomcatID=`ps -ef | grep org.apache.catalina.startup.Bootstrap | grep -v grep | awk '{print $2}'` echo "MockServer tomcat is " $tomcatID if [ -n "$tomcatID" ];then echo 'current tomcat pid is:'$tomcatID kill -15 $tomcatID && echo "MockServer kill -15" kill -9 $tomcatID && echo "MockServer kill -9" else echo $sysName " not start" fi sleep 2 #編譯 cd /Users/ly/Documents/workspace/MockServer mvn clean install -Dmaven.test.skip=true -U sleep 5 #部署本地 cd target rm -rf /Users/ly/tomcat/apache-tomcat-9.0.4/webapps/ROOT/* unzip -q mock_server.war -d /Users/ly/tomcat/apache-tomcat-9.0.4/webapps/ROOT/ nohup sh /Users/ly/tomcat/apache-tomcat-9.0.4/bin/startup.sh & sleep 3 echo "MockServer is starting......"