JavaRush /จาวาบล็อก /Random-TH /ข้อมูลเบื้องต้นเกี่ยวกับ Maven, Spring, MySQL, Hibernate ...
Макс
ระดับ

ข้อมูลเบื้องต้นเกี่ยวกับ Maven, Spring, MySQL, Hibernate และแอปพลิเคชัน CRUD แรก (ตอนที่ 2)

เผยแพร่ในกลุ่ม
สวัสดีตอนบ่าย. ในบทความนี้ ฉันอยากจะแบ่งปันประสบการณ์ครั้งแรกของฉันกับสิ่งต่าง ๆ เช่น Maven, Spring, Hibernate, MySQL และ Tomcat ในกระบวนการสร้างแอปพลิเคชัน CRUD แบบง่าย นี่เป็นส่วนที่สองของ 4 บทความนี้มีไว้สำหรับผู้ที่ผ่านด่าน 30-40 ไปแล้วที่นี่ แต่ยังไม่ได้เสี่ยงเกินกว่า Java บริสุทธิ์และเพิ่งเริ่มต้น (หรือกำลังจะเริ่มต้น) เพื่อเข้าสู่โลกที่เปิดกว้างด้วย เทคโนโลยี กรอบงาน และคำอื่นๆ ที่ไม่คุ้นเคยทั้งหมดนี้ นี่เป็นส่วนที่สองของบทความ "ข้อมูลเบื้องต้นเกี่ยวกับ Maven, Spring, MySQL, Hibernate และแอปพลิเคชัน CRUD แรก" ส่วนแรกสามารถดูได้โดยไปที่ลิงก์นี้: ข้อมูลเบื้องต้นเกี่ยวกับ Maven, Spring, MySQL, Hibernate และแอปพลิเคชัน CRUD แรก (ตอนที่ 1)

เนื้อหา:

เอาล่ะ เรามาต่อกันตอนนี้เรามาลองสร้างคลังภาพยนตร์ทั้งหมดกันดีกว่า แน่นอนว่าในแอปพลิเคชันขนาดเล็กและเรียบง่ายของเราคุณสามารถใส่ตรรกะทั้งหมดลงในคอนโทรลเลอร์ได้อย่างโง่เขลา แต่ตามที่ระบุไว้แล้ว ควรเรียนรู้วิธีทำทุกอย่างอย่างถูกต้องทันที ดังนั้นเรามาสร้างหลายชั้นกัน เราจะมีDAOที่รับผิดชอบในการทำงานกับข้อมูลบริการซึ่งจะมีตรรกะอื่นๆ ทุกประเภท และผู้ควบคุมจะประมวลผลคำขอและเรียกใช้วิธีการบริการที่จำเป็นเท่านั้น

วัตถุการเข้าถึงข้อมูล

Data Access Object (DAO)เป็นรูปแบบการออกแบบดังกล่าว ประเด็นคือการสร้างเลเยอร์พิเศษที่จะรับผิดชอบในการเข้าถึงข้อมูลแต่เพียงผู้เดียว (ทำงานกับฐานข้อมูลหรือกลไกการจัดเก็บข้อมูลอื่น ๆ ) ในแพ็คเกจdaoเราจะสร้างอินเทอร์เฟซFilmDAOซึ่งจะมีวิธีการต่างๆ เช่น เพิ่ม ลบ เป็นต้น ฉันเรียกมันแตกต่างออกไปเล็กน้อย แต่พวกมันสอดคล้องกับ การดำเนินการ CRUD พื้นฐาน ( C reate, Read , U pdate, D elete)

