springBoot容器启动流程
main方法启动时,springBoot启动流程的各个生命周期会以事件通知的方式,把事件告知其他程序前期通过spring-spi获取所有监听事件的类
spring启动的大体流程为以下的几个方法 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677public class EventPublishingRunListener implements SpringApplicationRunListener { ... private final SimpleApplicationEventMulticaster initialMulticaster = new SimpleApplicationEventMulticaster(); public EventPublishingRunListener(SpringA ...
获取spring启动环境的工具类
必须用到的枚举工具类
参考通用枚举的---使用例子一 通用枚举
定义ENV枚举1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859@Slf4jpublic enum ENV implements IEnums<String> { RELEASE("正式", "release", "prod"), PRE("预发", "pre"), TEST("测试", "test", "test1", "test2", "test3"), DEV("dev", "dev"), LOCAL("本地", "local&q ...
分析spring的Environment(配置文件)的加载
项目立项->开发->测试->维护->上线->维护,这几个过程中分为不同的环境。不同的环境不同业务有着不同的逻辑。spring完美支持启动的时候加载不同的配置文件。我们通过指定不同的spring.profiles.active即可实现加载不同的配置文件。不管怎么样默认会加载如下几个配置文件
1234567891011121314151617181920212223public class ConfigFileApplicationListener implements EnvironmentPostProcessor, SmartApplicationListener, Ordered { ... // Note the order is from least to most specific (last one wins) private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,f ...
java如何优雅的打印log
1 用sl4j(采用门面模式,不提供实现,且提供占位符打印的方式)2 过长的内容没有意义,集合最多打印几十个3 如果有字符串拼接或者toJSON的情况,打印log之前判断该级别是否开启,不然会白白浪费cpu4 对于第3点可优化的地方,用下面的util,配合着sl4j,这样就不用写判断日志级别是否开启的代码了
12345678910111213public abstract class LogUtils { public static LogUtils lazyJson(Object object) { return new LogUtils() { String json = null; @Override // 只有在输出的时候在toJSON,并且如果是集合的类型限制最多输出100个 public String toString() { return json != null ? json : (json ...
重新加装MybatisPlus
1.字段填充器注意重写了strictFill方法统一规范,字段填充的值和类型所有的表都一样。所以不作类型判断。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253@Componentpublic class FieldAutoFillHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { User user = CurrentUser.getCurrentUser(); this.strictInsertFill(metaObject, "deleteFlag", null, DeleteFlag.N); this.strictInsertFill(metaObject, "isDelete", ...
MybatisPlus针对Saas系统的动态多租户插件
多租户就是用额外的一个字段代表当前表中的数据的归属。在sql curd时根据上下文的用户(租户) 自动拼接此条件动态就是有些表是公用的,没有多租户的概念。那么操作此表的时候需要排除,亦或者多个字段,每个字段的值都不一样等
前期工作1.首先定义一个多租户字段的枚举,为提取数据库多租户字段的字段做准备IEnums参考通用枚举
1234567891011121314151617181920212223242526272829303132@Getterpublic enum TenantField implements IEnums<String> { // mid 为我们系统的租户字段 // CurrentTenant 是业务系统的上下文,比如说当前的登录用户信息,可以自由改造 MID("商户id", "mid", () -> CurrentTenant.getCurrentTenant().getMid()), ; private final String[] dbFieldNames; ...
java的序列化和反序列化Serializable原理
背景实现Serializable接口就能把对象序列化反序列化出去,那么原理是什么呢?带着以下问题一探究竟
为什么实现这个接口就能序列化和反序列化呢?
序列化和反序列化的内容是什么呢,可以自定义吗?
为什么实现这个接口就能序列化和反序列化呢
java序列化代码 123456789public static void main(String[] args) throws IOException { Object o = new Serializable() { String strValue = "这是内容"; Integer intValue = 999; }; File file = new File(System.getProperty("java.io.tmpdir"), "serializable/"); ObjectOutputStream objectOutputStream = new ObjectOutputStream( ...
mybatisPlus分析Lambda语法原理
用lambda就不用写字符串了,这个对于开发业务来说,能减少很多的错误发生。尤其是字段写错了,数据库变更字段名了,等。用法如下
1eq(FissionCoupon::getMid, mid)
他会自动转换为mid,那他的原理是什么呢?原来他接受的是一个可序列化的Function对象
123@FunctionalInterfacepublic interface SFunction<T, R> extends Function<T, R>, Serializable {}
其实用到了jdk自带的序列化。因为lambda是个特殊的实例,也是个特殊的class。在序列化的时候lambda实例中有一个writeReplace方法。
可参考jdk的序列化 Serializable原理该方法的返回值是一个lambda描述对象,java.lang.invoke.SerializedLambda 1234567891011121314public final class SerializedLambda implements Serializabl ...
枚举序列化和反序列化的代码
在java或各种框架中,[反]序列化对枚举类型默认一般都是用的枚举的名称。如果代码有魔法值,我们想改成枚举类型。但我们在改造、重构后端的时候不想对前端或者第三方有影响,可以用到此方法。
必须用到的枚举工具类
参考通用枚举 通用枚举所有的枚举想要实现(反)序列化比较要用到通用枚举,实现通用枚举的接口即可
代码(最初版本)1.可反序列化的枚举
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768/** * 可反序列化的枚举 */public enum DeserializableEnum { // DBEnum是MybatisPlus枚举的adapter,增加了getDoc的方法。MybatisPlus是直接支持数据库[反]序列化的。但是还不支持和前端的[反]序列化的交互,所以在此配置即可。 DB_Enum(DBEnum.class, DBEnum::getVal ...
mvc枚举序列化和反序列化的配置
必须用到的枚举工具类
参考通用枚举 通用枚举
使用背景spring mvc 接收或者序列化枚举类型时,
默认是根据枚举的名称(string)进行序列化或者反序列化。但是在实际开发当中,我们一般用枚举代表某一个数值,数据库存储值。
同时我们也希望和前端交互用数值交互,而不是string名称。因此用到这个工具类支持以下几个组件的反序列化和序列化
spring convert@RequestParam@PathVariable...
jackson@ResponseBody
fastjsonJSON.parseObject(...)
代码
枚举序列化和反序列化的代码 枚举序列化和反序列化的代码
使用方式springConverter组件的使用spring 接收参数为form表单请求时,默认用的converter组件进行转换对象
12345678@Configurationpublic class AddEnumConverter implements WebMvcConfigurer { @Override public void addFormatters(For ...