Yaml File as Config File Using

Spring中使用yaml作为配置文件 写定制的时候经常会遇到这样的情况,一些小而繁杂的配置项在数据库中配置太过麻烦,卸载application.properties中又太过臃肿,针对这种情况,我们可以使用yaml作为配置文件,直接在model类中将yaml配置引入即可。具体使用方法如下: Step1: 创建yaml解析类 1 2 3 4 5 6 7 8 9 10 11 public class YamlPropertySourceFactory implements PropertySourceFactory { @Override public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException { Resource classResource = resource.getResource(); if (classResource.exists()) { PropertySource<?> sources = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), classResource,null); return sources==null ? new MapPropertySource(name, new HashMap<>()) : sources; } return new MapPropertySource(name, new HashMap<>()); } } Step2: 设置配置文件 在项目的 ...

<span title='2022-10-08 11:10:20 +0800 +0800'>October 8, 2022</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;Yuanpeng11

Chain of Responsibility

责任链设计模式实战 责任链设计模式 责任链设计模式 学习网站: https://refactoring.guru/design-patterns 优点 符合单一职责原则:后期修改只需要修改具体的实现类。 开闭原则:后期增加逻辑只需要新增具体的实现类。

<span title='2022-09-29 10:04:14 +0800 +0800'>September 29, 2022</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;YuanPeng11

论如何在没有Kafkatool的情况下存活

论如何在没有Kafkatool的情况下存活 众所周知,最近服务器加固的越来越高,导致有些服务器的kafka已经不能在kafkatool上访问,当然不排除是kafkatool有问题,但是无论是哪种情况,Kafka命令的使用已经迫在眉睫,所以总结一下。 kafka的安装 https://downloads.apache.org/kafka/ 安装 .tgz版本的,no src.tgz,src代表着source,下载下来的是资源,还需要gradle编译,有点麻烦。 安装完成后启动zookeeper,关于zookeeper,虽然我们有在使用,但是它是什么呢?为什么Kafka要用它?还有什么场景会使用Zk?关于Zk的问题有点多,后面单独开一个章节去学习Zk。 关于所有的脚本都在/bin目录下,我们可以看到命名非常清晰,我们可以直接上手使用。 启动Zk命令 1 2 // -daemon代表后台运行 后面还可以指定特定的配置文件 如果没有指定就会默认使用 /config/zookeeper.properties ./zookeeper-server-start.sh -daemon 启动kafka 1 2 // 和Zk同样的道理 ./kafka-server-start.sh -daemon Kafka的使用 Topic的创建 常用命令 查询kafka topic列表 ./kafka-topics.sh –list –zookeeper localhost:

<span title='2022-06-10 18:09:16 +0800 +0800'>June 10, 2022</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;YuanPeng11

Android Learning 9

知识填充 布局相关 LayoutInflater 在绑定Fragment的时候我们会用到LayoutInflater.inflate(), 该方法返回一个View对象,所以我们可以知道该方法的作用就是将xml布局文件加载为View或者ViewGroup对象。而LayoutInflater就是一个总的工具,有多个inflate方法。 获取LayoutInflater 1 2 3 LayoutInflater inflater1 = LayoutInflater.from(this); LayoutInflater inflater2 = getLayoutInflater(); LayoutInflater inflater3 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 后面两种其实走的都是第一种方法。this就是context。 .infalte()方法使用 .infalte()有多个重载的方法。 1 2 3 4 inflate(int resource, ViewGroup root) inflate(int resource, ViewGroup root, boolean attachToRoot) inflate(XmlPullParser parser, ViewGroup root) inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) 看源码可知,四个方法,前三个其实都是调用的第四个。 ...

<span title='2022-04-06 10:25:28 +0800 +0800'>April 6, 2022</span>&nbsp;·&nbsp;3 min&nbsp;·&nbsp;YuanPeng11

Android Learning 8

