配置加载顺序
1 SpringBoot配置文件可以放置在多种路径下,不同路径下的配置优先级有所不同。
可放置目录(优先级从高到低)
file:./config/ (当前项目路径(运行目录)的config目录下);
file:./ (当前项目路径);
classpath:/config/ (类路径config目录下);
classpath:/ (类路径config下).
2 运行只通过运行时参数 == --spring.config.path=/xxxx/config/ --spring.config.name=abc == 指定配置文件的目录和配置文件的名字(后缀为properties)
3
文件分块与合并
//源文件
File sourceFile = new File("E:\\test\\test.avi");
//块文件目录
String chunkFileFolder = "E:\\test\\chunks\\";
//先定义块文件大小
long chunkFileSize = 1 * 1024 * 1024;
//块数
long chunkFileNum = (long) Math.ceil(sourceFile.length() * 1.0 /chunkFileSize);
//创建读文件的对象
RandomAccessFile raf_read = new RandomAccessFile(sourceFile,"r");
//缓冲区
byte[] b = new byte[1024];
for(int i=0;i<chunkFileNum;i++){
//块文件
File chunkFile = new File(chunkFileFolder+i);
//创建向块文件的写对象
RandomAccessFile raf_write = new RandomAccessFile(chunkFile,"rw");
int len = -1;
while((len = raf_read.read(b))!=-1){
raf_write.write(b,0,len);
//如果块文件的大小达到 1M开始写下一块儿
if(chunkFile.length()>=chunkFileSize){
break;
}
}
raf_write.close();
}
raf_read.close();
//块文件目录
String chunkFileFolderPath = "E:\\test\\chunks\\";
//块文件目录对象
File chunkFileFolder = new File(chunkFileFolderPath);
//块文件列表
File[] files = chunkFileFolder.listFiles();
//将块文件排序,按名称升序
List<File> fileList = Arrays.asList(files);
Collections.sort(fileList, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
if(Integer.parseInt(o1.getName())>Integer.parseInt(o2.getName())){
return 1;
}
return -1;
}
});
//合并文件
File mergeFile = new File("E:\\ffmpeg_test\\lucene_merge.avi");
//创建新文件
boolean newFile = mergeFile.createNewFile();
//创建写对象
RandomAccessFile raf_write = new RandomAccessFile(mergeFile,"rw");
byte[] b = new byte[1024];
for(File chunkFile:fileList){
//创建一个读块文件的对象
RandomAccessFile raf_read = new RandomAccessFile(chunkFile,"r");
int len = -1;
while((len = raf_read.read(b))!=-1){
raf_write.write(b,0,len);
}
raf_read.close();
}
raf_write.close();
注解
Conditional 和 Condition
@Conditional 注解是 Spring 4.0 之后出的一个注解,与其搭配的一个接口是 Condition,@Conditional 注解会根据具体的条件决定是否创建 bean 到容器中,接下来看看 @Conditional 注解的简单使用
public interface HandlersBuilder {
RouteRequestPipeline build();
}
@Conditional(VendorCondition.class)
@ConditionalOnVendor(vendor = "NG")
public class NGHandlersBuilder implements HandlersBuilder {
@Override
public RouteRequestPipeline build() {
RouteRequestPipeline pipeline = new DefaultRouteRequestPipeline();
//XXXX
return pipeline;
}
}
public class VendorCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
try {
AnnotationMetadataReadingVisitor v = (AnnotationMetadataReadingVisitor) metadata;
ConditionalOnVendor vendor = Class.forName(v.getClassName()).getDeclaredAnnotation(ConditionalOnVendor.class);
if(vendor != null && vendor.vendor() != null) {
return vendor.vendor().equalsIgnoreCase(Config.getParameter("VENDOR"));
}
} catch (Exception e) {
}
return false;
}
}
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface ConditionalOnVendor {
String vendor();
}