maven+spring mvc+mybatis+redis+dubbo+zookeeper

黎孟陽

隨筆 - 6, 文章 - 0, 評論 - 0, 引用 - 0html

maven+spring mvc+mybatis+redis+dubbo+zookeeper

 

 

 

 

前面文章講了建立一個maven聚合工程。接下來說一下maven裏面集成spring mvc+mybatis+dubbo+zookeeper。本章內容只講配置,不講原理性的東西,不理解的地方多百度就清楚了。java

 上章地址:http://www.cnblogs.com/MrLimy/p/8342026.htmlmysql

 

爲了方便,本章內容所依賴的jar包都放在父工程。linux

 

 

打開demo工程的pom.xml文件添加依賴,本章只添加spring、redis、dubbo的依賴。git

 

複製代碼

<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.hpsoft.demo</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1</version>
  <packaging>pom</packaging>
  <modules>
      <module>demo_web</module>
      <module>demo_service</module>
  </modules>
  
  <properties>
        <!-- spring版本號 -->
        <spring.version>3.2.4.RELEASE</spring.version>
        <!-- log4j日誌文件管理包版本 -->
        <slf4j.version>1.6.6</slf4j.version>
        <log4j.version>1.2.12</log4j.version>
        <!-- junit版本號 -->
        <junit.version>4.10</junit.version>
        <!-- mybatis版本號 -->
        <mybatis.version>3.2.1</mybatis.version>
        <!-- shiro版本號 -->
        <shiro.version>1.2.2</shiro.version>
        <!-- 打包編碼錯誤加下面這行 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencies>
        <!-- 添加Spring依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</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-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</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-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!--單元測試依賴 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

        <!-- logback start -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.2</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.logback-extensions</groupId>
            <artifactId>logback-ext-spring</artifactId>
            <version>0.1.1</version>
        </dependency>

        <!--spring單元測試依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
            <scope>test</scope>
        </dependency>

        <!--mybatis依賴 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>

        <!-- mybatis/spring包 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.0</version>
        </dependency>

        <!-- mysql驅動包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.29</version>
        </dependency>

        <!-- 添加分佈插件的包pagehelper -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>4.0.0</version>
        </dependency>

        <!-- 添加json的依賴包 -->
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.3</version>
            <classifier>jdk15</classifier>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-commons</artifactId>
            <version>1.6.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.4.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.34</version>
        </dependency>

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.0.1.Final</version>
        </dependency>

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.9</version>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.0.Final</version>
        </dependency>
        <!-- redis開始 -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.3.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.4.2</version>
        </dependency>
        <!-- redis結束 -->

        <!-- dubbo開始 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- dubbo結束 -->

        <!-- zookeeper開始 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!-- zookeeper結束 -->

      
    </dependencies>


    <build>
        <!-- 配置將properties時的變量用pom.xml裏的變量賦值替換 -->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <targetPath>${basedir}/target/classes</targetPath>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <targetPath>${basedir}/target/resources</targetPath>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>


        <!-- </plugins> -->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <configuration>
                    <warSourceExcludes>${warExcludes}</warSourceExcludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.4.3</version>
                <configuration>
                    <testFailureIgnore>true</testFailureIgnore>
                </configuration>
            </plugin>
            <plugin>
                <inherited>true</inherited>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId> 
                maven-project-info-reports-plugin 
            </artifactId>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <!-- 開發環境 -->
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <!-- 如下配置properties中用到一些變量,如數據庫鏈接參數、日誌打印等 -->
            <properties>
                <!-- 數據庫源設置 -->
                <jdbc_driverClassName>com.mysql.jdbc.Driver</jdbc_driverClassName>
                <jdbc_url>jdbc:mysql://localhost:3306/learning</jdbc_url>
                <jdbc_username>root</jdbc_username>
                <jdbc_password>123456</jdbc_password>
                <!-- 日誌打印的設置 -->
                <log.moduleName>ssm-project</log.moduleName>
                <log.base>logs</log.base>
                <log.other.level>INFO</log.other.level>
                <log.root.level>INFO</log.root.level>
                <log.stdout.ref><![CDATA[<appender-ref ref="stdout" />]]></log.stdout.ref>
            </properties>
        </profile>
    </profiles>
</project>

複製代碼

 

