
正文
阿里java代码架构 阿里java技术栈
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
华为,阿里,京东使用的Java web框架是啥样的
像华为这些大公司,都是内部自己的框架,其实也就是对市面上的主流框架做了些整合。
相关问答
Q1: 如何评价阿里近期发布的Java编码规范
绝大多数规则,98%都可以直接采用,但是也要了解设定这条规则的原因。
有些因规模和架构不同可以不使用,也要注意到【强制】【推荐】【参考】的区别。
Q2: 为什么阿里工程师代码写的好?看看他的代码规范就知道了
曾经与一位从阿里出来的Java工程师一起工作过一段时间,他的技术说不上非常厉害, 但是,他的代码写的的非常好,凡是他做的功能很少出现Bug 。我就很好奇,于是经常向他请教一些代码设计的原则,然后他告诉了我阿里Java手册。并且,他将这个手册进行了修改,也成为了我司Java程序员的开发手册。 这篇文章就让我们看一看这个手册中比较重要的原则。
【强制】 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
反例:_name / __name / $name / name_ / name$ / name__
【强制】 类型与中括号紧挨相连来表示数组。
正例:定义整形数组 int[] arrayDemo; 反例:在 main 参数中,使用 String args[]来定义。
【强制】 POJO 类中布尔类型变量都不要加 is 前缀,否则部分框架解析会引起序列化错误。
说明:表达是与否的值采用 is_xxx 的命名方式,所以,需要在 设置从 is_xxx 到 xxx 的映射关系。
反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(), RPC 框架在反向解 析的时候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。
【推荐】 在常量与变量的命名时,表示类型的名词放在词尾,以提升辨识度。
【推荐】 接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁 性,并加上有效的 Javadoc 注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定 是与接口方法相关,并且是整个应用的基础常量。
正例:接口方法签名 void commit();
接口基础常量 String COMPANY = "alibaba";
反例:接口方法定义 public abstract void f();
说明:JDK8 中接口允许有默认实现,那么这个 default 方法,是对所有实现类都有价值的默认实现。
【参考】 枚举类名带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。
说明:枚举其实就是特殊的类,域成员均为常量,且构造方法被默认强制是私有。
正例:枚举名字为 ProcessStatusEnum 的成员名称:SUCCESS / UNKNOWN_REASON。
【参考】 各层命名规约:
1) 获取单个对象的方法用 get 做前缀。
2) 获取多个对象的方法用 list 做前缀,复数形式结尾如:listObjects。 3) 获取统计值的方法用 count 做前缀。
4) 插入的方法用 save/insert 做前缀。
5) 删除的方法用 remove/delete 做前缀。
6) 修改的方法用 update 做前缀。
1) 数据对象:xxxDO,xxx 即为数据表名。
2) 数据传输对象:xxxDTO,xxx 为业务领域相关的名称。
3) 展示对象:xxxVO,xxx 一般为网页名称。
4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。
【强制】 不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
【强制】 避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析 成本,直接用类名来访问即可。
【强制】 相同参数类型,相同业务含义,才可以使用Java的可变参数,避免使用Object。
说明:可变参数必须放置在参数列表的最后。(提倡同学们尽量不用可变参数编程)
【强制】 所有整型包装类对象之间值的比较,全部使用equals方法比较。
说明:对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象是在 IntegerCache.cache 产 生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数 据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。
关于基本数据类型与包装数据类型的使用标准如下:
说明: POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值 ,任何 NPE 问题,或 者入库检查,都由使用者来保证。
正例:数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险。
反例: 比如显示成交总额涨跌情况,即正负 x%,x 为基本数据类型,调用的 RPC 服务,调用不成功时, 返回的是默认值,页面显示为 0%,这是不合理的,应该显示成中划线 。所以包装数据类型的 null 值,能 够表示额外的信息,如:远程调用失败,异常退出。
【强制】 POJO 类必须写 toString 方法。
使用 IDE 中的工具:source generate toString 时,如果继承了另一个 POJO 类,注意在前面加一下 super.toString。
说明: 在方法执行抛出异常时,可以直接调用 POJO 的 toString()方法打印其属性值,便于排查问题。
【强制】 关于hashCode和equals的处理,遵循如下规则:
说明:String 已覆写 hashCode 和 equals 方法,所以我们可以愉快地使用 String 对象作为 key 来使用。
【强制】 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
说明:线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问 题。 如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。
【强制】 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
以上规范在设计代码中,是比较重要的原则。如果编写代码的过程中,可以依照以上原则,那代码的可读性和可维护性将大大提升
Q3: 现在企业开发时,Java所用到的主流框架有哪些?
做了十多年的Java开发,和大家介绍一下我最近一两年用的比较多的Java框架(包括软件、中间件)。
Spring:从刚开始工作的时候就在用;是一个J2EE框架,提供了对IOC的良好支持,也提供了对AOP技术非常好的封装;
SpringMVC:也是Spring的一个子项目,实现了MVC设计模式,目标是解耦;
MyBatis、Hibernate:两个都是ORM框架,现在Hibernate用的少了;也有用到SpringDataJPA,这个可以看做是更高级的封装,可以通过方法的命名,实现SQL语句;
可以看到,上面就是SSM框架,现在还是比较流行的。
Maven:新老项目都是基于Maven构建,它是一个项目管理工具,主要功能有:项目构建;Jar包的依赖管理;版本管理;持续集成等等等等;
JUint:单元测试工具;也是老朋友了;测试框架还有不少,比如SpringTest,JMock等等。
Shiro、SpringSecurity:关于安全认证的框架,用于用户身份认证,权限授权、加密、会话管理等;
CxforAxis:老项目WebService用的比较多一些;历史问题,还是要了解一下;
Quartz:定时服务框架,一般都是单机应用;
Elastic-job:分布式定时服务框架,当当出品;
log4j、logback:各种日志工具;现在会有一些日志采集分析的框架,比如ELK;
Ehcache:缓存框架,也都是用于单机项目;
Redis:说道缓存,现在更多的使用Memcached、Redis;当然Redis也不局限于缓存;
SpringBoot:用于搞定其他框架的一个框架,主要是提供了各种启动器、简化了各种配置、方便和其他框架集成、开发者能够快速上手。
Dubbo:一个微服务框架,阿里出品;
SpringCloud:另外一套微服务框架,这个就多了,例如:Config(配置管理中心)、NetflixEureka(服务注册、服务发现)、Hystrix(断路器,这个官方好像已经不建议使用了,又有新的了)、Feign(声明式服务调用组件)、Ribbon(客户端负载均衡)、Zuul(网关)、Bus(消息总线)等等。
DubboorSpringCloud:这个看公司的技术栈,用到哪个学哪个,都没有用到,建议学SpringCloud。
RestfulAPI、RPC:不同风格的服务;
Swagger:RestfulAPI自动生成工具;
消息队列:常用RabbitMQ和Kafka,一种保存消息的容器,也用于系统间解耦;
MongoDB:BSON(类似JSON)格式的内存数据库;
Zookeeper:一个分布式协调服务;
Nginx:或其他负载均衡软件;
Docker:容器技术。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。
阿里java代码架构的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于阿里java技术栈、阿里java代码架构的信息别忘了在本站进行查找喔。






