Java實(shí)現(xiàn)五子棋游戲單機(jī)版(1.0)
本文實(shí)例為大家分享了Java實(shí)現(xiàn)五子棋游戲單機(jī)版的具體代碼,供大家參考,具體內(nèi)容如下
簡介
這個(gè)程序?qū)崿F(xiàn)了單機(jī)版五子棋,目前無法聯(lián)機(jī),只能自己跟自己下。
棋盤是20*20的。
主要功能:下棋、認(rèn)輸、悔棋、重新開始、退出等功能
PS:目前設(shè)置只有顯示游戲規(guī)則。
截圖
完整代碼
package Gobang; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.image.*; //import java.applet.*; //import java.net.*; //import java.io.*; //import javax.imageio.*; public class Frame ?extends JFrame implements MouseListener,ActionListener{//JFrame的擴(kuò)展類 ?? ?private static final long serialVersionUID = 1L; ?? ?JPanel panel1;//用于安放按鈕; ?? ?JButton RestartButton,SetButton,AdmitDefeatButton,RegretButton,ExitButton;//五個(gè)按鈕,各有其功能。 ?? ?Graphics g;//畫筆 ?? ?BufferedImage buf; ?? ?int x;//鼠標(biāo)的坐標(biāo) ?? ?int y; ?? ?int[][] Chess = new int[20][20]; ? // 保存棋子,1表示黑子,2表示白子 ?? ?boolean IsBlack = true; ? //表示當(dāng)前要下的是黑子還是白子,true表示黑子,false表示白子 ?? ?boolean IsFinish = false; ? //表示當(dāng)前游戲是否結(jié)束 ?? ?int xRange; ?? ?int yRange; ?? ?int[] chessX = new int[400];//用來保存從開始到當(dāng)前的所有棋子,用于悔棋; ?? ?int[] chessY = new int[400]; ?? ?int countX = 0; ?? ?int countY = 0; ?? ?/*本來想用于播放背景音樂,但是沒有成功,,,先暫時(shí)放棄 ?? ?//File f; ?? ?//URI uri; ?? ?//URL url; ?? ?//@SuppressWarnings("deprecation") ?? ?*/ ?? ?// ?? ?public Frame() { ?? ??? ?//設(shè)置標(biāo)題、大小、排列方式等 ?? ??? ?this.setTitle("五子棋"); ?? ??? ?this.setSize(500,550); ?? ??? ?this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ?? ??? ?this.setVisible(true); ?? ??? ?this.setLayout(null); ?? ??? ?//五個(gè)按鈕:重新開始、設(shè)置、認(rèn)輸、悔棋、退出。 ?? ??? ?RestartButton = new JButton("重新開始"); ?? ??? ?RestartButton.setSize(20,40); ?? ??? ?SetButton = new JButton("設(shè)置"); ?? ??? ?SetButton.setSize(20,40); ?? ??? ?AdmitDefeatButton = new JButton("認(rèn)輸"); ?? ??? ?AdmitDefeatButton.setSize(20,40); ?? ??? ?RegretButton = new JButton("悔棋" ); ?? ??? ?RegretButton.setSize(20,40); ?? ??? ?ExitButton = new JButton("退出"); ?? ??? ?ExitButton.setSize(20,40); ?? ??? ?//五個(gè)按鈕添加到中間容器; ?? ??? ?panel1 = new JPanel(); ?? ??? ?panel1.setBorder(BorderFactory.createLoweredBevelBorder()); //設(shè)置邊框 ?? ??? ?panel1.setLayout(new GridLayout(1,5)); ?? ??? ?panel1.add(RestartButton); ?? ??? ?panel1.add(SetButton); ?? ??? ?panel1.add(AdmitDefeatButton); ?? ??? ?panel1.add(RegretButton); ?? ??? ?panel1.add(ExitButton); ?? ??? ?this.add(panel1); ?? ??? ?panel1.setSize(460,20); ?? ??? ?panel1.setLocation(0, 460); ?? ??? ? ?? ??? ?this.repaint();//表示重新繪制畫布,可以自動(dòng)調(diào)用paint函數(shù); ?? ??? ?//本類作為監(jiān)聽類,包括鼠標(biāo)監(jiān)聽和按鈕動(dòng)作監(jiān)聽; ?? ??? ?this.addMouseListener(this); ?? ??? ?RestartButton.addActionListener(this); ?? ??? ?SetButton.addActionListener(this); ?? ??? ?AdmitDefeatButton.addActionListener(this); ?? ??? ?RegretButton.addActionListener(this); ?? ??? ?ExitButton.addActionListener(this); ?? ??? ?/*音頻播放部分 ?? ??? ?try { ?? ??? ??? ?f = new File(""); ?? ??? ??? ?uri = f.toURI(); ?? ??? ??? ?url = uri.toURL(); ?? ??? ??? ?AudioClip aau;? ?? ??? ??? ?aau = Applet.newAudioClip(url); ?? ??? ??? ?aau.loop(); ?//循環(huán)播放 ?? ??? ?} catch (Exception e) ?? ??? ?{ ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ?? ??? ?*/ ?? ?} ?? ?//畫布繪制 ?? ?public void paint(Graphics g) ?? ?{ ?? ??? ?if(g == null)//如果第一次繪制,新建一個(gè)圖片,并且創(chuàng)建畫布。 ?? ??? ?{ ?? ??? ??? ?buf = new BufferedImage(450, 450, BufferedImage.TYPE_INT_RGB); ?? ??? ??? ?g = ?buf.createGraphics(); ?? ??? ?} ?? ??? ?if(g != null)// ?? ??? ?{ ?? ??? ??? ?super.paint(g);//表示在原來圖像的基礎(chǔ)上,再畫圖 ?? ??? ??? ?g.setColor(new Color(249,205,173));//畫筆顏色調(diào)成褐色; ?? ??? ??? ?g.fill3DRect(20, 40, 400, 400,true);//用畫筆畫一個(gè)邊長為400的正方形;邊距為20,40 ?? ??? ??? ?for(int i = 0; i <= 20; i++)//用畫筆橫豎各畫19條線 ?? ??? ??? ?{ ?? ??? ??? ??? ?g.setColor(Color.BLACK);//畫筆顏色調(diào)為黑色; ?? ??? ??? ??? ?g.drawLine(20,40+i*20,420,40+i*20); ?? ??? ??? ??? ?g.drawLine(20+i*20,40,20+i*20,440); ?? ??? ??? ?} ?? ??? ?} ?? ??? ? for(int i=0; i<20; i++){ ?? ??? ??? ??? ?for (int j = 0; j < 20; j++) { ?? ??? ??? ??? ??? ?//畫實(shí)心黑子,直徑16 ?? ??? ??? ??? ??? ?if(Chess[i][j] == 1){ ? ? ?? ??? ??? ??? ??? ??? ?int tempX = i*20+12; ?? ??? ??? ??? ??? ??? ?int tempY = j*20+32; ?? ??? ??? ??? ??? ??? ?g.setColor(Color.BLACK); ?? ??? ??? ??? ??? ??? ?g.fillOval(tempX, tempY, 16, 16); ?? ??? ??? ??? ??? ??? ?g.setColor(Color.BLACK); ?? ??? ??? ??? ??? ??? ?g.drawOval(tempX, tempY, 16, 16); ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ?//畫實(shí)心白子,直徑16 ?? ??? ??? ??? ??? ?if(Chess[i][j] == 2){ ?? ??? ??? ??? ??? ??? ?int tempX = i*20+12; ?? ??? ??? ??? ??? ??? ?int tempY = j*20+32; ?? ??? ??? ??? ??? ??? ?g.setColor(Color.WHITE); ?? ??? ??? ??? ??? ??? ?g.fillOval(tempX, tempY, 16, 16); ?? ??? ??? ??? ??? ??? ?g.setColor(Color.WHITE); ?? ??? ??? ??? ??? ??? ?g.drawOval(tempX, tempY, 16, 16); ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?g.drawImage(buf, 0, 0,this); ?? ??? ? ?? ?}?? ??? ? ?? ?public void mousePressed(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ? ?? ??? ?if(!IsFinish)?? ?//判斷棋局是否結(jié)束 ?? ??? ?{ ?? ??? ??? ?x = e.getX();?? ?//獲取當(dāng)前鼠標(biāo)點(diǎn)擊位置 ?? ??? ??? ?y = e.getY(); ?? ??? ??? ?if(x >= 20 && x < 420 && y >= 40 && y<= 440)//判斷鼠標(biāo)是否在棋局內(nèi) ?? ??? ??? ?{ ?? ??? ??? ??? ?xRange = (x-20)%20; ?? ??? ??? ??? ?if(xRange > 10 && xRange < 20)?? ?//如果在交叉點(diǎn)的邊長為10的范圍內(nèi),就把棋子下在這; ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?x = (x - 20) / 20 + 1; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?else ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?x = (x - 20) / 20; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?yRange = (y-40)%20; ?? ??? ??? ??? ?if(yRange > 10 && yRange < 20) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?y = (y - 40) / 20 + 1; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?else ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?y = (y - 40) / 20; ?? ??? ??? ??? ?} ?? ??? ??? ??? ? ?? ??? ??? ??? ?if(Chess[x][y] == 0)?? ?//如果該交叉點(diǎn)沒有被下過; ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?chessX[countX++] = x;?? ?//存儲(chǔ)當(dāng)前棋子的位置; ?? ??? ??? ??? ??? ?chessY[countY++] = y; ?? ??? ??? ??? ??? ?if(IsBlack)?? ??? ??? ?//如果是黑子 ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?Chess[x][y] = 1; ?? ??? ??? ??? ??? ??? ?IsBlack = false; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?else ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?Chess[x][y] = 2; ?? ??? ??? ??? ??? ??? ?IsBlack = true; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?this.repaint();//重新繪制畫布 ?? ??? ??? ??? ?} ?? ??? ??? ??? ? ?? ??? ??? ??? ?if(this.isWin())//如果下棋之后贏了,彈出對(duì)話框 ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?if(Chess[x][y] == 1) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this, "黑方勝利"); ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?else? ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this, "白方勝利"); ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?this.IsFinish = true; ?//游戲結(jié)束 ?? ??? ??? ??? ?} ?? ??? ??? ??? ? ?? ??? ??? ?} ?? ??? ??? ? ?? ??? ?} ?? ?} ?? ? ?? ?public boolean isWin(){ ?? ??? ?boolean flag = false; ?? ??? ?int count = 1;? ?? ??? ?int color = Chess[x][y]; ? ?? ??? ?//判斷橫向是否有5個(gè)棋子相連 ?? ??? ?count = this.checkCount(1,0,color); ?? ??? ?if(count >= 5){ ?? ??? ??? ?flag = true; ?? ??? ?}else { ?? ??? ??? ?//判斷縱向 ?? ??? ??? ?count = this.checkCount(0,1,color); ?? ??? ??? ?if(count >= 5){ ?? ??? ??? ??? ?flag = true; ?? ??? ??? ?}else { ?? ??? ??? ??? ? //判斷右上,左下 ?? ??? ??? ??? ?count = this.checkCount(1,-1,color); ?? ??? ??? ??? ?if(count >= 5){ ?? ??? ??? ??? ??? ?flag = true; ?? ??? ??? ??? ?}else { ?? ??? ??? ??? ??? ?//判斷右下,左上 ?? ??? ??? ??? ??? ?count = this.checkCount(1,1,color); ?? ??? ??? ??? ??? ?if(count >= 5){ ?? ??? ??? ??? ??? ??? ?flag = ?true; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ??? ?return flag; ?? ?} ?? ? // 檢查棋盤中的五子棋是否連成五子,xChange,yChange為相對(duì)于當(dāng)前棋子位置的變化量 ?? ?public int checkCount(int xChange , int yChange ,int color){ ?? ??? ?int count = 1;//統(tǒng)計(jì)總共有幾個(gè)連著的棋子; ?? ??? ?int tempX = xChange; ?? ??? ?int tempy = yChange; ? ?? ??? ?//判斷棋子右邊有沒有相同顏色的棋子; ?? ??? ?while(x + xChange >=0 && x+xChange <20 ?&& y+yChange >=0 &&? ?? ??? ??? ??? ?y+yChange < 20 && color == Chess[x+xChange][y+yChange]) ?? ??? ?{ ?? ??? ??? ?count++;?? ??? ??? ??? ??? ??? ?//如果有,棋子數(shù)加一 ?? ??? ??? ?if(xChange != 0) ? ?? ??? ??? ??? ?xChange++; ? ??? ??? ??? ??? ?//如果橫向方向變化,x相對(duì)位置加一 ?? ??? ??? ?if(yChange != 0 )?? ??? ??? ??? ? ?? ??? ??? ?{ ? ? ? ?? ??? ??? ??? ?if(yChange != 0)?? ??? ??? ? ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?if(yChange > 0)?? ??? ??? ?//如果縱向方向增加,y相對(duì)位置加一 ?? ??? ??? ??? ??? ?{ ?? ?? ??? ??? ??? ??? ??? ?yChange++;?? ??? ? ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?else ?? ??? ??? ??? ??? ?//如果縱向方向減小,y相對(duì)位置減一 ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?yChange--;?? ??? ? ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ? ?? ??? ?} ?? ??? ?xChange = tempX; ?? ??? ?yChange = tempy; ? ?? ??? ?//判斷棋子左邊有沒有相同顏色的棋子; ?? ??? ?while(x-xChange >=0 && x-xChange <20 && y-yChange >=0 && ?? ??? ??? ??? ?y-yChange <20 && color == Chess[x-xChange][y-yChange]) ?? ??? ?{?? ??? ? ?? ??? ??? ?count++; ?? ??? ??? ?if(xChange != 0) ?? ??? ??? ?{ ?? ??? ??? ??? ?xChange++; ?? ??? ??? ?} ?? ??? ??? ?if(yChange != 0) ?? ??? ??? ?{ ?? ??? ??? ??? ?if (yChange > 0)? ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?yChange++;?? ??? ??? ? ?? ??? ??? ??? ?} ?? ??? ??? ??? ?else? ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?yChange--;?? ??? ??? ? ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ??? ?return count; ?? ?} ?? ?//監(jiān)聽動(dòng)作函數(shù) ?? ?public void actionPerformed(ActionEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ?if(e.getSource() == RestartButton)//如果點(diǎn)擊的按鈕是RestartButton,清空畫板,還原設(shè)置 ?? ??? ?{ ?? ??? ??? ?if(JOptionPane.showConfirmDialog(this, "Do you want to restart the game?") == 0) ?? ??? ??? ?{ ?? ??? ??? ??? ?for (int i = 0; i < 15; i++)? ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?for (int j = 0; j < 15; j++)? ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?Chess[i][j] = 0; ?//清空棋盤的棋子 ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ? ?? ??? ??? ??? ?} ?? ??? ??? ??? ? ?? ??? ??? ??? ?//清空下棋棋子坐標(biāo)的記錄 ?? ??? ??? ??? ?for (int i = 0; i < 15; i++) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?chessX[i] = 0; ?? ??? ??? ??? ??? ?chessY[i] = 0; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?countX =0; ?? ??? ??? ??? ?countY =0; ?? ??? ??? ??? ?IsBlack = true; ?? ??? ??? ??? ?IsFinish = false; ?? ??? ??? ??? ?this.repaint(); ?? ??? ??? ?} ?? ??? ?} ?? ??? ?if(e.getSource() == AdmitDefeatButton)//如果點(diǎn)擊的按鈕是AdmitDefeatButton,結(jié)束游戲,并提示 ?? ??? ?{ ?? ??? ??? ?if(!IsFinish)?? ?//判斷棋局是否結(jié)束 ?? ??? ??? ?{ ?? ??? ??? ??? ?if(JOptionPane.showConfirmDialog(this, "Are you sure you want to give up?") == 0) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?if(IsBlack == true) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this,"白方獲勝"); ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?else ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this,"黑方獲勝"); ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?IsFinish = true; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ??? ?if(e.getSource() == ExitButton)//如果點(diǎn)擊的按鈕是ExitButton,退出程序 ?? ??? ?{ ?? ??? ??? ?if(JOptionPane.showConfirmDialog(this, "Do you want to exit?") == 0) ?? ??? ??? ?{ ?? ??? ??? ??? ?System.exit(0); ?? ??? ??? ?} ?? ??? ?} ?? ??? ?if(e.getSource() == RegretButton)///如果點(diǎn)擊的按鈕是RegretButton,悔棋一步 ?? ??? ?{ ?? ??? ??? ?if(!IsFinish)?? ?//判斷棋局是否結(jié)束 ?? ??? ??? ?{ ?? ??? ??? ?if(IsBlack == true)?? ?//如果現(xiàn)在是黑子要下,表示悔棋的是白子 ?? ??? ??? ?{ ?? ??? ??? ??? ?if(JOptionPane.showConfirmDialog(this, "The white want to regret,do you agree?") == 0) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?int tempX = chessX[--countX];?? ?//獲取上一步白子下的位置; ?? ??? ??? ??? ??? ?int tempY = chessY[--countY]; ?? ??? ??? ??? ??? ?Chess[tempX][tempY] = 0;?? ?//撤回白子 ?? ??? ??? ??? ??? ?IsBlack = false;?? ?//當(dāng)前要下的變?yōu)榘追? ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?else ?? ??? ??? ?{ ?? ??? ??? ??? ?if(JOptionPane.showConfirmDialog(this, "The black want to regret,do you agree?") == 0) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?int tempX = chessX[--countX]; ?? ??? ??? ??? ??? ?int tempY = chessY[--countY]; ?? ??? ??? ??? ??? ?Chess[tempX][tempY] = 0; ?? ??? ??? ??? ??? ?IsBlack = true; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?this.repaint();?? ?//重新繪制畫布 ?? ??? ??? ?} ?? ??? ?} ?? ??? ?if(e.getSource() == SetButton)?? ?//設(shè)置按鈕,現(xiàn)在只顯示游戲規(guī)則 ?? ??? ?{ ?? ??? ??? ??? ? JDialog frame1 = new JDialog();//新建對(duì)話框 ?? ??? ??? ??? ? frame1.setBounds(?? ??? ??? ?//設(shè)置對(duì)話框邊界 ?? ??? ??? ? ? ? ? ? ? ? ? ?new Rectangle( ?? ??? ??? ? ? ? ? ? ? ? ? ? ? ? ? ?0, ?? ??? ??? ? ? ? ? ? ? ? ? ? ? ? ? ?260,? ?? ??? ??? ? ? ? ? ? ? ? ? ? ? ? ? ?600,? ?? ??? ??? ? ? ? ? ? ? ? ? ? ? ? ? ?200 ?? ??? ??? ? ? ? ? ? ? ? ? ?) ?? ??? ??? ? ? ? ? ? ? ?); ?? ??? ??? ??? ? JTextField tf = new JTextField();//新建文本框 ?? ??? ??? ??? ? frame1.setTitle("Play Rule"); ?? ??? ??? ? ? ? frame1.getContentPane().add(tf);?? ?//添加文本框 ?? ??? ??? ? ? ? tf.setText("The two sides use black and white pieces respectively.\n At the intersection of the straight line and horizontal line of the chessboard, \nthe one who forms a five piece line first wins."); ?? ??? ??? ? ? ? frame1.setModalityType(Dialog.ModalityType.APPLICATION_MODAL); ? ?// 設(shè)置模式類型 ?? ??? ??? ? ? ? frame1.setVisible(true); ?? ??? ? } ? ? ? ? ?? ?} ?? ?public static void main(String[] args) { ?? ??? ?new Frame(); } ?? ?@Override ?? ?public void mouseClicked(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ? ?? ?} ?? ?@Override ?? ?public void mouseReleased(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ? ?? ?} ?? ?@Override ?? ?public void mouseEntered(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ? ?? ?} ?? ?@Override ?? ?public void mouseExited(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ? ?? ?} }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot中通過lua腳本來獲取序列號(hào)的方法
這篇文章主要介紹了springboot中通過lua腳本來獲取序列號(hào)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06java集成開發(fā)SpringBoot生成接口文檔示例實(shí)現(xiàn)
這篇文章主要為大家介紹了java集成開發(fā)SpringBoot如何生成接口文檔的示例實(shí)現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10SpringBoot結(jié)合Redis實(shí)現(xiàn)緩存
本文主要介紹了SpringBoot結(jié)合Redis實(shí)現(xiàn)緩存,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06SpringBoot中事務(wù)失效的六個(gè)原因解析
這篇文章主要介紹了SpringBoot中事務(wù)失效的六個(gè)原因解析,由于Spring的事務(wù)是基于AOP的方式結(jié)合動(dòng)態(tài)代理來實(shí)現(xiàn)的,因此事務(wù)方法一定要是public的,這樣才能便于被Spring做事務(wù)的代理和增強(qiáng),需要的朋友可以參考下2023-10-10java四種引用及在LeakCanery中應(yīng)用詳解
這篇文章主要介紹了java四種引用及在LeakCanery中應(yīng)用,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09