service_web工程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"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>Archetype Created Web Application</display-name>

    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc/spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>logbackConfigLocation</param-name>
        <param-value>classpath:logback.xml</param-value>
    </context-param>

    <listener>
        <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!-- xml配置文件交給Spring監聽器初始化 -->
        <param-value>classpath:application.xml</param-value>
    </context-param>

    
    <!-- SpringEncodingFilter -->
    <filter>
        <filter-name>SpringEncodingFilter</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>SpringEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- SpringEncodingFilter -->

    <context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>webapp.root</param-value>
    </context-param>

    <error-page>
        <error-code>404</error-code>
        <location>/WEB-INF/errorpage/404.jsp</location>
    </error-page>
    <error-page>
        <error-code>405</error-code>
        <location>/WEB-INF/errorpage/405.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/WEB-INF/errorpage/500.jsp</location>
    </error-page>
    <welcome-file-list>
        <welcome-file>/WEB-INF/view/index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

複製代碼

 

從web.xml裏咱們看出須要加載的幾個xml文件spring-mvc.xml、classpath:logback.xml、classpath:application.xmlgithub

在web工程下的resources裏添加這幾個xml文件。web

 

spring-mvc.xml:redis

 

複製代碼

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
     
    <!-- 掃描controller(controller層注入) -->
   <context:component-scan base-package="com.ngt.controller" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
    </context:component-scan>
   
   

   
       <!-- 會自動註冊了validator  ConversionService  -->
    <mvc:annotation-driven validator="validator" conversion-service="conversionService" content-negotiation-manager="contentNegotiationManager">
        <mvc:message-converters register-defaults="true">
            <!-- StringHttpMessageConverter編碼爲UTF-8,防止亂碼 -->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
                <property name = "supportedMediaTypes">
                    <list>
                        <bean class="org.springframework.http.MediaType">
                            <constructor-arg index="0" value="text"/>
                            <constructor-arg index="1" value="plain"/>
                            <constructor-arg index="2" value="UTF-8"/>
                        </bean>
                        <bean class="org.springframework.http.MediaType">
                            <constructor-arg index="0" value="*"/>
                            <constructor-arg index="1" value="*"/>
                            <constructor-arg index="2" value="UTF-8"/>
                        </bean>
                    </list>
                </property>
            </bean>
            <!-- 避免IE執行AJAX時,返回JSON出現下載文件 -->
            <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
                <!--<property name="serializerFeature">-->
                <!--這個地方加上這個功能吧,能本身配置一些東西,好比時間的格式化,null輸出""等等-->
                <!--</property>-->
            </bean>
        </mvc:message-converters>

        <mvc:argument-resolvers>
          <bean class="org.springframework.data.web.PageableHandlerMethodArgumentResolver" />
        </mvc:argument-resolvers>
    </mvc:annotation-driven>


    <!-- 內容協商管理器  -->
    <!--一、首先檢查路徑擴展名(如my.pdf);二、其次檢查Parameter(如my?format=pdf);三、檢查Accept Header-->
    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <!-- 擴展名至mimeType的映射,即 /user.json => application/json -->
        <property name="favorPathExtension" value="true"/>
        <!-- 用於開啓 /userinfo/123?format=json 的支持 -->
        <property name="favorParameter" value="true"/>
        <property name="parameterName" value="format"/>
        <!-- 是否忽略Accept Header -->
        <property name="ignoreAcceptHeader" value="false"/>

        <property name="mediaTypes"> <!--擴展名到MIME的映射;favorPathExtension, favorParameter是true時起做用  -->
            <value>
                json=application/json
                xml=application/xml
                html=text/html
            </value>
        </property>
        <!-- 默認的content type -->
        <property name="defaultContentType" value="text/html"/>
    </bean>



    <!-- 當在web.xml 中   DispatcherServlet使用 <url-pattern>/</url-pattern> 映射時,能映射靜態資源 -->
    <mvc:default-servlet-handler />  
    <!-- 靜態資源映射 -->

   <!-- 對模型視圖添加先後綴 -->
     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      p:prefix="/WEB-INF/view/" p:suffix=".jsp"/>
      
    <!-- 這裏設置靜態的資源 -->
    <mvc:resources location="/WEB-INF/static/" mapping="/static/**" /> 


</beans>

複製代碼

 

 

application.xml:spring

 

複製代碼

<?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:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="  
           http://www.springframework.org/schema/beans  
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
           http://www.springframework.org/schema/aop  
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/context  
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <!-- 如下 validator  ConversionService 在使用 mvc:annotation-driven 會 自動註冊-->
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    </bean>
     
     <!-- 引入jdbc配置文件 -->  
     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
               <value>classpath:properties/*.properties</value>
                <!--要是有多個配置文件,只需在這裏繼續添加便可 -->
            </list>
        </property>
    </bean>
    
    
         <!-- 掃描註解Bean -->
    <context:component-scan base-package="com.ngt.*">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    
    <!-- 激活annotation功能 -->
    <context:annotation-config />
    <!-- 激活annotation功能 -->
    <context:spring-configured />
    <!-- 註解事務配置 -->
    
     <!-- 類型轉換及數據格式化 -->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"/>    

    <!-- 配置數據源 -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName">
            <value>${jdbc_driverClassName}</value>
        </property>
        <property name="url">
            <value>${jdbc_url}</value>
        </property>
        <property name="username">
            <value>${jdbc_username}</value>
        </property>
        <property name="password">
            <value>${jdbc_password}</value>
        </property>
    </bean>

    <!-- 自動掃描了全部的XxxxMapper.xml對應的mapper接口文件,這樣就不用一個一個手動配置Mpper的映射了,只要Mapper接口類和Mapper映射文件對應起來就能夠了。 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.ngt.*" />
    </bean>

    <!-- 配置Mybatis的文件 ,mapperLocations配置**Mapper.xml文件位置,configLocation配置mybatis-config文件位置-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:mapper/**/*.xml"/>  
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
    </bean>
      <import resource="redis-config.xml"/>
      <bean id="redisUtils" class="com.ngt.common.RedisUtils"></bean>

      
</beans>

複製代碼

 

 

 

 

由application.xml中能夠看出咱們須要的一些其餘配置文件及bean,首先是jdbc的properties、mybatis-config.xml、redis-config.xml 、RedisUtils

 

先貼上 logback.xml:

複製代碼

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 儘可能別用絕對路徑,若是帶參數不一樣容器路徑解釋可能不一樣,如下配置參數在pom.xml裏 -->
    <property name="log.root.level" value="${log.root.level}" /> <!-- 日誌級別 -->
    <property name="log.other.level" value="${log.other.level}" /> <!-- 其餘日誌級別 -->
    <property name="log.base" value="${log.base}" /> <!-- 日誌路徑,這裏是相對路徑,web項目eclipse下會輸出到eclipse的安裝目錄下,若是部署到linux上的tomcat下,會輸出到tomcat/bin目錄 下 -->
    <property name="log.moduleName" value="${log.moduleName}" />  <!-- 模塊名稱, 影響日誌配置名,日誌文件名 -->
    <property name="log.max.size" value="100MB" /> <!-- 日誌文件大小,超過這個大小將被壓縮 -->

    <!--控制檯輸出 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method\(\):%L -%msg%n</Pattern>
        </encoder>
    </appender>

    <!-- 用來保存輸出全部級別的日誌 -->
    <appender name="file.all" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${log.base}/${log.moduleName}.log</File><!-- 設置日誌不超過${log.max.size}時的保存路徑,注意若是 
            是web項目會保存到Tomcat的bin目錄 下 -->
        <!-- 滾動記錄文件,先將日誌記錄到指定文件,當符合某個條件時,將日誌記錄到其餘文件。 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${log.base}/archive/${log.moduleName}_all_%d{yyyy-MM-dd}.%i.log.zip
            </FileNamePattern>
            <!-- 文件輸出日誌 (文件大小策略進行文件輸出,超過指定大小對文件備份) -->
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${log.max.size}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 日誌輸出的文件的格式 -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method\(\):%L -%msg%n</pattern>
        </layout>
    </appender>
    
    <!-- 這也是用來保存輸出全部級別的日誌 -->
    <appender name="file.all.other" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${log.base}/${log.moduleName}_other.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${log.base}/archive/${log.moduleName}_other_%d{yyyy-MM-dd}.%i.log.zip
            </FileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${log.max.size}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method\(\):%L -%msg%n</pattern>
        </layout>
    </appender>

    <!-- 只用保存輸出error級別的日誌 -->
    <appender name="file.error"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${log.base}/${log.moduleName}_err.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${log.base}/archive/${log.moduleName}_err_%d{yyyy-MM-dd}.%i.log.zip
            </FileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${log.max.size}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method\(\):%L - %msg%n</pattern>
        </layout>
        <!-- 下面爲配置只輸出error級別的日誌 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

   <!-- 不丟失日誌.默認的,若是隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日誌 -->
    <!-- 更改默認的隊列的深度,該值會影響性能.默認值爲256 -->
    <!-- 添加附加的appender,最多隻能添加一個 -->
    <appender name="file.async" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>256</queueSize>
        <includeCallerData>true</includeCallerData>
        <appender-ref ref="file.all" />
    </appender>

    <appender name="file.async.other" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>256</queueSize>
        <includeCallerData>true</includeCallerData>
        <appender-ref ref="file.all.other" />
    </appender>

    <!-- 爲某個包下的全部類的指定Appender 這裏也能夠指定類名稱例如:com.aa.bb.ClassName -->
    <logger name="com.ngt" additivity="false">
        <level value="${log.root.level}" />
        <appender-ref ref="stdout" /> 
        <appender-ref ref="file.async" /><!-- 即com.ngt包下級別爲 ${log.root.level}的纔會使用file.async來打印 -->
        <appender-ref ref="file.error" />
    </logger>
    
    <!-- root將級別爲${log.root.level}及大於${log.root.level}的日誌信息交給已經配置好的名爲「Console」的appender處理,「Console」appender將信息打印到Console,其它同理 -->
    <root level="${log.root.level}">
        <appender-ref ref="stdout" /> <!--  標識這個appender將會添加到這個logger -->
        <appender-ref ref="file.async.other" />
        <appender-ref ref="file.error" />
    </root>
</configuration>

複製代碼

 

 

 

jdbc.properties:

jdbc_driverClassName =${jdbc_driverClassName}
jdbc_url=${jdbc_url}
jdbc_username=${jdbc_username}
jdbc_password=${jdbc_password}

 

 

mybatis-config.xml:

 

複製代碼

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-config.dtd">  
<configuration>    
<!-- 
    plugins在配置文件中的位置必須符合要求,不然會報錯,順序以下:
    properties?, settings?, 
    typeAliases?, typeHandlers?, 
    objectFactory?,objectWrapperFactory?, 
    plugins?, 
    environments?, databaseIdProvider?, mappers?
-->
<plugins>
    <!-- com.github.pagehelper爲PageHelper類所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageHelper">
        <property name="dialect" value="mysql"/>
        <!-- 該參數默認爲false -->
        <!-- 設置爲true時,會將RowBounds第一個參數offset當成pageNum頁碼使用 -->
        <!-- 和startPage中的pageNum效果同樣-->
        <property name="offsetAsPageNum" value="true"/>
        <!-- 該參數默認爲false -->
        <!-- 設置爲true時,使用RowBounds分頁會進行count查詢 -->
        <property name="rowBoundsWithCount" value="true"/>
        <!-- 設置爲true時,若是pageSize=0或者RowBounds.limit = 0就會查詢出所有的結果 -->
        <!-- (至關於沒有執行分頁查詢,可是返回結果仍然是Page類型)-->
        <property name="pageSizeZero" value="true"/>
        <!-- 3.3.0版本可用 - 分頁參數合理化,默認false禁用 -->
        <!-- 啓用合理化時,若是pageNum<1會查詢第一頁,若是pageNum>pages會查詢最後一頁 -->
        <!-- 禁用合理化時,若是pageNum<1或pageNum>pages會返回空數據 -->
        <property name="reasonable" value="false"/>
        <!-- 3.5.0版本可用 - 爲了支持startPage(Object params)方法 -->
        <!-- 增長了一個`params`參數來配置參數映射,用於從Map或ServletRequest中取值 -->
        <!-- 能夠配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認值 -->
        <!-- 不理解該含義的前提下,不要隨便複製該配置 -->
        <property name="params" value="pageNum=start;pageSize=limit;"/>
    </plugin>
</plugins>
</configuration>

複製代碼

 

redis-config.xml :

複製代碼

<?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:cache="http://www.springframework.org/schema/cache"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:redis="http://www.springframework.org/schema/redis" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd
        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.0.xsd
        http://www.springframework.org/schema/redis http://www.springframework.org/schema/redis/spring-redis-1.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <!-- 載入redis.properties,這裏要特別注意,若是有多個properties文件,必須用逗號分開,不能寫成兩個 <context:property-placeholder/> -->
    <context:property-placeholder location="classpath:properties/redis.properties" />
    <!-- 配置JedisPoolConfig相關參數 -->
     <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="32"></property>
        <property name="maxIdle" value="6"></property>
        <property name="testOnBorrow" value="true" />
    </bean>
    
    <!-- 配置redis服務器信息 -->
     <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
        <property name="poolConfig" ref="jedisPoolConfig"></property>
        <property name="hostName" value="${redis.host}"></property>
        <property name="port" value="${redis.port}"></property>
        <property name="database" value="${redis.database}"></property>
        <property name="timeout" value="15000"></property>
        <property name="usePool" value="true"></property>
    </bean>
    
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"></property>
        <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
        </property>
         <!--開啓事務-->  
        <property name="enableTransactionSupport" value="true"/> 
    </bean>

</beans>

複製代碼

 

 

redis.properties:

 

#redis settings
redis.database=0
redis.keyPrefix=ngt
redis.host=localhost
redis.port=6379

 

 

com.ngt.service.RedisUtils:

 

複製代碼

package com.ngt.common;

import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@Service
public class RedisUtils {
    @Autowired
    private  RedisTemplate<String, Object> redisTemplate ;
    /** 
     * 設置redisTemplate 
     */  
    @Resource
    public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {  
        this.redisTemplate = redisTemplate;  
    } 
    
    //=============================common============================  
    /** 
     * 指定緩存失效時間 
     * @param key 鍵 
     * @param time 時間(秒) 
     * @return 
     */  
    public  boolean expire(String key,long time){  
        try {  
            if(time>0){  
                redisTemplate.expire(key, time, TimeUnit.SECONDS);  
            }  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
      
    /** 
     * 根據key 獲取過時時間 
     * @param key 鍵 不能爲null 
     * @return 時間(秒) 返回0表明爲永久有效 
     */  
    public  long getExpire(String key){  
        return redisTemplate.getExpire(key,TimeUnit.SECONDS);  
    }  
      
    /** 
     * 判斷key是否存在 
     * @param key 鍵 
     * @return true 存在 false不存在 
     */  
    public  boolean hasKey(String key){  
        try {  
            return redisTemplate.hasKey(key);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
      
    /** 
     * 刪除緩存 
     * @param key 能夠傳一個值 或多個 
     */  
    @SuppressWarnings("unchecked")  
    public  void del(String ... key){  
        if(key!=null&&key.length>0){  
            if(key.length==1){  
                redisTemplate.delete(key[0]);  
            }else{  
                redisTemplate.delete(CollectionUtils.arrayToList(key));  
            }  
        }  
    }  
      
    //============================String=============================  
    /** 
     * 普通緩存獲取 
     * @param key 鍵 
     * @return 值 
     */  
    public  Object get(String key){  
        return key==null?null:redisTemplate.opsForValue().get(key);  
    }  
      
    /** 
     * 普通緩存放入 
     * @param key 鍵 
     * @param value 值 
     * @return true成功 false失敗 
     */  
    public  boolean set(String key,Object value) {  
         try {  
            redisTemplate.opsForValue().set(key, value);  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
          
    }  
      
    /** 
     * 普通緩存放入並設置時間 
     * @param key 鍵 
     * @param value 值 
     * @param time 時間(秒) time要大於0 若是time小於等於0 將設置無限期 
     * @return true成功 false 失敗 
     */  
    public  boolean set(String key,Object value,long time){  
        try {  
            if(time>0){  
                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);  
            }else{  
                set(key, value);  
            }  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
      
    /** 
     * 遞增 
     * @param key 鍵 
     * @param by 要增長几(大於0) 
     * @return 
     */  
    public  long incr(String key, long delta){    
        if(delta<0){  
            throw new RuntimeException("遞增因子必須大於0");  
        }  
        return redisTemplate.opsForValue().increment(key, delta);  
    }  
      
    /** 
     * 遞減 
     * @param key 鍵 
     * @param by 要減小几(小於0) 
     * @return 
     */  
    public  long decr(String key, long delta){    
        if(delta<0){  
            throw new RuntimeException("遞減因子必須大於0");  
        }  
        return redisTemplate.opsForValue().increment(key, -delta);    
    }    
      
    //================================Map=================================  
    /** 
     * HashGet 
     * @param key 鍵 不能爲null 
     * @param item 項 不能爲null 
     * @return 值 
     */  
    public  Object hget(String key,String item){  
        return redisTemplate.opsForHash().get(key, item);  
    }  
      
    /** 
     * 獲取hashKey對應的全部鍵值 
     * @param key 鍵 
     * @return 對應的多個鍵值 
     */  
    public  Map<Object,Object> hmget(String key){  
        return redisTemplate.opsForHash().entries(key);  
    }  
      
    /** 
     * HashSet 
     * @param key 鍵 
     * @param map 對應多個鍵值 
     * @return true 成功 false 失敗 
     */  
    public  boolean hmset(String key, Map<String,Object> map){    
        try {  
            redisTemplate.opsForHash().putAll(key, map);  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
      
    /** 
     * HashSet 並設置時間 
     * @param key 鍵 
     * @param map 對應多個鍵值 
     * @param time 時間(秒) 
     * @return true成功 false失敗 
     */  
    public  boolean hmset(String key, Map<String,Object> map, long time){    
        try {  
            redisTemplate.opsForHash().putAll(key, map);  
            if(time>0){  
                expire(key, time);  
            }  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
      
    /** 
     * 向一張hash表中放入數據,若是不存在將建立 
     * @param key 鍵 
     * @param item 項 
     * @param value 值 
     * @return true 成功 false失敗 
     */  
    public  boolean hset(String key,String item,Object value) {  
         try {  
            redisTemplate.opsForHash().put(key, item, value);  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
      
    /** 
     * 向一張hash表中放入數據,若是不存在將建立 
     * @param key 鍵 
     * @param item 項 
     * @param value 值 
     * @param time 時間(秒)  注意:若是已存在的hash表有時間,這裏將會替換原有的時間 
     * @return true 成功 false失敗 
     */  
    public  boolean hset(String key,String item,Object value,long time) {  
         try {  
            redisTemplate.opsForHash().put(key, item, value);  
            if(time>0){  
                expire(key, time);  
            }  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
      
    /** 
     * 刪除hash表中的值 
     * @param key 鍵 不能爲null 
     * @param item 項 可使多個 不能爲null 
     */  
    public  void hdel(String key, Object... item){    
        redisTemplate.opsForHash().delete(key,item);  
    }   
      
    /** 
     * 判斷hash表中是否有該項的值 
     * @param key 鍵 不能爲null 
     * @param item 項 不能爲null 
     * @return true 存在 false不存在 
     */  
    public  boolean hHasKey(String key, String item){  
        return redisTemplate.opsForHash().hasKey(key, item);  
    }   
      
    /** 
     * hash遞增 若是不存在,就會建立一個 並把新增後的值返回 
     * @param key 鍵 
     * @param item 項 
     * @param by 要增長几(大於0) 
     * @return 
     */  
    public  double hincr(String key, String item,double by){    
        return redisTemplate.opsForHash().increment(key, item, by);  
    }  
      
    /** 
     * hash遞減 
     * @param key 鍵 
     * @param item 項 
     * @param by 要減小記(小於0) 
     * @return 
     */  
    public  double hdecr(String key, String item,double by){    
        return redisTemplate.opsForHash().increment(key, item,-by);    
    }    
      
    //============================set=============================  
    /** 
     * 根據key獲取Set中的全部值 
     * @param key 鍵 
     * @return 
     */  
    public  Set<Object> sGet(String key){  
        try {  
            return redisTemplate.opsForSet().members(key);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return null;  
        }  
    }  
      
    /** 
     * 根據value從一個set中查詢,是否存在 
     * @param key 鍵 
     * @param value 值 
     * @return true 存在 false不存在 
     */  
    public  boolean sHasKey(String key,Object value){  
        try {  
            return redisTemplate.opsForSet().isMember(key, value);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
      
    /** 
     * 將數據放入set緩存 
     * @param key 鍵 
     * @param values 值 能夠是多個 
     * @return 成功個數 
     */  
    public  long sSet(String key, Object...values) {  
        try {  
            return redisTemplate.opsForSet().add(key, values);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return 0;  
        }  
    }  
      
    /** 
     * 將set數據放入緩存 
     * @param key 鍵 
     * @param time 時間(秒) 
     * @param values 值 能夠是多個 
     * @return 成功個數 
     */  
    public  long sSetAndTime(String key,long time,Object...values) {  
        try {  
            Long count = redisTemplate.opsForSet().add(key, values);  
            if(time>0) expire(key, time);  
            return count;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return 0;  
        }  
    }  
      
    /** 
     * 獲取set緩存的長度 
     * @param key 鍵 
     * @return 
     */  
    public  long sGetSetSize(String key){  
        try {  
            return redisTemplate.opsForSet().size(key);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return 0;  
        }  
    }  
      
    /** 
     * 移除值爲value的 
     * @param key 鍵 
     * @param values 值 能夠是多個 
     * @return 移除的個數 
     */  
    public  long setRemove(String key, Object ...values) {  
        try {  
            Long count = redisTemplate.opsForSet().remove(key, values);  
            return count;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return 0;  
        }  
    }  
    //===============================list=================================  
      
    /** 
     * 獲取list緩存的內容 
     * @param key 鍵 
     * @param start 開始 
     * @param end 結束  0 到 -1表明全部值 
     * @return 
     */  
    public  List<Object> lGet(String key,long start, long end){  
        try {  
            return redisTemplate.opsForList().range(key, start, end);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return null;  
        }  
    }  
      
    /** 
     * 獲取list緩存的長度 
     * @param key 鍵 
     * @return 
     */  
    public  long lGetListSize(String key){  
        try {  
            return redisTemplate.opsForList().size(key);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return 0;  
        }  
    }  
      
    /** 
     * 經過索引 獲取list中的值 
     * @param key 鍵 
     * @param index 索引  index>=0時, 0 表頭,1 第二個元素,依次類推;index<0時,-1,表尾,-2倒數第二個元素,依次類推 
     * @return 
     */  
    public  Object lGetIndex(String key,long index){  
        try {  
            return redisTemplate.opsForList().index(key, index);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return null;  
        }  
    }  
      
    /** 
     * 將list放入緩存 
     * @param key 鍵 
     * @param value 值 
     * @param time 時間(秒) 
     * @return 
     */  
    public  boolean lSet(String key, Object value) {  
        try {  
            redisTemplate.opsForList().rightPush(key, value);  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
      
    /** 
     * 將list放入緩存 
     * @param key 鍵 
     * @param value 值 
     * @param time 時間(秒) 
     * @return 
     */  
    public  boolean lSet(String key, Object value, long time) {  
        try {  
            redisTemplate.opsForList().rightPush(key, value);  
            if (time > 0) expire(key, time);  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
      
    /** 
     * 將list放入緩存 
     * @param key 鍵 
     * @param value 值 
     * @param time 時間(秒) 
     * @return 
     */  
    public  boolean lSet(String key, List<Object> value) {  
        try {  
            redisTemplate.opsForList().rightPushAll(key, value);  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
      
    /** 
     * 將list放入緩存 
     * @param key 鍵 
     * @param value 值 
     * @param time 時間(秒) 
     * @return 
     */  
    public  boolean lSet(String key, List<Object> value, long time) {  
        try {  
            redisTemplate.opsForList().rightPushAll(key, value);  
            if (time > 0) expire(key, time);  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
      
    /** 
     * 根據索引修改list中的某條數據 
     * @param key 鍵 
     * @param index 索引 
     * @param value 值 
     * @return 
     */  
    public  boolean lUpdateIndex(String key, long index,Object value) {  
        try {  
            redisTemplate.opsForList().set(key, index, value);  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }   
      
    /** 
     * 移除N個值爲value  
     * @param key 鍵 
     * @param count 移除多少個 
     * @param value 值 
     * @return 移除的個數 
     */  
    public  long lRemove(String key,long count,Object value) {  
        try {  
            Long remove = redisTemplate.opsForList().remove(key, count, value);  
            return remove;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return 0;  
        }  
    }  
     class ObjectsTranscoder{  
        public  <T> byte[] serialize(List<T> value) {  
            if (value == null) {  
                throw new NullPointerException("Can't serialize null");  
            }  
            byte[] rv=null;  
            ByteArrayOutputStream bos = null;  
            ObjectOutputStream os = null;  
            try {  
                bos = new ByteArrayOutputStream();  
                os = new ObjectOutputStream(bos);  
                for(T t : value){  
                    os.writeObject(t);  
                }  
                os.writeObject(null);  
                os.close();  
                bos.close();  
                rv = bos.toByteArray();  
            } catch (IOException e) {  
                throw new IllegalArgumentException("Non-serializable object", e);  
            } finally {  
                close(os);  
                close(bos);  
            }  
            return rv;  
        }  
    }
    public  void close(Closeable closeable) {  
        if (closeable != null) {  
            try {  
                closeable.close();  
            } catch (Exception e) {  
            }  
        }  
    }
}

複製代碼

 

 redis 和 mybatis測試這裏就不寫了。寫一下關於dubbo的例子

 

首先在網上找一個dubbo-admin-2.5.3的war包 用一個tomcat 部署起來

在application.xml新增配置

 

dubbo-provider.xml:

複製代碼

<?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="hello-world-provider"  />
 
    <!-- 使用multicast廣播註冊中心暴露服務地址 -->
   <!--  <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
 
     <!-- 使用zookeeper註冊中心暴露服務地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
 
    <!-- 用dubbo協議在20880端口暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880" />
    
     <!-- 和本地bean同樣實現服務 -->
    <bean id="demoService" class="com.ngt.service.impl.DubboTestServiceImpl" />
 
    <!-- 聲明須要暴露的服務接口 -->
    <dubbo:service interface="com.ngt.service.DubboTestService" ref="demoService" />
 
   
    
</beans>

複製代碼

 

 

 在demo_service工程下寫一個接口,測試提供者是否配置成功

package com.ngt.service;

public interface DubboTestService {
    public String hello(String name);
}

複製代碼

package com.ngt.service.impl;

import org.springframework.stereotype.Service;

import com.ngt.service.DubboTestService;

@Service
public class DubboTestServiceImpl implements DubboTestService {

    @Override
    public String hello(String name) {
        
        return "hello"+name;
    }

}

複製代碼

 

 

 

 運行demo_web工程,查看http://localhost:8088/dubbo-admin-2.5.3的服務治理中的提供者有沒有接口信息

 

 

 

 附上一張項目結構圖

 

 

 有了提供者,下面準備配置一個消費者來調用接口。在demo下新建一個web子工程demo_consumer。

 把demo_web工程下的配置文件所有拷貝到demo_consumer工程下,打開pom.xml添加demo_service的依賴。

 

 

 

 

 

 

dubbo-customer.xml:

複製代碼

<?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="hello-world-customer"  />
    
     <!-- 使用zookeeper註冊中心暴露服務地址 -->
    <dubbo:registry address="zookeeper://localhost:2181" />
 
    <dubbo:reference id="demoService"  interface="com.ngt.service.DubboTestService"/>
    
</beans>

複製代碼

 

寫一個控制器消費demoService接口

複製代碼

package com.ngt.controller;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.ngt.service.DubboTestService;

@Controller
public class TestDubbo {
    
    @Resource(name="demoService")
    private DubboTestService dubboTestService;
    
    @RequestMapping("/testDubbo")
    public @ResponseBody String sayHello(){
        
        return dubboTestService.hello("demo");
    }
}

複製代碼

 

 

 

標籤: mavendubbozookeeper

好文要頂 關注我 收藏該文  

黎孟陽
關注 - 0
粉絲 - 2

+加關注

1

0

« 上一篇:eclipse建立一個maven聚合工程
» 下一篇:spring mvc+shiro+activemq

posted on 2018-01-25 11:08 黎孟陽 閱讀(583) 評論(0) 編輯 收藏

 

刷新評論刷新頁面返回頂部

註冊用戶登陸後才能發表評論,請 登陸 或 註冊訪問網站首頁。

【推薦】超50萬VC++源碼: 大型組態工控、電力仿真CAD與GIS源碼庫!
【福利】校園拼團福利,騰訊雲1核2G雲服務器10元/月!
【大賽】2018首屆「頂天立地」AI開發者大賽

qcloud0702

最新IT新聞:
· 在烏干達想上FB天天要交3毛錢稅,總統這樣解釋
· 中興聘任徐子陽爲公司總裁 內部評價"勇於打硬仗"
· 從滑板車到飛行汽車,谷歌母公司欲變身交通巨頭
· 摩拜抱美團大腿後,想經過免押金秀錢袋子順帶踩ofo
· 專訪魏少軍:作AI芯片勿自欺欺人 架構創新很關鍵
» 更多新聞...

最新知識庫文章:

· 從Excel到微服務
· 如何提高你的能力?給年輕程序員的幾條建議
· 程序員的那些反模式
· 程序員的宇宙時間線
· 突破程序員思惟

» 更多知識庫文章...

導航

< 2018年7月 >
24 25 26 27 28 29 30
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 1 2 3 4

公告

暱稱:黎孟陽
園齡:1年
粉絲:2
關注:0

+加關注

搜索

 

 

經常使用連接

個人標籤

隨筆檔案

閱讀排行榜

推薦排行榜

Powered by: 
博客園  Copyright © 黎孟陽

相關文章
相關標籤/搜索