เป็นที่น่าสังเกตว่านอกเหนือจาก DAO แล้ว ยังมีวิธีการเช่น Repository ซึ่งดูเหมือนว่าจะคล้ายกันมาก ทั้งสองใช้เพื่อทำงานกับข้อมูล ฉันยังไม่ทราบว่าวิธีการเหล่านี้มีคุณสมบัติใดบ้างและความแตกต่างระหว่างพวกเขาคืออะไร ดังนั้น ฉันอาจจะเข้าใจผิดที่นี่ และนี่ควรเรียกว่าพื้นที่เก็บข้อมูล ไม่ใช่เต๋า หรือบางทีอาจเป็นอะไรบางอย่างในระหว่างนั้น แต่ตัวอย่างส่วนใหญ่ที่ผมได้เห็นและศึกษามานี้เรียกว่า DAO ดังนั้นผมคงจะเรียกมันเหมือนเดิม ในเวลาเดียวกัน บางทีต่อไปในข้อความฉันจะใช้คำว่า repository ยังไงก็ขออภัยหากผิดพลาดประการใด ขออภัยมา ณ ที่นี้ด้วย

package testgroup.filmography.dao;

import testgroup.filmography.model.Film;

import java.util.List;

public interface FilmDAO {
    List<Film> allFilms();
    void add(Film film);
    void delete(Film film);
    void edit(Film film);
    Film getById(int id);
}
ตอนนี้เราต้องการการนำไปปฏิบัติ เราจะไม่เชื่อมต่อฐานข้อมูล แต่ก็ยังน่ากลัวอยู่เล็กน้อย เพื่อฝึกฝนและทำความคุ้นเคย ขั้นแรกให้จำลองพื้นที่จัดเก็บข้อมูลในหน่วยความจำและสร้างรายการที่มีภาพยนตร์หลายเรื่อง ในการจัดเก็บรายการ เราจะใช้ not Listแต่Mapเพื่อให้สะดวกในการดึงภาพยนตร์ที่ต้องการด้วย โดยidไม่ต้องอ่านรายการทั้งหมด สำหรับรุ่นidเราใช้AtomicInteger มาสร้างคลาสFilmDAOImplใช้วิธีการทั้งหมดและกรอกแผนที่กันดีกว่า อะไรแบบนั้น.
package testgroup.filmography.dao;

import testgroup.filmography.model.Film;

import java.util.*;

public class FilmDAOImpl implements FilmDAO {
    private static final AtomicInteger AUTO_ID = new AtomicInteger(0);
    private static Map<Integer, Film> films = new HashMap<>();

    static {
        Film film1 = new Film();
        film1.setId(AUTO_ID.getAndIncrement());
        film1.setTitle("Inception");
        film1.setYear(2010);
        film1.setGenre("sci-fi");
        film1.setWatched(true);
        films.put(film1.getId(), film1);

        // + film2, film3, film4, ...
    }
    @Override
    public List<Film> allFilms() {
        return new ArrayList<>(films.values());
    }

    @Override
    public void add(Film film) {
        film.setId(AUTO_ID.getAndIncrement());
        films.put(film.getId(), film);
    }

    @Override
    public void delete(Film film) {
        films.remove(film.getId());
    }

    @Override
    public void edit(Film film) {
        films.put(film.getId(), film);
    }

    @Override
    public Film getById(int id) {
        return films.get(id);
    }
}

บริการ

ตอนนี้เรามาเพิ่มชั้นบริการกัน โดยหลักการแล้ว ในตัวอย่างนี้ ค่อนข้างเป็นไปได้ที่จะทำโดยไม่มีมัน โดยจำกัดตัวเองไว้ที่ DAO แอปพลิเคชันจะง่ายมากและไม่มีแผนสำหรับตรรกะที่ซับซ้อนในบริการ แต่ทันใดนั้นในอนาคต คุณต้องการเพิ่มความซับซ้อนและสิ่งที่น่าสนใจทุกประเภทให้กับโครงการ ดังนั้นเพื่อความสมบูรณ์ ปล่อยให้มันเป็นไป สำหรับตอนนี้ มันจะเรียกวิธีการจาก DAO เพียงอย่างเดียว serviceมาสร้างอินเทอร์เฟซในแพ็คเกจกันดีFilmServiceกว่า
package testgroup.filmography.service;

import testgroup.filmography.model.Film;

import java.util.List;

public interface FilmService {
    List<Film> allFilms();
    void add(Film film);
    void delete(Film film);
    void edit(Film film);
    Film getById(int id);
}
และการนำไปปฏิบัติ:
package testgroup.filmography.service;