今日份学习,综合之前学习过的知识,学习google推出的总结性APP - Sunflower https://github.com/android/sunflower 查漏补缺的同时将此APP进行本地化适配,因为使用的是wikimedia的源获取数据。 SunFlower 首先拉代码,跑起来,忘记有代码,然后看一下整个APP的结构。 首页的上半部分,一个title + header是固定,这块可以写在Activity中,header中有两个button,点击切换Fragment。 我的花园-Fragment: 用了一个GridView来展示添加的花园,这块的数据应该是是存入数据库的。 我的花园-植物详情-Fragment:点击我的植物后会进入到植物详情的Fragment,展示植物的详细信息,有一个返回按钮和分享按钮。 植物目录-Fragment: 同样是一个GridView来展示植物列表,这块的数据应该是从网络上拉取,缓存到数据库的。 植物目录-植物详情-Fragment:植物详情的Fragment就是展示从wiki上拉下来的植物数据,和我的花园的植物详情可以用一个Fragment。 植物目录-植物详情-添加植物-button:植物图片的下方有一个加号,可以进行植物的添加,植物添加后入库,然后我的花园页面显示。 还有一个给自己添加的植物浇水的功能,由于等待浇水的时间都比较长,所以先开发这些,后面再来浇水。梳理完毕,剩下的就是开整,使用现成的项目学习的话比较省事的是不用寻找静态资源。 IGarden 新建项目,起名就要IGarden吧,毕竟整个项目是个花园。为了方便,首先吧Sunflower需要的所有依赖以及静态资源全部导入。 CoordinatorLayout 这个Layout是2015年I/O大会上发布的Android Design Support Library,主要就是更好的使用material design。CoordinatorLayout是库中的一个FrameLayout,继承自ViewGroup。 顾名思义,协调者布局。为啥叫协调者?有点懵逼。CoordinatorLayout是一个"super-powered FrameLayout"。看了不少博文,终于还是有一点理解了,协调者协调的是child之间的联动,比如说有一个TopBar, TopBar下面有一个RecyclerView,当RecyclerView被滑动的时候如果我想隐藏TopBar怎么办?这时候就可以用协调者布局了。 那CoordinatorLayout是如何做到协调的呢?在CoordinatorLayout内部,每一个child都必须有一个Behavior,CoordinatorLayout根据这个Behavior去进行协调。那么Behavior到底是啥呢? 其实Behavior里面有一系列的方法,如下面所示 1 onStartNestedScroll(), onNestedScrollAccepted(),onStopNestedScroll(),onNestedScroll(), onNestedPreScroll(),onNestedFling(),onNestedPreFling() 所以说怎么协调的就很明了了,实际上就是使用触摸操作来控制View的滑动(我自己的理解)。 NestedScrolling 在Behavior方法中,这些方法的都有一个Nested的的标志,这个Nested又是干什么的呢?不得不说,Android东西可真多。先看下面的博文,但是下面的博文又说先让了解时间分发机制。 https://www.jianshu.com/p/aff5e82f0174 Android事件分发机制 关于Android事件,最常见的应该就是点击事件吧,对于一个View可以设置它的点击事件监听器。但是除了这个,还有巨多事件,从手指接触屏幕到手指离开屏幕的这一过程产生的一系列事件都叫做事件列。 具体的有下面的几个: MotionEvent.ACTION_DOWN 按下View开始 MotionEvent.ACTION_UO 抬起View MotionEvent.ACTION_MOVE 滑动View MotionEvent.ACTION_CANCEL 结束时间,非人为原因 ViewPager2 有点难以理解Sunflower如何做到在两个fragment之间滑动的,所以看了代码,发现是使用了ViewPager2+TabLayout来实现的。整体的代码实现其实不难,下面直接上代码吧。 首先在布局文件中定义TabLayout和ViewPage2,在ViewPager中可以添加控件,到ViewPager2就不行了,只能和TabLayout平级。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/header_title" android:layout_width="match_parent" android:layout_height="60dp" android:gravity="center" android:text="@string/app_name" android:textAppearance="?attr/textAppearanceHeadline5" android:textColor="@color/sunflower_white" android:textSize="30sp" /> <com.google.android.material.tabs.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="60dp" style="@style/Widget.MaterialComponents.TabLayout.Colored" app:tabIconTint="@drawable/tab_icon_color_selector" app:tabTextColor="?attr/colorPrimaryDark" /> <androidx.viewpager2.widget.ViewPager2 android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 为了方便,直接使用了线性布局。 ...

<span title='2022-04-01 10:27:47 +0800 +0800'>April 1, 2022</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;YuanPeng11