最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何基于Spring使用工廠模式實(shí)現(xiàn)程序解耦

 更新時(shí)間:2019年12月26日 08:32:16   作者:宜春  
這篇文章主要介紹了如何基于Spring使用工廠模式實(shí)現(xiàn)程序解耦,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了如何基于Spring使用工廠模式實(shí)現(xiàn)程序解耦,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

1、 啥是耦合、解耦?

既然是程序解耦,那我們必須要先知道啥是耦合,耦合簡單來說就是程序的依賴關(guān)系,而依賴關(guān)系則主要包括

1、 類之間的依賴

2、 方法間的依賴

比如下面這段代碼:

 public class A{
    public int i;
  }

  public class B{
    public void put(A a){
      System.out.println(a.i);
    }
  }


上面這個(gè)例子中A類和B類之間存在一種強(qiáng)耦合關(guān)系,B類直接依賴A類,B類的put方法非A類類型不可,我們把這種情況叫做強(qiáng)耦合關(guān)系。

實(shí)際開發(fā)中應(yīng)該做到:編譯期不依賴,運(yùn)行時(shí)才依賴。怎么理解呢?我們很容易想到多態(tài)向上轉(zhuǎn)型,是的,編譯時(shí)不確定,運(yùn)行時(shí)才確定,當(dāng)然接觸面更廣一點(diǎn)的童鞋會(huì)想到接口回調(diào),是的接口回調(diào)方式也能有效的解耦!如下代碼:

//一個(gè)接口叫做Inter,里面定義了一個(gè)happy()方法,有兩個(gè)類A、B實(shí)現(xiàn)了這個(gè)接口

interface Inter{
  void happy();
}

class A implements Inter{

  @Override
  public void happy() {
    System.out.println("happy...A");
  }
}

class B implements Inter{

  @Override
  public void happy() {
    System.out.println("happy...B");
  }
}

public class Test{
  public void happys(Inter inter){
    inter.happy();
  }
}

是的,如上代碼正是典型的接口回調(diào),Test類中的happys方法參數(shù)變的相對(duì)靈活起來,代碼中Test類與A類、B類之間就存在一種弱耦合關(guān)系,Test類的happys方法的參數(shù)可以使A類類型也可以是B類類型,不像強(qiáng)耦合關(guān)系中非A類類型不可的情形。

從某一意義上來講使用類的向上轉(zhuǎn)型或接口回調(diào)的方式進(jìn)行解耦都是利用多態(tài)的思想!

當(dāng)然解耦的方式還有很多,從根本意義上講實(shí)現(xiàn)低耦合就是對(duì)兩類之間進(jìn)行解耦,解除類之間的直接關(guān)系,將直接關(guān)系轉(zhuǎn)換成間接關(guān)系,從而也有很多設(shè)計(jì)模式也對(duì)程序進(jìn)行解耦,比如:適配器模式、觀察者模式、工廠模式....總之,必須明確一點(diǎn):耦合性強(qiáng)的程序獨(dú)立性很差!

2、 jdbc程序進(jìn)行解耦

先來看一段代碼:

//1、注冊(cè)驅(qū)動(dòng)
DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //如果把jdbc的MySQLjar包依賴去除直接編譯失敗提示沒有mysql  
//2、獲取連接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/ufida","root","root");
//3、獲取操作數(shù)據(jù)庫的預(yù)處理對(duì)象
PreparedStatement pstm=conn.prepareStatement("select * from client");
//4、執(zhí)行SQL,得到結(jié)果集
ResultSet rs=pstm.executeQuery();
//5\遍歷結(jié)果集
while(rs.next()){
  System.out.println(rs.getString("name"));
}
//6、釋放資源
rs.close();
pstm.close();
conn.close();

等等等等,好熟悉好懷念的代碼.....

沒錯(cuò)就是jdbc的代碼,不是用來懷舊的,而是如果這樣設(shè)計(jì),你會(huì)覺得這樣的程序耦合性如何?又如何進(jìn)行解耦?先仔細(xì)思考一番。

一分鐘過去了.....

兩分鐘過去了.....

好了,我們都知道jdbc連接MySQL需要一個(gè)mysql-connector的jar包,如果我們把這個(gè)jar包依賴或者這個(gè)jar包給去掉,顯然上面的這個(gè)程序會(huì)編譯報(bào)錯(cuò),如下圖