import testgroup.filmography.dao.FilmDAO;
import testgroup.filmography.dao.FilmDAOImpl;
import testgroup.filmography.model.Film;

import java.util.List;

public class FilmServiceImpl implements FilmService {
    private FilmDAO filmDAO = new FilmDAOImpl();

    @Override
    public List<Film> allFilms() {
        return filmDAO.allFilms();
    }

    @Override
    public void add(Film film) {
        filmDAO.add(film);
    }

    @Override
    public void delete(Film film) {
        filmDAO.delete(film);
    }

    @Override
    public void edit(Film film) {
        filmDAO.edit(film);
    }

    @Override
    public Film getById(int id) {
        return filmDAO.getById(id);
    }
}
โครงสร้างโครงการตอนนี้มีลักษณะดังนี้:
ข้อมูลเบื้องต้นเกี่ยวกับ Maven, Spring, MySQL, Hibernate และแอปพลิเคชัน CRUD แรก (ตอนที่ 2) - 1

ตัวควบคุมและมุมมอง

ตอนนี้เรามาทำงานเกี่ยวกับวิธีการควบคุมและการกรอกหน้าต่างๆ ในการกรอกข้อมูลหน้าต่างๆ เราจะต้องมีเทคนิคบางประการ ตัวอย่างเช่น ในการแสดงรายการภาพยนตร์ เราจำเป็นต้องมีการวนซ้ำ หากพูดว่า เราต้องการเปลี่ยนคำจารึกบางส่วน เราจำเป็นต้องมีเงื่อนไข เป็นต้น ขึ้นอยู่กับพารามิเตอร์ รูปแบบ JSP (JavaServer Pages) อนุญาตให้คุณใช้การแทรกโค้ด Java ซึ่งทั้งหมดนี้สามารถนำไปใช้ได้ แต่ฉันไม่ต้องการใช้โค้ด Java ผสมกับโค้ด HTML บนหน้าเว็บ อย่างน้อยที่สุดก็จะน่าเกลียดมาก โชคดีที่ในการแก้ปัญหานี้ มีสิ่งที่ยอดเยี่ยมเช่นJSTL (JavaServer Pages Standard Tag Library) หรือไลบรารีแท็กมาตรฐาน JSP ช่วยให้เราใช้แท็กเพิ่มเติมจำนวนมากในหน้า JSP ของเราเพื่อความต้องการที่หลากหลาย มาเชื่อมต่อกับpom.xml:
<dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
</dependency>
ทีนี้มาดูคอนโทรลเลอร์กันดีกว่า ก่อนอื่น เรามาลบการสร้างออบเจ็กต์ออกจากที่นั่นFilmซึ่งทำเพื่อการทดสอบและเราไม่ต้องการสิ่งอื่นใดอีก มาเพิ่มบริการที่นั่นและเรียกวิธีการของมัน
public class FilmController {
    private FilmService filmService = new FilmServiceImpl();
ดังนั้นเราจะสร้างวิธีการสำหรับแต่ละกรณี เพิ่ม ลบ ฯลฯ วิธีแรกในการแสดงหน้าหลักพร้อมรายการภาพยนตร์:
@RequestMapping(method = RequestMethod.GET)
    public ModelAndView allFilms() {
        List<Film> films = filmService.allFilms();
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("films");
        modelAndView.addObject("filmsList", films);
        return modelAndView;
    }
ไม่มีอะไรใหม่ที่นี่ เราได้รับรายชื่อภาพยนตร์จากบริการและเพิ่มลงในโมเดล ตอนนี้เรามาสร้างหน้าหลักfilms.jspที่วิธีนี้ส่งคืน:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>FILMS</title>
</head>
<body>

<h2>Films</h2>
<table>
    <tr>
        <th>id</th>
        <th>title</th>
        <th>year</th>
        <th>genre</th>
        <th>watched</th>
        <th>action</th>
    </tr>
    <c:forEach var="film" items="${filmsList}">
        <tr>
            <td>${film.id}</td>
            <td>${film.title}</td>
            <td>${film.year}</td>
            <td>${film.genre}</td>
            <td>${film.watched}</td>
            <td>
                <a href="/edit/${film.id}">edit</a>
                <a href="/delete/${film.id}">delete</a>
            </td>
        </tr>
    </c:forEach>
</table>

<h2>Add</h2>
<c:url value="/add" var="add"/>
<a href="${add}">Add new film</a>
</body>
</html>
มาดูหน้านี้กันดีกว่าว่ามีอะไรบ้าง <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - ที่นี่เชื่อมต่อแกน JSTL ซึ่งรวมถึงแท็กหลักสำหรับการสร้างวงจร เงื่อนไข ฯลฯ .
  • <table>— แท็กสำหรับสร้างตาราง
  • <tr>— แถวของตาราง
  • <th>- ส่วนหัวของคอลัมน์
  • <td>— เซลล์ตาราง
ขั้นแรก เราสร้างแถวส่วนหัวของตารางด้วยชื่อของคอลัมน์ จากนั้น<c:forEach var="film" items="${filmsList}">ในลูป (ซึ่งเรานำมาจากแกน JSTL) เราจะผ่านองค์ประกอบทั้งหมดของรายการที่ส่งผ่าน ( filmsList) สำหรับแต่ละองค์ประกอบ ( film) เราจะสร้างแถวใหม่และเขียนค่าที่สอดคล้องกันลงในแต่ละเซลล์ มีจุดหนึ่งที่นี่ ดูเหมือนว่าการบันทึกจะfilm.idต้องเข้าใจเป็นfilm.getId()เช่น ไม่สามารถเข้าถึงฟิลด์ได้โดยตรง แต่มีการเรียกทะเยอทะยาน ในคอลัมน์สุดท้าย ( action) เราสร้างลิงก์สำหรับการลบและแก้ไข (เราจะสร้างวิธีการที่เกี่ยวข้องทันที) ด้านล่างนี้เป็นลิงค์ไปยังวิธีการเพิ่มภาพยนตร์ใหม่ มีลักษณะดังนี้: ต่อไป มาดูวิธีการส่งคืนหน้าแก้ไขสำหรับภาพยนตร์บางเรื่อง:
@RequestMapping(value = "/edit/{id}", method = RequestMethod.GET)
    public ModelAndView editPage(@PathVariable("id") int id) {
        Film film = filmService.getById(id);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("editPage");
        modelAndView.addObject("film", film);
        return modelAndView;
    }
มีบางอย่างใหม่ปรากฏที่นี่ - นี่คือคำอธิบาย@PathVariableประกอบ บ่งชี้ว่าพารามิเตอร์นี้ ( int id) ได้มาจากแถบที่อยู่ เพื่อระบุตำแหน่งของพารามิเตอร์นี้ในแถบที่อยู่จะใช้โครงสร้าง{id}(โดยวิธีการหากชื่อตัวแปรเหมือนกันในกรณีนี้คุณไม่จำเป็นต้องระบุในวงเล็บ แต่เพียงเขียนมัน@PathVariable int id). ดังนั้นในหน้าหลักเราได้สร้างลิงก์สำหรับภาพยนตร์แต่ละเรื่องโดยระบุว่าid:
<a href="/edit/${film.id}">edit</a>
จากนั้นค่านี้จะถูกกำหนดให้กับพารามิเตอร์ method จากนั้นเราจะใช้ค่านี้เพื่อรับภาพยนตร์เฉพาะจากพื้นที่เก็บข้อมูลผ่านบริการและเพิ่มลงในโมเดล นี่คือวิธีการรับหน้าแก้ไข ตอนนี้เราต้องการวิธีแก้ไขเอง:
@RequestMapping(value = "/edit", method = RequestMethod.POST)
    public ModelAndView editFilm(@ModelAttribute("film") Film film) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("redirect:/");
        filmService.edit(film);
        return modelAndView;
    }
