1. 程式人生 > >Spring高級話題(2)

Spring高級話題(2)

實例化 type cron 獲得 接口 corn 地址 自動掃描 on()

目錄

  • 1、計劃任務@Scheduled
    • 1.1、理論
    • 1.2、示例
  • 2、條件註解@Conditional
    • 2.1、理論
    • 2.1、示例
  • 3、組合註解和元註解
    • 3.1、理論
    • 3.2、示例

所有代碼示例必須配置好Spring Spring項目的快速搭建.
本系列是為了給後面學習SpringBoot打好基礎,所以本系列的目的不是詳細講解Spring的知識點,而是將工作中常用的知識點羅列出來,由於SpringBoot用的是JAVA配置,所以在羅列知識點時候全部都用JAVA配置。

1、計劃任務@Scheduled

1.1、理論

計劃任務在Spring中的實現將會變得非常簡單,直接在配置類上使用@EnableScheduling來開啟對計劃任務的支持,然後在要執行計劃任務的方法上註解@Scheduled,聲明這是一個計劃任務。例如@Scheduled(cron = "0 0 6 * * ?")

表示每天早上六點啟動這個任務,其中corn表達式可以百度到的。

1.2、示例

1)配置類

package com.wisely.highlight_spring4.ch3.taskscheduler;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration//表示這是一個配置類
//會自動掃描在這個地址下面的所有的包及其他們的子包
@ComponentScan("com.wisely.highlight_spring4.ch3.taskscheduler")
@EnableScheduling //開啟計劃任務支持
public class TaskSchedulerConfig {

}

2)執行類

package com.wisely.highlight_spring4.ch3.taskscheduler;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

@Service
public class ScheduledTaskService {
    
      private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

      @Scheduled(cron = "*/5 * * * * ?"  ) //每隔5秒執行一次
      public void fixTimeExecution(){
          System.out.println("在指定時間 " + dateFormat.format(new Date())+"執行");
      }

}

3)測試類

package com.wisely.highlight_spring4.ch3.taskscheduler;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
         AnnotationConfigApplicationContext context =
                    new AnnotationConfigApplicationContext(TaskSchedulerConfig.class);
         
    }

}

4)結果
技術分享圖片

2、條件註解@Conditional

2.1、理論

之前我們有說過可以通過profile來獲得不同的Bean,Spring4提供了一個更通用的基於條件的Bean的創建---使用@Conditional註解。其實就是根據條件判斷到底要裝配哪一個實現類。SpringBoot會大量應用條件註解,我們先簡單看一個示例。

2.1、示例

1)創建服務接口類

package com.wisely.highlight_spring4.ch3.conditional;

public interface ListService {
    public String showListCmd();
}

2)接口實現類

package com.wisely.highlight_spring4.ch3.conditional;

public class WindowsListService implements ListService {

    @Override
    public String showListCmd() {
        return "dir";
    }

}
package com.wisely.highlight_spring4.ch3.conditional;

public class LinuxListService implements ListService{

    @Override
    public String showListCmd() {
        return "ls";
    }

}

3)條件判斷類

package com.wisely.highlight_spring4.ch3.conditional;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class WindowsCondition implements Condition {

    public boolean matches(ConditionContext context,
            AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().getProperty("os.name").contains("Windows");
    }

}
package com.wisely.highlight_spring4.ch3.conditional;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class LinuxCondition implements Condition {

    public boolean matches(ConditionContext context,
            AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().getProperty("os.name").contains("Linux");
    }

}

4)配置類

package com.wisely.highlight_spring4.ch3.conditional;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConditionConifg {
    @Bean
    @Conditional(WindowsCondition.class) //如果WindowsCondotion類返回的是true則實例化WindowsListService
    public ListService windowsListService() {
        return new WindowsListService();
    }

    @Bean
    @Conditional(LinuxCondition.class) //如果LinuxCondition類返回的是true則實例化LinuxListService
    public ListService linuxListService() {
        return new LinuxListService();
    }

}

5)測試類

package com.wisely.highlight_spring4.ch3.conditional;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(ConditionConifg.class);
        
        ListService listService = context.getBean(ListService.class);
        
        
        System.out.println(context.getEnvironment().getProperty("os.name") 
                + "系統下的列表命令是: " 
                + listService.showListCmd());
        
        context.close();
    }
}

6)結果
技術分享圖片

3、組合註解和元註解

3.1、理論

  • 組合註解:就是把多個註解組合成一個新的註解。
  • 元註解:修飾註解的註解(@Target,@Retention,@Documented,@Inherited)。

3.2、示例

主要演示一下組合註解
1)配置組合註解

package com.wisely.highlight_spring4.ch3.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration 
@ComponentScan 
public @interface ABC {
    
    String[] value() default {}; 
}

2)新的配置類

package com.wisely.highlight_spring4.ch3.annotation;

@ABC("com.wisely.highlight_spring4.ch3.annotation")
public class DemoConfig {

}

3)服務Bean

package com.wisely.highlight_spring4.ch3.annotation;

import org.springframework.stereotype.Service;

@Service
public class DemoService {
    
    public void outputResult(){
        System.out.println("新註解獲取Bean");
    }

}

4)測試

package com.wisely.highlight_spring4.ch3.annotation;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(DemoConfig.class);
        
        DemoService demoService =  context.getBean(DemoService.class);
        
        demoService.outputResult();
        
        context.close();
    }

}

5)結果
技術分享圖片

Spring高級話題(2)