SSM框架手動搭建

SSM框架手動搭建

建立web項目

IDEA建立Maven項目

[File]-->[new]-->[project..]html

 

將項目變爲web項目

[File]-->[Project Structure]-->[Modules]java

路徑:D:\dev\java-study\SSM\ssm-demo\src\main\webappmysql

配置war包

[File]-->[Project structure]--[Artifacts]web

 

tomcat配置

[Run]-->[Edit Configurations]-->"+"redis

新建index.html文件

 <!doctype html>
 <html lang="en">
 <head><title>ssm-demo</title>
 
 </head>
 <body>
     <h3>hello world</h3>
 </body>
 </html>

spring

添加依賴包

 <properties>
     <spring.version>5.0.4.RELEASE</spring.version>
 </properties>
 
 <dependencies>
     <!--spring start-->
     <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-core</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-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-expression</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-test</artifactId>
         <version>${spring.version}</version>
     </dependency>
 
     <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-web</artifactId>
         <version>${spring.version}</version>
     </dependency>
     <!--spring end-->
 </dependencies>

自動生成xml文件

  1. 刪除原有的spring文件spring

    [File]-->[Project Structure]-->[Moudules]sql

  2. 添加xml文件數據庫

    項目右鍵:express

    選擇spring mvc項apache

    自動生成如下3個文件

  3. 配置歡迎頁

    引入jsp相關依賴(因爲要用到jsp,全部要引入依賴)

     <properties>
         <javax.servlet.version>4.0.0</javax.servlet.version>
         <jstl.version>1.2</jstl.version>
     </properties>
     
     <dependency>
         <groupId>javax.servlet</groupId>
         <artifactId>javax.servlet-api</artifactId>
         <version>${javax.servlet.version}</version>
     </dependency>
     <dependency>
         <groupId>jstl</groupId>
         <artifactId>jstl</artifactId>
         <version>${jstl.version}</version>
     </dependency>

    web.xml

     <!--歡迎頁-->
     <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
     </welcome-file-list>
  4. 新建index.jsp文件

     <%--
       Created by IntelliJ IDEA.
       User: Administrator
       Date: 2019/4/22 0022
       Time: 下午 18:04
       To change this template use File | Settings | File Templates.
     --%>
     <%@ page contentType="text/html;charset=UTF-8" language="java" %>
     <html>
     <head>
         <title>Title</title>
     </head>
     <body>
         <h1>hello spring mvc!</h1>
     </body>
     </html>
  5. 過程當中遇到的錯誤

    Q:More than one fragment with the name [spring_web] was found

    A:這個問題是因爲lib中引用了2個不一樣版本的「spring_web」包,檢查下[File]-->[Project Structure]-->[Artifacts]中是否存在了重複,刪除重複便可

項目架構

java結構

resource結構

在resource下新建config文件夾,而後新建spring文件夾,將applicationContext.xml和dispatcher-servlet.xml移入config.spring文件夾中,並將dispatcher-servlet.xml更名爲spring-mvc.xml

spring-mvc

添加依賴包

 <properties>
     <spring.version>5.0.4.RELEASE</spring.version>
 </properties>
 
 <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-webmvc</artifactId>
     <version>${spring.version}</version>
 </dependency>

spring-mvc.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: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.xsd
             http://www.springframework.org/schema/context
             http://www.springframework.org/schema/context/spring-context.xsd
             http://www.springframework.org/schema/mvc
             http://www.springframework.org/schema/mvc/spring-mvc.xsd">
 
     <!--掃描controller(後端控制器),而且掃描其中的註解-->
     <!--掃描base-package包或者子包下全部的controller類,並把匹配的controller類註冊成Bean-->
     <context:component-scan base-package="com.ssm.controller"/>
 
     <!--啓用spring註解-->
     <context:annotation-config/>
 
     <!--配置註解驅動:能夠將request參數綁定到controller的參數上-->
     <!--該註解會自動註冊RequestMappingHandlerMapping 和RequestMappingHandlerAdapter兩個Bean,
         是Spring MVC爲@Controller分發請求所必須的,
         並提供了數據綁定支持、@NumberFormatannotation支持、@DateTimeFormat支持、@Valid支持、讀寫XML的支持(JAXB)和讀寫JSON的支持(Jackson)等功能。-->
     <mvc:annotation-driven/>
 
     <!--jsp jstl-->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <property name="prefix" value="/WEB-INF/views"/>
         <property name="suffix" value=".jsp"/>
     </bean>
 
     <!--配置視圖解析器:對模型視圖名稱的解析-->
     <!--最經常使用的視圖解析器,當控制層返回「hello」時,
         InternalResourceViewResolver解析器會自動添加前級和後綴,最終路徑結果爲:WEB-INF/views/hello.jsp-->
     <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
         <property name="prefix" value="/WEB-INF/views"/>
         <property name="suffix" value=".jsp"/>
         <property name="exposeContextBeansAsAttributes" value="true"/>
     </bean>
 
 </beans>