ในวิธีที่editPageเราได้เพิ่มคุณลักษณะให้กับโมเดล:
modelAndView.addObject("film", filmService.getById(id));
และตอนนี้ด้วยความช่วยเหลือของคำอธิบาย@ModelAttributeประกอบ เราได้รับคุณลักษณะนี้และเราสามารถเปลี่ยนแปลงได้ ขอวิธีการPOSTเพราะที่นี่เราจะส่งข้อมูล " redirect:/" หมายความว่าหลังจากดำเนินการตามวิธีนี้แล้ว เราจะถูกเปลี่ยนเส้นทางไปยังที่อยู่ " /" เช่น วิธีการจะทำงานallFilmsและเราจะกลับไปที่หน้าหลัก ตอนนี้เรามาสร้างเพจกันดีกว่าeditPage.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Edit</title>
</head>
<body>
<c:url value="/edit" var="var"/>
<form action="${var}" method="POST">
    <input type="hidden" name="id" value="${film.id}">
    <label for="title">Title</label>
    <input type="text" name="title" id="title">
    <label for="year">Year</label>
    <input type="text" name="year" id="year">
    <label for="genre">Genre</label>
    <input type="text" name="genre" id="genre">
    <label for="watched">Watched</label>
    <input type="text" name="watched" id="watched">
    <input type="submit" value="Edit film">