顯然這樣的程序耦合性過高!于是我們可以這樣設(shè)計(jì),將第一步的注冊(cè)驅(qū)動(dòng)代碼new的方式改成反射的方式如下:

 //1、new的方式注冊(cè)驅(qū)動(dòng)
DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //如果把jdbc的MySQLjar包依賴去除直接編譯失敗提示沒有mysql相關(guān)的jar包

改為如下方式

 //2、反射的方式注冊(cè)驅(qū)動(dòng)
Class.forName("com.mysql.jdbc.Driver"); //改用這種方式注冊(cè)驅(qū)動(dòng)會(huì)發(fā)現(xiàn)不會(huì)編譯失敗,相比上面的方式相對(duì)解耦,但是依然存在缺陷:若連接改為Oracle數(shù)據(jù)庫,這里的字符串又要進(jìn)行改動(dòng)!

正如注釋的解釋一樣,又一個(gè)缺陷就浮現(xiàn)了:若連接改為Oracle數(shù)據(jù)庫,這里的字符串又要進(jìn)行改動(dòng)!

于是對(duì)于這個(gè)jdbc程序來說就有這樣的一個(gè)解耦思路:

第一步:通過反射來創(chuàng)建對(duì)象,盡量避免使用new關(guān)鍵字

第二步:通過讀取配置文件來獲取創(chuàng)建的對(duì)象全限定類名

3、傳統(tǒng)dao、service、controller的程序耦合性

順著jdbc程序的解耦思路,我們?cè)賮砜纯磦鹘y(tǒng)dao、service、controller的程序耦合性分析

由于只是一個(gè)demo,省去dao層的操作.....

定義一個(gè)Service接口

public interface IAccountOldService{
  public void save();
}

Service接口實(shí)現(xiàn)類

public class AccountServiceOldImpl implements IAccountOldService{
  @Override
  public void save() {
    System.out.println("save成功一個(gè)賬戶....");
  }
}

controller代碼:

public class AccountCencollertOld {
  public static void main(String[] args) {
    IAccountOldService iaccount=new AccountServiceOldImpl (); 
    iaccount.save(); //運(yùn)行結(jié)果:save成功一個(gè)賬戶....
  }
}

到這里,有何想法?表面上來看是沒有一點(diǎn)問題的,So Beautiful,但仔細(xì)的看。表現(xiàn)層與業(yè)務(wù)層、業(yè)務(wù)層與持久層緊緊的互相依賴關(guān)聯(lián),這與我們開發(fā)程序的高內(nèi)聚低耦合原則相違背,哦My God,So Bad!我們順著jdbc程序的解耦思路,我們應(yīng)該盡量避免使用new關(guān)鍵字,我們發(fā)現(xiàn)這些層里面service層new 持久層dao,controller表現(xiàn)層new 業(yè)務(wù)層service....太糟糕了

那么對(duì)此,你有何解耦思路?

4、使用工廠模式實(shí)現(xiàn)解耦

別想了,工廠模式實(shí)現(xiàn)程序解耦你值得擁有!順著jdbc程序的解耦思路:

1、通過讀取配置文件來獲取創(chuàng)建的對(duì)象全限定類名
2、通過反射來創(chuàng)建對(duì)象,盡量避免使用new關(guān)鍵字

首先在resources目錄下中寫一個(gè)bean.properties配置類,具體內(nèi)容如下

accountServiceOld=com.factory.service.impl.AccountServiceOldImpl

接著使用工廠方法代碼:

/**
 * 一個(gè)創(chuàng)建Bean對(duì)象的工廠
 *
 *  1、需要一個(gè)配置文件來配置我們的service和dao  配置文件的內(nèi)容:唯一標(biāo)識(shí)=全限定類名(key-value)
 *  2、通過讀取配置文件中配置的內(nèi)容,反射創(chuàng)建對(duì)象
 *
 *  場景:主要是service調(diào)用dao,controller調(diào)用service的程序。這里面耦合性非常的高,互相new互相依賴
 *
 *  為了解耦,利用工廠模式進(jìn)行
 */
 public class BeanFactoryOld {
  private static Properties props;

  static{
    try {
      //實(shí)例化對(duì)象
      props = new Properties();

      //獲取properties文件的流對(duì)象
      InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
      props.load(in);//加載其對(duì)應(yīng)路徑下的配置文件

    }catch (Exception e){
      throw new ExceptionInInitializerError("初始化properties失??!");
    }
  }

  //根據(jù)bean的名稱獲取bean對(duì)象
  public static Object getBean(String beanName){
    Object bean=null;
    try {
    String beanPath= props.getProperty(beanName);
    bean = Class.forName(beanPath).newInstance();  //這里的newInstance創(chuàng)建實(shí)例(默認(rèn)無參構(gòu)造器)每次執(zhí)行都需要?jiǎng)?chuàng)建一次
    } catch (Exception e) {
      e.printStackTrace();
    }
    return bean;
  }
}

此時(shí),controller的代碼就可以編寫為

/**
 * 這里模擬一個(gè)controller調(diào)用service
 *
 */
public class AccountCencollertOld {
  public static void main(String[] args) {
  //  IAccountOldService iaccount=new AccountServiceOldImpl (); //使用工廠方法不再通過new方式

    IAccountOldService iaccount= (IAccountOldService) BeanFactoryOld.getBean("accountServiceOld");
    iaccount.save(); //運(yùn)行結(jié)果:save成功一個(gè)賬戶....  說明成功調(diào)用了service
  }
}

通過運(yùn)行結(jié)果,屬實(shí)沒毛病,成功降低程序耦合!So Beautiful!先高興一會(huì)吧,因?yàn)轳R上出現(xiàn).....但是,隨之而來的問題又出現(xiàn)了,我們對(duì)這個(gè)controller進(jìn)行一下改寫

for(int i=0;i<5;i++){
    IAccountOldService iaccount= (IAccountOldService) BeanFactoryOld.getBean("accountServiceOld");
    iaccount.save(); 
   }

打印結(jié)果:

com.factory.service.impl.AccountServiceImpl@1540e19d
save成功一個(gè)賬戶....
com.factory.service.impl.AccountServiceImpl@677327b6
save成功一個(gè)賬戶....
com.factory.service.impl.AccountServiceImpl@14ae5a5
save成功一個(gè)賬戶....
com.factory.service.impl.AccountServiceImpl@7f31245a
save成功一個(gè)賬戶....
com.factory.service.impl.AccountServiceImpl@6d6f6e28
save成功一個(gè)賬戶....

打印的是五個(gè)不同的對(duì)象,說明是多例的,每次調(diào)用getBean的時(shí)候都會(huì)newInstance出一個(gè)新對(duì)象,如下


多例每次都要?jiǎng)?chuàng)建對(duì)象,資源浪費(fèi)、效率低下

針對(duì)單例多例情況,我們?cè)賹?duì)service業(yè)務(wù)層代碼進(jìn)行修改:

public class AccountServiceImpl implements IAccountService {
  //定義類成員
  private int i=1; 

  @Override
  public void save() {
    System.out.println("save成功一個(gè)賬戶....");
    System.out.println(i);
    i++;
  }
}

運(yùn)行controller代碼,運(yùn)行結(jié)果

save成功一個(gè)賬戶....
1
save成功一個(gè)賬戶....
1
save成功一個(gè)賬戶....
1
save成功一個(gè)賬戶....
1
save成功一個(gè)賬戶....
1

why?多例因?yàn)槊看味际切碌膶?duì)象,上面也驗(yàn)證過了,因此每次創(chuàng)建新對(duì)象都會(huì)初始化一次,重新賦值,所以都是1,如果我們把類成員改為局部成員變量如下

public class AccountServiceOldImpl implements IAccountOldService {

//  private int i=1; 
  @Override
  public void save() {
    int i=1;  //改為局部變量
    System.out.println("save成功一個(gè)賬戶....");
    System.out.println(i);
    i++;
  }
}

不用猜,運(yùn)行結(jié)果同樣是1。算了還是運(yùn)行一下吧哈哈哈

save成功一個(gè)賬戶....
1
save成功一個(gè)賬戶....
1
save成功一個(gè)賬戶....
1
save成功一個(gè)賬戶....
1
save成功一個(gè)賬戶....
1

