Spring高級話題(2)
阿新 • • 發佈:2018-08-30
實例化 type cron 獲得 接口 corn 地址 自動掃描 on() 表示每天早上六點啟動這個任務,其中corn表達式可以百度到的。
目錄
- 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 * * ?")
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)