</form>
</body>
</html>
  • <form>— แบบฟอร์มรวบรวมและส่งข้อมูลระบุว่าใครจะเป็นผู้ดำเนินการ ( /edit)
  • <input>— องค์ประกอบอินเทอร์เฟซสำหรับการโต้ตอบของผู้ใช้ (ปุ่ม ช่องป้อนข้อมูล ฯลฯ)
  • <label>- ป้ายข้อความ
ดังนั้นเมื่อคุณคลิกปุ่ม<input type="submit" value="Edit film">ข้อมูลจากแบบฟอร์มจะถูกส่งไปยังเซิร์ฟเวอร์ (ฟิลด์ที่มองไม่เห็นพร้อมค่าได้ถูกเพิ่มเป็นพิเศษidเพื่อให้เซิร์ฟเวอร์ทราบว่าบันทึกใดในฐานข้อมูลจำเป็นต้องได้รับการอัปเดต) ในวิธีการ พวก เขาeditFilmจะถูกกำหนดให้กับฟิลด์แอตทริบิวต์ที่เกี่ยวข้อง filmจากนั้นเราจะกลับสู่หน้าหลักพร้อมรายการที่อัปเดต หน้าแก้ไขมีลักษณะดังนี้: ตอนนี้เรามาเริ่มเพิ่มภาพยนตร์ใหม่ลงในรายการกันดีกว่า ในการดำเนินการนี้ คุณจะต้องมีแบบฟอร์มสำหรับป้อนและส่งข้อมูลด้วย คุณสามารถสร้างแบบฟอร์มในหน้าหลักหรือสร้างหน้าแยกเช่นeditPage.jsp. แต่ในทางกลับกันแบบฟอร์มในการเพิ่มจะเหมือนกับการแก้ไขทุกประการนั่นคือ ช่องป้อนข้อมูล 4 ช่องและปุ่มส่ง แล้วทำไมต้องสร้างเพจใหม่ มาใช้editPage.jspกัน วิธีรับเพจ:
@RequestMapping(value = "/add", method = RequestMethod.GET)
    public ModelAndView addPage() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("editPage");
        return modelAndView;
    }
ในวิธีการนี้editPageเรายังส่งแอตทริบิวต์เพิ่มเติมเพื่อเปลี่ยนในภายหลัง แต่ที่นี่เราเพียงได้รับหน้านั้น และวิธีการเพิ่ม:
@RequestMapping(value = "/add", method = RequestMethod.POST)
    public ModelAndView addFilm(@ModelAttribute("film") Film film) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("redirect:/");
        filmService.add(film);
        return modelAndView;
    }