說了這么多,通過觀察service和dao之間單不單例好像無所謂,因?yàn)樗麄冎g并沒有業(yè)務(wù)方法中改變的類成員,所以并不需要多例來保證線程安全。那說這些有何意義?不要忘了,由于使用了工廠改進(jìn)如下中的.newInstance創(chuàng)建實(shí)例(默認(rèn)無參構(gòu)造器)每次執(zhí)行都需要?jiǎng)?chuàng)建一次,這樣就不好了(浪費(fèi)資源),因此我們要設(shè)計(jì)出只newInstance創(chuàng)建一次實(shí)例就很完美了,這也是我為啥要在service和controller中都添加一個(gè)Old關(guān)鍵字的原因了,接下來我們來看看工廠是如何改進(jìn)的!

5、工廠模式改進(jìn)

為了不被搞暈,我們重新寫代碼,也就是重頭開始寫代碼~其實(shí)就是把Old去掉~

由于只是一個(gè)demo,省去dao層的操作.....

定義一個(gè)Service接口

public interface IAccountService {
  public void save();
}

Service接口實(shí)現(xiàn)類

public class AccountServiceImpl implements IAccountService{

  @Override
  public void save() {
    System.out.println("save成功一個(gè)賬戶....");
  }
}

controller代碼:

/**
 * 這里模擬一個(gè)controller調(diào)用service
 *
 */
public class AccountCencollert {
  public static void main(String[] args) {
//    IAccountService iaccount=new AccountServiceImpl(); 

    IAccountService iaccount= (IAccountService) BeanFactory.getBean("accountService");
    iaccount.save(); //運(yùn)行結(jié)果:save成功一個(gè)賬戶....  說明了成功調(diào)用了service
   }
 }

改進(jìn)的工廠方法代碼:

public class BeanFactory {
  private static Properties props;

  //定義一個(gè)map容器,用于存放創(chuàng)建的對(duì)象
  private static Map<String,Object> beans; //改進(jìn)的代碼============

  static{
    try {
      //實(shí)例化對(duì)象
      props = new Properties();

      //獲取properties文件的流對(duì)象
      InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
      props.load(in);//加載其對(duì)應(yīng)路徑下的配置文件

      ////////////////////以下是改進(jìn)的代碼=======================
      //實(shí)例化容器
      beans=new HashMap<String,Object>();
      //取出配置文件中所有的key值
      Enumeration<Object> keys = props.keys();
      //遍歷枚舉
      while(keys.hasMoreElements()){
        //取出每個(gè)key
        String key = keys.nextElement().toString();
        //根據(jù)key取出對(duì)應(yīng)的value (這里因?yàn)槊總€(gè)value值對(duì)應(yīng)著類路徑)
        String beanPath = props.getProperty(key);
        //反射創(chuàng)建對(duì)象
        Object value = Class.forName(beanPath).newInstance();
        //把key和value存入容器中
        beans.put(key,value);
      }
    }catch (Exception e){
      throw new ExceptionInInitializerError("初始化properties失?。?);
    }
  }


  //隨著代碼的改進(jìn),我們就可以簡化下面的獲取bean對(duì)象的方法,如下代碼
  /**
   * 根據(jù)bean的名稱獲取對(duì)象(單例)
   */
  public static Object getBean(String beanName){
    //通過Map容器對(duì)應(yīng)key來獲取對(duì)應(yīng)對(duì)象
    return beans.get(beanName);  //這里通過Map容器中獲取,這樣就不會(huì)每次都創(chuàng)建一次實(shí)例!
  }

//不再使用下面的方法
 /*
  //根據(jù)bean的名稱獲取bean對(duì)象
  public static Object getBean(String beanName){
    Object bean=null;
    try {
    String beanPath= props.getProperty(beanName);
    bean = Class.forName(beanPath).newInstance();  //這里的newInstance創(chuàng)建實(shí)例(默認(rèn)無參構(gòu)造器)每次執(zhí)行都需要?jiǎng)?chuàng)建一次,這樣就不好了
    } catch (Exception e) {
      e.printStackTrace();
    }
    return bean;
  }*/
}

從上面改進(jìn)的工廠代碼,我們可以發(fā)現(xiàn)一開始就定義一個(gè)Map容器,用于存放創(chuàng)建的對(duì)象,為啥要先定義一個(gè)Map容器呢?用一個(gè)容器將這個(gè)實(shí)例裝起來,這是由于不把這個(gè)對(duì)象裝存起來的話,這個(gè)對(duì)象不使用很容易被GC掉,何況我們現(xiàn)在只使用這一個(gè)對(duì)象!

定義一個(gè)Map容器存放配置好的文件中的每個(gè)對(duì)象,之后我們就直接提供一個(gè)根據(jù)Map的key來取value的getBean方法,這樣不僅僅擴(kuò)展了程序的配置文件的靈活性而且還保證了只產(chǎn)生一個(gè)對(duì)象,保證資源不浪費(fèi),So Beautiful !

那如何證明已經(jīng)是單例的模式了呢?很簡單,如下設(shè)計(jì)一下service業(yè)務(wù)層、controller表現(xiàn)層代碼即可:

service業(yè)務(wù)層:添加一個(gè)類成員屬性,并在方法內(nèi)部 i++;

public class AccountServiceImpl implements IAccountService {

