🧩 开发框架与中间件
未读1. 概述这篇文章将阐述怎么在 Spring 中使用 Profile 从 Spring 3.1 开始,我们能够将 bean 映射到不同的 profile 上,如 dev, test, prod 等。 我们也能够根据环境 (environment) 来激活不同的 profile,从而加载我们需要的 bean。 2. 在 Bean 上使用 @Profile我们先从简单的例子开始,看看怎么把 bean 绑定到不同的 profile 上。 使用 @Profile 注解,我们可以将 bean 绑定到指定的 profile 上。这个注解支持绑定一个或多个 profile。 试想这样一个场景:我们有一个 bean,只在开发环境需要,线上环境不需要。那么我们可以通过注解将这个 bean 绑定到 dev profile 上。这样,这个 bean 只会存在于开发环境,而在其他环境中不会被加载。如下所示: 1234@Component@Profile("dev")public class DevDatasourceConfig 上面的写法是指绑定 bean 到 de ...
🧱 后端开发与架构
未读互联网是基于 HTTP 协议构建的,而 HTTP 协议因为简单流行开来,但是 HTTP 协议是无状态(通信层面上虚电路比数据报昂贵太多)的,为此人们为了追踪用户想出了各种办法,包括 cookie/session 机制、token、flash 跨浏览器 cookie 甚至浏览器指纹等。 把用户身份藏在每一个地方(浏览器指纹技术甚至不需要存储介质) 讲使用 spring security 等具体技术的资料已经很多了,这篇文章不打算写框架和代码的具体实现。我们会讨论认证和授权的区别,然后会介绍一些被业界广泛采用的技术,最后会聊聊怎么为 API 构建选择合适的认证方式。 认证、授权、凭证首先,认证和授权是两个不同的概念,为了让我们的 API 更加安全和具有清晰的设计,理解认证和授权的不同就非常有必要了,它们在英文中也是不同的单词。 认证是 authentication,指的是当前用户的身份,当用户登陆过后系统便能追踪到他的身份做出符合相应业务逻辑的操作。即使用户没有登录,大多数系统也会追踪他的身份,只是当做来宾或者匿名用户来处理。认证技术解决的是 “我是谁?” 的问题。 ...
🔥 效能提升
未读Maven 相关问题 由于未统一管理多个模块的 jar 依赖, 每个模块都各自为政;模块之间的配置相互拷贝, 有用的没用的都拷了;升级版本麻烦, 每个相关模块都得改版本. 1. 重复的依赖 redis-cache 模块的 pom.xml 2. 重复的插件 mamagesystem 模块的 pom.xml 3. 依赖冲突 mamagesystem 模块的 pom.xml 4. 重复的配置 导致的问题有可能导致出现以下几种异常: java.lang.ClassNotFoundException java.lang.NoSuchMethodError java.lang.NoClassDefFoundError 解决方案 所有模块使用一个父模块来管理将重复配置迁移到 parent pom.xml 中;使用 dependencyManagement 来统一管理 jar 依赖;使用 pluginManagement 统一管理插件依赖;所有 jar 依赖的版本全部使用 properties 管理;使用 excludes 排除冲突的 jar 包; 代码问题1. 代码不规范 ...
🧩 开发框架与中间件
未读缓存服务组件 依赖于: jedis spring-data-redis spring-session-data-redis redis 集群使用的是 ShardedJedisPool, redis 3.x 后自带集群负载 jar 中重要的类 JedisConnectionFactory用于获取 jedis 实例,从而操作 redis ShardedJedisPool用于连接 redis 集群 cache 重要的类 RedisDataSource使用 JedisConnectionFactory 从 ShardedJedisPool 连接池中获取 jedis RedisClientTemplate依赖 RedisDataSource 操作 redis 的具体模板方法 RedisCacheServiceImpl对 RedisClientTemplate 再次封装 JedisPool(非切片链接池) 和 ShardedJedisPool(切片链接池) 有什么区别JedisPool 连一台 Redis,ShardedJedisPool 连 Redis 集群,通过一致性 ...
🧱 后端开发与架构
未读JDK5 新特性Java5 开发代号为 Tiger(老虎),于 2004-09-30 发行 1、泛型所谓类型擦除指的就是 Java 源码中的范型信息只允许停留在编译前期,而编译后的字节码文件中将不再保留任何的范型信息。也就是说,范型信息在编译时将会被全部删除,其中范型类型的类型参数则会被替换为 Object 类型,并在实际使用时强制转换为指定的目标数据类型。而 C++中的模板则会在编译时将模板类型中的类型参数根据所传递的指定数据类型生成相对应的目标代码。 1Map<Integer, Integer> squares = new HashMap<Integer, Integer>(); 通配符类型:避免 unchecked 警告,问号表示任何类型都可以接受 12345public void printList(List<?> list, PrintStream out) throws IOException { for (Iterator<?> i = list.iterator(); i.hasNext(); ...
🛠️ 开发工具与插件
未读IDEA Plugin API 文件操作Virtual File SystemVirtual File System 是处理文件的一套机制, 用于处理如何加载文件, 如果保存文件, 当文件变化时如何更新缓存等. IntelliJ Platform 将操作文件封装成了 Virtual File System, 提供了以下几点主要功能: 封装处理文件的通用 API, 不论文件在磁盘, 存档, HTTP 服务器或者其他地方, 都使用同一套 API; 提供快照功能, 能跟踪文件的修改; 提供将附加持久数据与 VFS 中的文件相关联; 为了提供最后两个功能,VFS 管理用户硬盘的某些内容的持久快照。快照仅存储通过 VFS API 至少请求过一次的文件,并且异步更新以匹配磁盘上发生的更改。 快照是应用程序级别,而不是项目级别 - 因此,如果某个文件(例如,JDK 中的某个类)被多个项目引用,则其内容的一个副本将存储在 VFS 中。 所有 VFS 访问操作都通过快照。 如果通过 VFS API请求某些信息但快照中没有这些信息,则会从磁盘加载并存储到快照中。如果快照中有可用信息,则返回快照 ...
🛠️ 开发工具与插件
未读IDEA Plugin 配置持久化 持久化与设置面板上传到 Aliyun OSS 需要几个参数: endpoint accessKeyId accessKeySecret bucketName filedir (此参数可不填) 本章节将介绍怎样创建设置面板和持久化配置 设置面板直接使用 IDEA 自带的 GUI 插件来画图, 需要开启 UI Designer 插件 持久化 PersistentStateComponent
🛠️ 开发工具与插件
未读介绍 IDEA Plugin 开发入口 接下的文档都会根据前一篇的需求来找到解决方案, 对于不熟悉 IDEA 插件开发的同学 (说的就是我), 可能一时找不到各个公共的入口, 这个是否就要看一些开源的插件,从中找到功能入口. 右键菜单入口需求中提到 「在编辑视图中直接右键 –> upload to Aliyun OSS」 因此我们需要扩展右键菜单, 来添加我们自己的功能入口. 现在介绍一种新的添加 AnAction 的方式: 这么多 Group. 好了, 懵逼了…. 那么我们怎么来找我们需要的 Group 呢?我这里用个笨办法, 看别人的插件配置呗, 这里通过看 Alibaba Java Coding Guidelines 这个插件的配置, 可以确定的有: MainToolBar ProjectViewPopupMenu ChangesViewPopupMenu EditorPopupMenu 先来第一个, 在编辑器右键菜单中添加我们的 action, 很明显是用 EditorPopupMenu 1234567891011121314151617<actio ...
插件需求分析 先来梳理下需求: 开发一款插件将 Markdown 文档中的图片上传到 Aliyun OSS. 具体需求入下: 上传需求解析所有 ![]() 图片标签: 如果图片在本地, 则上传到 Aliyun OSS; 如果以 http:// 或者 https:// 开头, 则根据设置判断是否上传 (迁移图片到 Aliyun OSS) 上传完成后: 根据设置将  标签转换成 <a data-fancybox title="" href="http://xxxx" ></a> 标签 这里有 2 个设置: 是否转换为 <a> 标签: 如果开启, 在判断是否显示大图 (这个主要针对 vuepress 构建的博客) 1<a data-fancybox title="" href="http://xxxx"></a> 且要 ...
🛠️ 开发工具与插件
未读这篇大致介绍一下 IDEA 插件的几种类型 插件的主要类型IntelliJ IDEA 的强大之一就是有一个易于扩展的插件系统, 所有插件都可在 JetBrains 插件库 找到. 最常见的插件类型包括: 自定义语言支持 框架集成 工具集成 用户界面附加组件 自定义语言支持自定义语言支持提供了使用特定编程语言的基本功能, 包括: 文件类型识别 词汇分析 语法突出显示 格式化 代码洞察和代码完成 检查和快速修复 意图行动 框架集成框架集成包括改进的代码洞察功能, 这些功能对于给定的框架是典型的, 以及直接从 IDE 使用框架特定功能的选项. 有时它还包括自定义语法或 DSL 的语言支持元素. 具体的代码见解 直接访问特定于框架的功能 工具集成通过工具集成, 可以直接从 IDE 操作第三方工具和组件, 而无需切换上下文. 比如: 实施其他行动 相关的 UI 组件 访问外部资源 用户界面附加组件此类别中的插件会对 IDE 的标准用户界面应用各种更改.一些新添加的组件是交互式的并提供新功能, 而其他组件仅限于视觉修改. 所述 背景图像 的插件可以作为一个例子. 👉 ...
🛠️ 开发工具与插件
未读查看 IDEA Plugin 开发日志 上一节已经说过, IntelliJ IDEA SDK 中已经有了日志框架, 用于输出日志, 但是在哪里看日志呢. 我们可以这样查看: 最终我们知道 idea.log 会在 .sandbox/system/log/idea.log. 然后我们可以通过 Grep Console 这个插件的 Tail File in Console 或者 Tail Current File in Console 来实时查看日志. 然后我们会发现所有的日志等级都是 INFO, 在我们调试的时候 DEBUG 日志看不到, 如果全部设置成 INFO 级别调试的时候很方便, 但是大量打印日志有性能损耗,因此我们需要将日志等级降低, 又能打印到文件中. 你可以这样设置: 说明已经写得很详细了, 按照上面的来, 然后将调试日志等级设置为 TRACE 即可看见日志. 其他你也可以直接修改下面这个文件 [👉 扩展阅读 - 怎么将老的 plugin 项目转换成 gradle 项目] 由于官方开发文档写得很烂, 有多东西都没有写到, 所有我们只有看别人的代码来了解未知 ...
🛠️ 开发工具与插件
未读使用官方推荐的 Gradle 插件开发 这是 IDEA 插件开发第一篇, 整个系列记录了开发 aliyun-oss-upload 的整个细节, 将会把遇到的问题整理成文, 最终发布在 idea-plugin-dev 中. 前言IDEA 插件开发分为 2 种方式: 直接使用 IDEA 提供的 IntelliJ Platform Plugin 2. 使用 Gradle 官方推荐使用 Gradle 方式, 因此选用第二种方式. 因为未使用过 Gradle, 肯定会遇到很多坑, 为了减少大家爬坑的时间, 我会尽量把注释写详细点, 如果发现错误的地方, 请告知我. 配置使用 Gradle 创建好插件项目后, 直接拷贝以下配置到 build.gradle 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748// mavenCentral() 是一个插件仓库, 导入的插件将会在仓库中寻找并下载buildscript { repositories &# ...
🧱 后端开发与架构
未读昨天做完精准营销的需求后, 提测版本一直连不上 MQ, 然后在本地启动后也未发现问题, 直到监听的消息队列有消息而且是大量消息时才会出现的错误: 1234567891011121314151617181920212223242526javax.jms.JMSException: Cannot send, channel has already failed: tcp://172.31.205.58:61616 at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:62) at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1409) at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1496) at org.apache.activem ...
🔥 效能提升
未读记录 mac mini 开发环境的搭建过程 系统设置修改 Launchpad 图标大小1234567891011121314行:defaults write com.apple.dock.springboard-rows -int 7列:defaults write com.apple.dock.springboard-columns -int 9重启 dock恢复:defaults write com.apple.dock.springboard-rows defaultdefaults write com.apple.dock.springboard-columns defaultkillall dockdefaults write com.apple.dock springboard-columns -int 11;defaults write com.apple.dock springboard-rows -int 7;defaults write com.apple.dock ResetLaunchPad -bool TRUE;killall Dock xxx. ...