เนื่องจากเราไม่ได้ส่งแอตทริบิวต์ที่นี่ ออบเจ็กต์ใหม่จะถูกสร้างขึ้นที่Filmนี่ โดยพื้นฐานแล้วไม่มีอะไรใหม่ที่นี่ เป็นที่น่าสังเกตว่าเรามีทั้งสองวิธีใน " /add" สิ่งนี้เป็นไปได้เนื่องจากการตอบสนองต่อคำขอประเภทต่างๆ โดยการคลิกลิงก์ในหน้าหลัก เราจะทำการร้องขอ GET ซึ่งนำเราไปสู่ไฟล์addPage. และเมื่ออยู่ในหน้าเพิ่ม เราคลิกปุ่มเพื่อส่งข้อมูล จะมีการสร้างคำขอ POST และไฟล์addFilm. ในการเพิ่มหนังใหม่ เราตัดสินใจใช้หน้าเดียวกับการตัดต่อ แต่มีข้อมูลถูกส่งไปยังที่อยู่ " /edit":
<c:url value="/edit" var="var"/>
<form action="${var}" method="POST">
    <input type="submit" value="Edit film">
</form>
เราจำเป็นต้องปรับแต่งหน้าเล็กน้อยเพื่อให้มีพฤติกรรมแตกต่างออกไปในการเพิ่มและแก้ไข เพื่อแก้ไขปัญหานี้ เราจะใช้เงื่อนไขจากไลบรารีหลัก JSTL เดียวกัน:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <c:if test="${empty film.title}">
        <title>Add</title>
    </c:if>
    <c:if test="${!empty film.title}">
        <title>Edit</title>
    </c:if>
</head>
<body>
<c:if test="${empty film.title}">
    <c:url value="/add" var="var"/>
</c:if>
<c:if test="${!empty film.title}">
    <c:url value="/edit" var="var"/>
</c:if>
<form action="${var}" method="POST">
    <c:if test="${!empty film.title}">
        <input type="hidden" name="id" value="${film.id}">
    </c:if>
    <label for="title">Title</label>
    <input type="text" name="title" id="title">
    <label for="year">Year</label>
    <input type="text" name="year" id="year">
    <label for="genre">Genre</label>
    <input type="text" name="genre" id="genre">
    <label for="watched">Watched</label>
    <input type="text" name="watched" id="watched">
    <c:if test="${empty film.title}">
        <input type="submit" value="Add new film">
    </c:if>
    <c:if test="${!empty film.title}">
        <input type="submit" value="Edit film">
    </c:if>
</form>
</body>
</html>
เหล่านั้น. film.titleเราแค่กำลังตรวจ สอบสนาม ถ้าว่างแสดงว่าเป็นหนังใหม่เราจะต้องกรอกข้อมูลให้ครบแล้วเพิ่มเข้าในรายการ หากช่องนี้ไม่ว่างเปล่า แสดงว่าเป็นภาพยนตร์จากรายการ และคุณเพียงแค่ต้องเปลี่ยน ที่. เราได้รับเพจของเราสองเวอร์ชัน: วิธีควบคุมสุดท้ายสำหรับการลบภาพยนตร์ออกจากรายการ:
@RequestMapping(value="/delete/{id}", method = RequestMethod.GET)
    public ModelAndView deleteFilm(@PathVariable("id") int id) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("redirect:/");
        Film film = filmService.getById(id);
        filmService.delete(film);
        return modelAndView;
    }
ฉันคิดว่าไม่จำเป็นต้องแสดงความคิดเห็นใด ๆ ที่นี่ ทั้งหมดนี้ได้รับการพิจารณาแล้ว เราได้จัดทำลิงก์ไปยังที่อยู่นี้ในหน้าหลักแล้ว ดูเหมือนว่าทุกอย่างจะพร้อมแล้วที่นี่ คุณสามารถเรียกใช้อีกครั้งและดูว่าทุกอย่างทำงานอย่างไร

พื้นที่เก็บข้อมูลและบริการเป็นส่วนประกอบของสปริง