  private int i=1; //類成員屬性

  @Override
  public void save() {
    System.out.println("save成功一個(gè)賬戶....");
    System.out.println(i);
    i++;//二次改革代碼
  }
}

controller表現(xiàn)層: 創(chuàng)建調(diào)用工廠5次創(chuàng)建對(duì)象的方法

/**
 * 這里模擬一個(gè)controller調(diào)用service
 *
 */
public class AccountCencollert {
  public static void main(String[] args) {
    for(int i=0;i<5;i++){
      IAccountService iaccount= (IAccountService) BeanFactory.getBean("accountService");
      System.out.println(iaccount); //打印的是五個(gè)不同的對(duì)象,說明是多例的
      iaccount.save(); //會(huì)發(fā)現(xiàn)打印的i值都是1,并沒有自增成功
    }
  }

運(yùn)行代碼結(jié)果:

com.factory.service.impl.AccountServiceImpl@1540e19d
save成功一個(gè)賬戶....
1
com.factory.service.impl.AccountServiceImpl@1540e19d
save成功一個(gè)賬戶....
2
com.factory.service.impl.AccountServiceImpl@1540e19d
save成功一個(gè)賬戶....
3
com.factory.service.impl.AccountServiceImpl@1540e19d
save成功一個(gè)賬戶....
4
com.factory.service.impl.AccountServiceImpl@1540e19d
save成功一個(gè)賬戶....
5

發(fā)現(xiàn),確實(shí)5個(gè)對(duì)象都是同一個(gè),并且出現(xiàn)了改變類成員屬性的現(xiàn)象。

如果我們把類成員屬性改為局部成員屬性呢?

public class AccountServiceImpl implements IAccountService {

  @Override
  public void save() {
    int i=1; //局部成員屬性
    System.out.println("save成功一個(gè)賬戶....");
    System.out.println(i);
    i++;
  }
}

運(yùn)行結(jié)果

com.factory.service.impl.AccountServiceImpl@1540e19d
save成功一個(gè)賬戶....
1
com.factory.service.impl.AccountServiceImpl@1540e19d
save成功一個(gè)賬戶....
1
com.factory.service.impl.AccountServiceImpl@1540e19d
save成功一個(gè)賬戶....
1
com.factory.service.impl.AccountServiceImpl@1540e19d
save成功一個(gè)賬戶....
1
com.factory.service.impl.AccountServiceImpl@1540e19d
save成功一個(gè)賬戶....
1

看到這個(gè)結(jié)果,我們就能聯(lián)想到,之前為什么servlet中為啥要避免定義類成員,原因就在這里!多例情況下,就不會(huì)出現(xiàn)這種情況?。。?!

6、結(jié)語

到這里我們已經(jīng)基本了解了程序間的耦合與解耦,并且對(duì)單例多例也一并進(jìn)行了進(jìn)一步的了解。而spring中正是使用工廠模式來實(shí)現(xiàn)程序解耦的,spring是一個(gè)大工廠, 或許你并沒有察覺哈哈哈哈.....

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot+redis+Interceptor+自定義annotation實(shí)現(xiàn)接口自動(dòng)冪等

    Springboot+redis+Interceptor+自定義annotation實(shí)現(xiàn)接口自動(dòng)冪等

    本篇文章給大家介紹了使用springboot和攔截器、redis來優(yōu)雅的實(shí)現(xiàn)接口冪等,對(duì)于冪等在實(shí)際的開發(fā)過程中是十分重要的,因?yàn)橐粋€(gè)接口可能會(huì)被無數(shù)的客戶端調(diào)用,如何保證其不影響后臺(tái)的業(yè)務(wù)處理,如何保證其只影響數(shù)據(jù)一次是非常重要的,感興趣的朋友跟隨小編一起看看吧
    2019-07-07
  • Spring中的Bean對(duì)象初始化詳解

    Spring中的Bean對(duì)象初始化詳解

    這篇文章主要介紹了Spring中的Bean對(duì)象初始化詳解,我們也可以根據(jù)Java語言的特性猜測(cè)到其很有可能是通過反射機(jī)制來完成Bean的初始化操作,接下來我們一步一步的剖析Spring對(duì)Bean的初始化操作,需要的朋友可以參考下
    2023-12-12
  • SpringBoot 整合 JMSTemplate的示例代碼

    SpringBoot 整合 JMSTemplate的示例代碼

    這篇文章主要介紹了SpringBoot 整合 JMSTemplate的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Spark MLlib隨機(jī)梯度下降法概述與實(shí)例

    Spark MLlib隨機(jī)梯度下降法概述與實(shí)例

    這篇文章主要為大家詳細(xì)介紹了Spark MLlib隨機(jī)梯度下降法概述與實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • IDEA最新版2020.1的maven工程本地依賴倉庫無法使用問題(已解決)

    IDEA最新版2020.1的maven工程本地依賴倉庫無法使用問題(已解決)

    這篇文章主要介紹了IDEA最新版2020.1的maven工程本地依賴倉庫無法使用問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • SpringBoot根據(jù)目錄結(jié)構(gòu)自動(dòng)生成路由前綴的實(shí)現(xiàn)代碼

    SpringBoot根據(jù)目錄結(jié)構(gòu)自動(dòng)生成路由前綴的實(shí)現(xiàn)代碼

    本文介紹如何根據(jù)目錄結(jié)構(gòu)給RequestMapping添加路由前綴,具體實(shí)現(xiàn)方法,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-08-08
  • 關(guān)于@EnableGlobalMethodSecurity注解的用法解讀

    關(guān)于@EnableGlobalMethodSecurity注解的用法解讀

    這篇文章主要介紹了關(guān)于@EnableGlobalMethodSecurity注解的用法解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringBoot如何通過devtools實(shí)現(xiàn)熱部署

    SpringBoot如何通過devtools實(shí)現(xiàn)熱部署

    這篇文章主要介紹了SpringBoot如何通過devtools實(shí)現(xiàn)熱部署,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 一文詳解如何在Java中啟動(dòng)線程

    一文詳解如何在Java中啟動(dòng)線程

    今天要跟大家聊一聊Java多線程的原理和使用方式,Java多線程是提高程序性能的重要機(jī)制,了解線程生命周期、同步機(jī)制、線程池和線程間通信等概念,可以幫助我們編寫出高效、可靠的多線程程序,需要的朋友可以參考下
    2024-07-07
  • Springboot Logback日志多文件輸出方式(按日期和大小分割)

    Springboot Logback日志多文件輸出方式(按日期和大小分割)

    這篇文章主要介紹了Springboot Logback日志多文件輸出方式(按日期和大小分割),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評(píng)論

兴义市| 额尔古纳市| 囊谦县| 广汉市| 越西县| 永川市| 惠州市| 黎平县| 富顺县| 新野县| 新郑市| 泌阳县| 吉林省| 同仁县| 甘德县| 余庆县| 姜堰市| 泰州市| 同德县| 西平县| 洮南市| 庄浪县| 石棉县| 望江县| 石柱| 黑水县| 宜兴市| 甘孜县| 磐石市| 通山县| 城市| 临沭县| 称多县| 凌海市| 湖北省| 威宁| 湖州市| 石景山区| 河津市| 高密市| 揭东县|