applicationContext.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: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">
 
     <!--啓用註解掃描-->
     <!--:掃描base-package 包或者子包下全部的Java 類,並把匹配的Java類註冊成Bean.這裏咱們設直掃描com.ssm包下的全部Java類-->
     <context:component-scan base-package="com.ssm">
         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
     </context:component-scan>
 </beans>

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--組件加載-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:config/spring/applicationContext.xml</param-value>
    </context-param>

    <!--監聽-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--servlet-->
    <!--DispatcherServlet是前直控制器,主要用於攔截匹配的請求,
        攔截匹配規則要本身定義,把攔截下來的請求,依據相應的規則分發到目標Controller來
        處理,是配置SpringMVC的第一步-->
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--整個項目的局部變量, 至關於設定了一個固定值,只能在當前的Servlet中被使用
            param-name是鍵,至關於就是參數名,param-value是值,至關於參數值。
            容器啓動時會加載配直文件spring-mvc.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:config/spring/spring-mvc.xml</param-value>
        </init-param>
        <!--表示啓動容器時初始化該Servlet.
            當值爲0或者大於0 時,表示容器在應用啓動時力口載並初始化這個Servlet.
            若是值小於0或未指定時,則指示容器在該Servlet被選擇時才加載.
            正值越小,Servlet的優先級越高,應用啓動時就越先加載。值相同時,容器就會本身選擇順序來加載。-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--標籤聲明瞭與該Servlet相應的匹配規則,每一個<url-pattern>標籤表明1 個匹配規則。-->
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <!--URL 匹配規則,表示哪些請求交給Spring MVC處理,「/」表示攔截全部的請求(默認方式)。
            以「*.」開頭的字符串被用於擴展名匹配,如*.do
            以「/」字符開頭,並以「/*」結尾的字符串用於路徑匹配,如:/test/*。
            當一個URL與多個Servlet 的匹配規則能夠匹配時,則按照「精確路徑>最長路徑>擴展名」 這樣的優先級匹配到對應的Servlet.-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--歡迎頁-->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

編寫controller

不傳參

package com.ssm.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class IndexController {

    @RequestMapping("index")
    public ModelAndView index(){
        return new ModelAndView("/hello");
    }

}

傳參

package com.ssm.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class IndexController {

    @RequestMapping("index")
    public ModelAndView index(){
        ModelMap modelMap = new ModelMap();
        modelMap.put("name","kinglead");
        return new ModelAndView("/hello",modelMap);
    }

}

mybatis

相關依賴

<properties>
    <spring.version>5.0.4.RELEASE</spring.version>
    <mysql.connector.java.version>8.0.9-rc</mysql.connector.java.version>
    <durid.version>1.1.9</durid.version>
    <mybatis.version>3.4.6</mybatis.version>
    <mybatis-spring.version>1.3.2</mybatis-spring.version>
</properties>

<!--mybatis start-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.connector.java.version}</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>${durid.version}</version>
</dependency>

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${mybatis.version}</version>
</dependency>

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>${mybatis-spring.version}</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>
<!--mybatis end-->

建立jdbc.properties文件

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_demo?serverTimezone=GMT
jdbc.username=root
jdbc.password=123456

applicationContext加入讀取properties文件配置

<!--加載properties配置文件-->
<!--<context:property-placeholder>:標籤提供了一種優雅的外在化參數配直的方式,
        location表示屬性文件位置,多個屬性文件之間經過逗號分隔。ignore-unresolvable表示
        是否忽略解析不到的屬性,若是不忽略,找不到將拋出異常。-->
<context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true"/>

配置DataSource數據源

applicationContext加入:

<!--配置dataSource數據源:這裏使用的是druid-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <!--鏈接池配置-->
    <!--最大併發鏈接數-->
    <!--初始化鏈接數量-->
    <!--最小空閒鏈接數-->
    <!--檢測週期:檢測須要關閉的空閒鏈接,單位用毫秒-->
</bean>

 

配置mybatis sqlSessionFactory

applicationContext加入:

<!--mybatis sqlSessionFactory-->
<!--在基本的MyBatis中,Session 工廠可使用SqlSessionFactoryBuilder來建立。
        而在MyBatis-Spring中,則使用SqlSessionFactoryBean來替代。-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations">
        <list>
            <value>classpath:com/ssm/mapper/*Mapper.xml</value>
        </list>
    </property>
</bean>
<!--<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">-->
<!--<constructor-arg index="0" ref="sqlSessionFactory"/>-->
<!--</bean>-->

<!--掃描basePackage下全部以@MyBatisDao註解的接口-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    <property name="basePackage" value="com.ssm.dao"/>
</bean>

mysql建立數據庫,並建立表

(略)

IDEA中使用mybatis-generator自動生成mapper和pojo文件

http://www.javashuo.com/article/p-dqckszgf-ks.html

UserMapper.xml

<?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">

<!--namespace命名空間做用:對sql進行分類化管理,隔離
注意:使用mapper代理開發時,namespace將會有特殊重要的做用-->
<mapper namespace="com.ssm.dao.UserMapper">
    <!-- 在映射文件中配置不少sql語句 -->
    <!-- 將sql語句封裝到mappedStatement對象中,因此將id稱爲statement的id -->
    <!-- parameterType:指定輸入參數的類型,這裏指定int型 #{}表示一個佔位符號 -->
    <!-- #{id}:其中的id表示接收輸入的參數,參數名稱就是id,若是輸入 -->
    <!-- 參數是簡單類型,#{}中的參數名能夠任意,能夠value或其它名稱 -->
    <!-- resultType:指定sql輸出結果的所映射的java對象類型,select指定resultType表示將單條記錄映射成的java對象。 -->
    <!-- 表名要對,可是不區分大小寫,resultType要寫類名,一樣不區分大小寫 -->
    <select id="findAll"  resultType="com.ssm.model.User">
        SELECT * FROM t_user
    </select>
</mapper>

具體java代碼實現

建立model:User

package com.ssm.model;

public class User {

    private int id;

    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

DAO

package com.ssm.dao;

import com.ssm.model.User;
import java.util.List;

public interface UserMapper {

    List<User> findAll();

}

Service接口

package com.ssm.service;

import com.ssm.model.User;
import java.util.List;

public interface UserService {

    List<User> findAll();

}

Service接口實現

package com.ssm.service.impl;

import com.ssm.dao.UserMapper;
import com.ssm.model.User;
import com.ssm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;


@Service("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    UserMapper userMapper;

    public List<User> findAll() {
        return userMapper.findAll();
    }
}

Controller

package com.ssm.controller;

import com.ssm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class IndexController {

    @Autowired
    UserService userService;

    @RequestMapping("index")
    public ModelAndView index(){
        ModelMap modelMap = new ModelMap();
        modelMap.put("name",userService.findAll().get(0).getName());
        return new ModelAndView("/hello",modelMap);
    }

}

問題:

  1. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

    通常的緣由是Mapper interface和xml文件的定義對應不上,須要檢查包名,namespace,函數名稱等可否對應上,須要比較細緻的對比,我常常就是寫錯了一兩個字母搞的很長時間找不到錯誤

    按如下步驟一一執行:

    1:檢查xml文件所在的package名稱是否和interface對應的package名稱一一對應

    2:檢查xml文件的namespace是否和xml文件的package名稱一一對應

    3:檢查函數名稱可否對應上

    4:去掉xml文件中的中文註釋

    5:隨意在xml文件中加一個空格或者空行而後保存

    通常來講到此就能夠排除錯誤了。

    若是進行上述操做,問題還爲解決,那就是編譯時沒有將*Mapper.xml編譯,可在pom.xml文件中加入:

    <build>
        <resources>
            <!--將xml文件進行編譯-->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>
    

集成log4j

Log句中有三個主要的組件,它們分別是: Logger (記錄器)、Appender (輸出端〉和Layout (佈局) ,這三個組件能夠簡單地理解爲日誌類別,日誌要輸出的地方和日誌以何種形式輸 出。

  • Logger ( 記錄器) : Logger組件被分爲7個級別:「all、debug 、info 、warn 、error 、fatal 、 off。這7個級別是有優先級的: all <debug< info< warn< error< fatal<off,分別用來指定 這條日誌信息的重要程度。Log4j有一個規則:只輸出級別不低於設定級別的日誌信 息。假設Logger級別設定爲info ,則info 、warn 、error和fatal級別的日誌信息都會輸 出,而級別比info低的debug則不會輸出。Log4j 容許開發人員定義多個Logger ,每一個 Logger擁有本身的名字, Logger之間經過名字來代表隸屬關係。

  • Appender C 輸出端) : Log4j 日誌系統容許把日誌輸出到不一樣的地方,如控制檯 (Console )、文件( Files )等, 能夠根據天數或者文件大小產生新的文件,能夠以流 的形式發送到其餘地方等等。

  • Layout ( 佈局) : Layout的做用是控制log信息的輸出方式,也就是格式化輸出的信息。

添加依賴

<properties>
    <slf4j.version>1.7.7</slf4j.version>
    <log4j.version>1.2.17</log4j.version>
</properties>

<!--log4j start-->

<!--具體的日誌系統。經過slf4j-log4j12初始化log4j,達到最終日誌的輸出。-->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>${log4j.version}</version>
</dependency>

<!--slf4j-api:全稱Simple Logging Facade For Java ,爲Java提供的簡單日誌Facade。Facade
            門面就是接口,它容許用戶以本身的喜愛,在項目中經過時slf4j接入不一樣的日誌系統。
            更直觀一點,slf4j是個數據線,一端嵌入程序,另外一端連接日誌系統,從而實現將程
            序中的信息導入到日誌系統並記錄。-->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
</dependency>

<!--連接slf4j-api和log4j的適配器-->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<!--log4j end-->

格式配置文件

###set log levels
log4j.rootLogger = DEBUG,Console

###print console
log4j.appender.Console = org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target = System.out
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n

集成Junit測試框架

添加依賴

<!--junit:單元測試框架-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

創建測試類

路徑:src/test/java/com/ssm/test

package com.ssm.test;

import com.ssm.dao.UserMapper;
import com.ssm.model.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;
import java.util.List;

/**
 @RunWith :參數化運行器,用於指定Junit運行環境,是Junit提供給其餘框架測試環境接口擴展,
            爲了便於使用Spring的依賴注入,Spring提供了SpringJUnit4ClassRunner做爲JUnit測試環境。
 @ContextConfiguration :加載配直文件applicationContext.xml
 **/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/config/spring/applicationContext.xml"})
public class UserTest {

    @Resource
    private UserMapper userMapper;

    @Test
    public void testUser(){
        List<User> userList = userMapper.findAll();
        System.out.println("userList:"+userList.get(0).getName());
    }

}

 

——————————————以上已完成框架搭建————————————————

 

spring mvc相關知識

基本註解

Spring 提供的註解有不少,好比聲明Bean 的註解和注入Bean 的註解, 這些註解在工做中 常常被使用。

聲明Bean 的註解:

• @Component 沒有明確的角色。 • @Service 在服務層( 業務邏輯層)被使用。 • @Repository 在數據訪問層( dao層) 被使用。 • @Controller 在表現層(控制層)被使用。

注入Bean 的註解:

• @Autowired Sprin g提供的註解。 • @Resource JSR-250提供的註解。

注意, @Resource 這個註解屬於J2EE 的, 默認安照名稱進行裝配,名稱能夠經過name 屬 性進行指定。若是沒有指定name 屬性,當註解寫在字段上時,默認取字段名進行查找。若是 註解寫在seter 方法上默認取屬性名進行裝配。當找不到與名稱匹配的bean 時才按照類型進行 裝配。可是須要注意的是,若是name 屬性一旦指定,就只會按照名稱進行裝配。具體代碼 以下:

@Resource(name="ayUserDao")
private AyUserDao ayUserDao;

而@Autowired 這個註解是屬於Spring 的, 默認按類型裝配。默認狀況下要求依賴對象必須存 在,若是要容許null 值,能夠設置它的required 屬性爲false ,如: @Autowired(required=false),如 果咱們想使用名稱裝配,能夠結合@Qualifier 註解進行使用。具體代碼以下:

@Autowired
@Qualifier("ayUserDao")
private AyUserDao ayUserDao;

 

集成Redis緩存

添加依賴

在SSM 框架中集成Redis 緩存, 首先須要在pom.xml 文件中引入所需的依賴, 具體代碼 以下:

配置

在pom 文件引入Redis 所需的依賴以後,還須要在src\main\resources 目錄下建立 redis .properties 文件並添加以下的配置信息:

在src\main\resources 目錄下建立spring-redis.xml 配置文件並添加以下配置信息:

在src\main\resources\applicationContext.xml 配置文件中導入spring-redis.xml 配置, 具體代 碼以下:

測試類

全部的配置文件添加完成後, 在src\main\test\com\ay\test 目錄下建立測試類 RedisTest.java,具體代碼以下:

RedisTemplate 和StringRedisTemplate 都是Spring Data Redis 爲咱們提供的兩個模板類用來 對數據進行操做,其中StringRedisTemplate 只針對鍵值都是字符串的數據進行操做。在應用啓 動的時候, Spring 會初始化這兩個模板類,經過@Resource 註解注入便可使用。 RedisTemplate和StringRedisTemplate 除了提供opsForValue 方法用來操做簡單屬性數據之 外,還提供瞭如下其餘主要數據的訪問方法:

當數據存放到Redis 的時候,鍵( key )和值( va lu e )都是經過Spring 提供的Serializer 序 列化到數據庫的。RedisTemplate 默認使用JdkSeri al izationRedisSerializer , 而 StringRedi sTemplate 默認使用StringRedisSerializer 。

RedisTest 開發完成後,運行測試類RedisTest 的testRedis ()方法,找到Red is 客戶端程序redis - cli. exe ,當在客戶端輸入命令: 「 get name 」 後能夠獲取到值,同時能夠在IDEA 控制檯中看到打印的信息,表示SSM 框架成功地集成了Red i s 緩存。

集成ActiveMQ

添加依賴

在SSM 框架中集成ActiveMQ 緩存, 首先須要在pom.xml 文件中尋|入所需的依賴,具體代碼以下:

配置

依賴添加完成以後,須要在\src\main\resources 目錄下建立Active MQ 配置文件 spring-jms.xml , 具體代碼以下:

在配置文件spring-jms.xml 中, 首先定義了ActiveMQ 的鏈接信息, 而後定義了 JmsTemplate 工具類, 該工具類是Spring 框架提供的, 利用JmsTemplate 能夠很方便地發送和接 收消息。最後, 咱們定義消費者類moodConsumer ,同時消費者監聽的是 ay .queue.high.concurrency .praise 這個topic,當有生產者Producer 往該隊列推送消息時- , 消費者 Consumer 就能夠監聽到該消息, 井作相應的邏輯處理。

在\src\main\resources 目錄下建立配置文件activemq.properties, 具體代碼以下:

activemq.prope此ies 屬性文件主要配置ActiveMQ 的鏈接信息,供spring-jms.xml 配置文件使用。 spring-jms.xml 開發完成以後, 在applicationContext.xml 配置文件中使用<import>標籤引入 入spring-jms. xml 配置文件, 具體代碼以下:

異步消費

上一節,已經在項目中集成了ActiveMQ 消息中間件,同時開發了相關的配置文件,這一 節主要利用ActiveMQ 實現點贊功能的異步處理。具體步驟以下:

首先,在src\main\java\com\ay\mq 目錄下建立生產者類MoodProducer , 具體代碼以下:

MoodProducer 類提供sendMessage 方法用來發送消息,方法的第一個參數是destination , 主 要用來指定隊列的名稱,第二個參數是mood 說說實體。經過調用jmsTemplate 工具類的 convertAndSend 方法發送消息。須要注意的是, MoodDTO 說說實體須要實現序列化接口 Serializable , 具體代碼以下:

其次,在src\main\java\com\ay\mq 目錄下建立消費者類MoodConsumer 。

消費者類MoodConsumer 實現MessageListener 接口,完成對消息的監昕和接收。消息有兩 種接收方式: 同步接收和異步接收。

• 同步接收: 主線程阻塞式等待下一個消息的到來, 能夠設置timeout,超時則返回null 。 • 異步接收: 主線程設置MessageListener , 而後繼續作本身的事, 子線程負責監聽。

同步接收又稱爲阻塞式接收, 異步接收又稱爲事件驅動的接收。同步接收,是在獲取 MessageConsumer 實例以後, 調用如下的API:

• receive() 獲取下一個消息。該調用將致使無限期的阻塞, 直到有新的消息產生。 • receive(long timeout) 獲取下一個消息。該調用可能致使一段時間的阻塞, 直到超時 或者有新的消息產生。超時則返回null 。 • receiveNoWait() 獲取下一個消息。這個調用不會致使阻塞, 若是沒有下一個消息, 直接返回null .

異步接收, 是在獲取MessageConsumer 實例以後, 調用下面的API : • setMessagelistener(Messagelistener) 設置消息監聽器。MessageListener是一個接 口,只定義了一個方法,即。由onMessage(Message message)回調方法, 當有新的消息產生 時,該方法會被自動調用。

可見, 爲實現異步接收, 只須要對MessageListener 進行實現,而後設置爲Consumer 實例 的messageListener 便可。

最後,修改MoodServivelmpl 類中的praiseMoodForRedis()方法,將其改爲異步處理方式, 具體代碼以下:

相關文章
相關標籤/搜索