เรามาแก้ไขเล็กๆ น้อยๆ กันอีกครั้งหนึ่ง ความจริงก็คือตอนนี้พื้นที่เก็บข้อมูลและบริการของเราเป็นเพียงคลาส และเพื่อที่จะใช้งานเราต้องสร้างคลาสอ็อบเจ็กต์ด้วยตัวเอง ( new FilmServiceImpl()) แต่เราเชื่อมโยง สปริงด้วยเหตุผลบางอย่างดังนั้นให้เขาควบคุมเรื่องนี้ด้วยตัวเอง เพื่อให้คลาสของเราอยู่ภายใต้การควบคุมของ Spring เราต้องระบุว่าคลาสเหล่านั้นเป็นส่วนประกอบ ในการดำเนินการนี้ เราจะทำเครื่องหมายด้วยคำอธิบายประกอบพิเศษ:
@Repository
public class FilmDAOImpl implements FilmDAO {
@Service
public class FilmServiceImpl implements FilmService {
คำอธิบายประกอบและ@Repositoryรวม@Serviceทั้งได้@Controllerมาจาก @Componentคุณลักษณะเฉพาะและข้อแตกต่างของคำอธิบายประกอบทั้งสามนี้คืออะไร และความแตกต่างจากส่วนประกอบอย่างง่ายควรอ่านแยกกันในเอกสารประกอบหรือคำแนะนำ ในตอนนี้ ก็เพียงพอแล้วที่จะรู้ว่าคำอธิบายประกอบเหล่านี้บอก Spring ว่าคลาสเหล่านี้เป็นพื้นที่เก็บข้อมูลและบริการตามลำดับ และตอนนี้เราไม่จำเป็นต้องสร้างวัตถุที่เป็นรูปธรรมของคลาสเหล่านี้อีกต่อไป:
private FilmService filmService = new FilmServiceImpl();
แต่คุณสามารถทำเครื่องหมายฟิลด์ด้วยคำอธิบายประกอบพิเศษ จากนั้น Spring จะเลือกการใช้งานที่เหมาะสม:
@Autowired
private FilmService filmService;
คำอธิบายประกอบ@Autowired(การผูกอัตโนมัติ) จะบอก Spring ว่าควรเจาะลึกบริบทและแทนที่ bean ที่เหมาะสมที่นี่ สบายมาก. หากก่อนหน้านี้เราใช้อินเทอร์เฟซเพื่อไม่ต้องกังวลกับการใช้วิธีการเฉพาะ แต่ตอนนี้เราไม่จำเป็นต้องกังวลเกี่ยวกับการใช้งานอินเทอร์เฟซและรู้ชื่อด้วยซ้ำ แนวคิดก็คือ ไม่แนะนำให้ใช้การผูกอัตโนมัติบนฟิลด์ ควรใช้ Constructor หรือ Setter จะดีกว่า อ่านเพิ่มเติมเกี่ยวกับสิ่งนี้ในเอกสารประกอบ สำหรับเราโดยหลักการแล้วสิ่งนี้ไม่สำคัญเราสามารถปล่อยไว้อย่างนั้นได้อย่างปลอดภัย แต่เนื่องจากไอเดียมันเรียกร้อง เราจะเคารพทุกสิ่งให้สวยงามและไม่มีคำเตือนสีเหลือง ในคลาสคอนโทรลเลอร์ มาสร้าง setter และใส่คำอธิบายประกอบ:
@Controller
public class FilmController {

    private FilmService filmService;

    @Autowired
    public void setFilmService(FilmService filmService) {
        this.filmService = filmService;
    }
และในทำนอง เดียวกัน เราก็สร้าง setter สำหรับFilmDAOในชั้นเรียน ดำเนินการต่อ...ขอแนะนำ Maven, Spring, MySQL, Hibernate และแอปพลิเคชัน CRUD แรก (ตอนที่ 1) ขอแนะนำ Maven, Spring, MySQL, Hibernate และแอปพลิเคชัน CRUD แรก (ตอนที่ 2) ขอแนะนำ Maven, Spring, MySQL, Hibernate และ แอปพลิเคชัน CRUD แรก (ตอนที่ 3) ข้อมูลเบื้องต้นเกี่ยวกับ Maven, Spring, MySQL, Hibernate และแอปพลิเคชัน CRUD แรก (ตอนที่ 4)FilmServiceImpl
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION