上次提到了lombok,顺便回顾一下注解 元注解 @Retention 注解的保留期,分为三种 RetentionPolicy.SOURCE 源码期注解 RetentionPolicy.CLASS 编译期注解 RetentionPolicy.RUNTIME 运行期注解 @Documented 注解的相关属性会包含到javadoc中 @Target 注解的作用范围,有以下六种 ElementType.ANNOTATION_TYPE 任意类型 ElementType.CONSTRUCTOR 构造方法 ElementType.FIELD 属性 ElementType.LOCAL_VARIABLE 局部变量 ElementType.METHOD 类方法 ElementType.PACKAGE 包 ElementType.PARAMETER 方法参数 ElementType.TYPE 类型:类、接口、枚举 @Inherited 子类在无显示标注注解的情况下,可以继承父类标注的注解。 @Inherited @Retention(RetentionPolicy.RUNTIME) public @interface Tag{ } @Tag public class A { } public class B extern A{ } B无显示声明注解,继承父类A的注解@Tag @Repeatable JDK 8中引入,注解是都可重复标注 public @interface interface Tag{ Job[] value() } @Repeatable(Tag.class) public @interface interface Job{ String jobName default ""; } @Job("doctor") @Job("teacher") pubic class Man{ } 注解的应用 通过反射可以获得类的注解及注解属性,为类提供扩展。 …
lombok使用
lombok介绍 lombok实现了编译器的Pluggable Annotation Processing API,在编译时修改原有的抽象与法树(AST),生成对应的字节码文件,实现对源码的扩展。 lombok安装 从官网现在jar,双击或使用java -jar lombok.jar运行,按提示安装到不同的IDE中,不用的IDE也可使用插件的形式完成对lombok的支持 maven引用 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.8</version> </dependency> lombok常用功能 val变量将声明为final,类型自动感知 @NonNull方法参数前添加,如传递参数为null则会跑出空指针异常 @Cleanup声明需要手动清理、回收的对象前,使用完成后自动清理 @Getter @Setter设置在属性前,生成getter,Setter方法 @NoArgsConstructor 无参构造方法@AllArgsConstructor包含所有参数的构造方法@RequiredArgsConstructor静态工厂的方式生成实例对象 @Data相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor @Value和Data类似用在类上,生成的属性为final类型,只包含getter方法 @Builder为类提供build建造者模式的构造方式,XX.builder()… @SneakyThrows声明方法可能会抛出的异常 @Getter(lazy=true)懒加载,调用时才会生成,标记的属性为fianl类型 @Log自动注入log对象,有不同的实现方式 @CommonsLog Creates log = org.apache.commons.logging.LogFactory.getLog(LogExample.class); @Log Creates log = java.util.logging.Logger.getLogger(LogExample.class.getName()); @Log4j Creates log = org.apache.log4j.Logger.getLogger(LogExample.class); @Log4j2 Creates log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class); @Slf4j Creates log = org.slf4j.LoggerFactory.getLogger(LogExample.class); @XSlf4j Creates log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class); <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-jdk14</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>${slf4j.version}</version> </dependency> …
内部分享Markdown、git-flow
环境准备 最近更新到了MACOS 10.12.5,使用bundle exec jekyll serve启动本地博客提示无法找到bundle,原因是因为10.11系统开启的保护功能,在不关闭此功能下目前只能重新安装sudo gem install bundler -n /usr/local/bin需要的组件. npm install -g nodeppt安装nodeppt使用Markdown生成演示文档 Markdown介绍 Markdown 是一种轻量级标记语言 类似于其他标记语言是由格式+内容生成展示页面 以纯文本的形式发布,可转换成有效的XHTML(或者HTML)文档 便于编辑、传输,任何一种文本编辑器都可以编写,展示需要使用模板样式 能让文档更容易读、写和随意改 原始文档更易读写、与前端HTML相比简化很多 Markdown使用场景 内容分享社区(wiki,简书,博客等) Peoject README 工作笔记 Markdown基础样式 Talk is cheap. Show me the code. git-flow 一套使用git的开发规范 [git-flow备忘清单](code 分支(branch) develop开发分支 feature/XXX新特性分支 release即将发布分支 master稳定版本分支 hotfix/XXX线上bug修改分支 Tips 提交信息,打标签TASK ISSUE MODIFY ADD REMOVE… 很多项目提交是提交信息过于简单,无法起到版本跟踪,一目了然本地提交内容,建议在提交信息中添加标签,如使用需求、问题跟踪系统还可直接标注需求、问题编号等,方便多版本管理、切换 .gitignore 与项目无关文件(操作系统、IDE生成的临时文件),本地编译文件(target/class等),本地配置等 分支太多/分支太少 分支太多大多时候没有很好的管理好开发节奏,没有合理规划分支的使用及合并,分支太少对分布式版本控制了解的不够,把git当svn用 …
java 8
放假前一天临下班前检查线上应用运行情况,从业务到服务器状况,发现应用进程cpu负载一直很高。 使用top -H -p [PID]查看线程信息,发现有一个线程有异常。 导出堆栈信息jstack -l [PID] > stack在导出的文件中以线程ID(转为16进制)搜索 "http-bio-8080-exec-485" daemon prio=10 tid=0x00007f5cc000d000 nid=0x6bb5 runnable [0x00007f5cb78f4000] java.lang.Thread.State: RUNNABLE at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130) at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114) at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:415) at java.lang.StringBuilder.append(StringBuilder.java:132) at java.lang.StringBuilder.append(StringBuilder.java:179) at java.lang.StringBuilder.append(StringBuilder.java:72) at java.util.Formatter$FormatSpecifier.print(Formatter.java:2865) at java.util.Formatter$FormatSpecifier.printString(Formatter.java:2838) at java.util.Formatter$FormatSpecifier.print(Formatter.java:2718) at java.util.Formatter.format(Formatter.java:2488) at java.util.Formatter.format(Formatter.java:2423) at java.lang.String.format(String.java:2790) at org.jboss.logging.Log4jLogger.doLogf(Log4jLogger.java:49) at org.jboss.logging.Logger.logf(Logger.java:2112) at org.jboss.logging.DelegatingBasicLogger.debugf(DelegatingBasicLogger.java:234) at org.hibernate.engine.internal.Collections.processReachableCollection(Collections.java:201) at org.hibernate.event.internal.FlushVisitor.processCollection(FlushVisitor.java:59) at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:121) at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:82) at org.hibernate.event.internal.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:76) at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:172) at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:231) at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:102) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:55) at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1335) at sun.reflect.GeneratedMethodAccessor490.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:342) at com.sun.proxy.$Proxy63.flush(Unknown Source) at sun.reflect.GeneratedMethodAccessor490.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:289) at com.sun.proxy.$Proxy63.flush(Unknown Source) at org.springframework.data.jpa.repository.support.SimpleJpaRepository.flush(SimpleJpaRepository.java:416) at org.springframework.data.jpa.repository.support.SimpleJpaRepository.saveAndFlush(SimpleJpaRepository.java:384) at...…
java 8
java.util.function中的常用接口 Predicate – 传入一个参数,返回一个bool结果, 方法为boolean test(T t) Consumer – 传入一个参数,无返回值,纯消费。 方法为void accept(T t) Function – 传入一个参数,返回一个结果,方法为R apply(T t) Supplier – 无参数传入,返回一个结果,方法为T get() UnaryOperator – 一元操作符, 继承Function,传入参数的类型和返回类型相同。 BinaryOperator – 二元操作符, 传入的两个参数的类型和返回类型相同, 继承BiFunction 一个经得起折腾的实体类 public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }...…
使用telnet调试dubbo接口
dubbo端口连接 使用配置中心或者直接查看代码配置中具体服务提供方的IP及port,使用telnet连接 telnet 192.168.220.164 3000 常用命令 ls 显示服务列表 ps 显示服务端口列表 cd 改变缺省服务 ![ ][2] trace 跟踪服务调用情况 count 统计服务任意方法的调用情况 invoke服务调用,复杂对象采用json格式传入 statusdubbo服务状态,当全部OK时则显示OK,只要有一个ERROR则显示ERROR,只要有一个WARN则显示WARN log改变dubbo日志级别 log 1000 查看log最后1000个字符 参考: Telnet命令参考手册 …