这几天初步了解了百度云的后台架构部分,固然了,本身了解的仅限于后台java相关的部分,先说一下客户端这边使用的技术:
一、spring boot : 与前端进行直接交互的服务是用spring来实现的(后台服务还须要调用其余的基础服务,如redis 数据库服务 订单服务 cdn服务 openstack服务等)
二、jackson : 从代码层面看,后台的数据处理以及数据格式化基本上是使用jackson来实现的,服务之间的交互使用http协议,数据格式基本上使用json格式。
三、swagger : 代码中也涉及到了部分的第三方控件如 swagger、StopWatch等前端
从代码中能够看出,并无十分复杂的技术,复杂的只是其中涉及到的业务,且业务之间的耦合基本上都是以服务接口的形式呈现的,因此彻底能够经过代码去熟悉业务。(注:本文仅限于本人的代码学习,吻合公司的代码风格,了解一些编码技巧)java
因此下面是从代码层面去介绍项目中用到的一些小技巧
小小知识点:程序员
spring部分redis
一、controller层 接受请求使用@RestController,因为后台服务只提供数据接口给前台,也就不须要视图解析以及跳转
二、@Value标签经常使用于获取环境变量,“:”后面的为默认值spring
@Value("${userlog.isAsync:false}")
log部分
log部分分为两个部分:
一、使用了你们经常使用的log4j组件以下数据库
static Logger log = LoggerFactory.getLogger(ClassDemo.class); log.debug("debug info .", e);
二、经过spring AOP的切面编程实现各个模块的日志记录
经过注解@Aspect来代表这个类是个切面apache
@Aspect @Component //和sping整合的时候必需要这个注解,不然sping容器解析不到该切面致使切面不能工做 public class UserLogAspect { @Pointcut("execution(* com.baidu.bce..*(..)) " @Around("userLogMethodPointcut()") public Object userLogInterceptor(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { //经过proceedingJoinPoint对象获取Signature对象,该对象封装了链接点的信息。好比经过getDeclaringType获取链接点所在类的 class对象 } } //@Before是在所拦截方法执行以前执行一段逻辑 //@After 是在所拦截方法执行以后执行一段逻辑 //@Around是能够同时在所拦截方法的先后执行一段逻辑
集合、字符、数组处理部分
集合主要使用了org.apache.commons.collections 包中的CollectionUtils类来对集合进行操做编程
CollectionUtils.isEmpty(objectDemo) //判断集合是否为空
工具类
StopWatch是org.springframework.util包中的一个简单工具类,当咱们须要纪录一部分代码中执行时间的时候,每每须要在任务先后的两个时间点去获取当前时间,并做减法,每每不够优雅,这时候StopWatch就派上用场了,以下:json
StopWatch first = new StopWatch("unitid"); //实例话一个StopWatch对象 first.start("A"); //纪录时间开始 execute...... //你的执行代码 first.stop(); //执行结束 first.start("B"); execute...... first.stop(); log.debug(first.prettyPrint()); //打印执行结果
jackson部分数组
一、@JsonProperty 此注解用于属性上,做用是把该属性的名称序列化为另一个名称,如把trueName属性序列化为name,@JsonProperty(value="name")。
@JsonProperty(value = "real_name") private String realName; new ObjectMapper().writeValueAsString(student) //序列化 结果 {"real_name":""} String jsonStr = "{\"real_name\":\"zhangsan\"}"; Student student = new ObjectMapper().readValue(jsonStr.getBytes(), Student.class); //反序列化 结果 Student{realName='zhangsan'}
二、@JsonPropertyOrder
做用在类上,被用来指明当序列化时须要对属性作排序,它有2个属性一个是alphabetic:布尔类型,表示是否采用字母拼音顺序排序,默认是为false,即不排序
三、@JsonInclude
@JsonInclude(value=Include.NON_NULL) 是用在实体类的方法类的头上 做用是实体类的参数查询到的为null的不显示,好比说你想传一些json数据到前台,可是不想传值为null的数据,就可使用该标签
四、@JsonIgnoreProperties
能够注明是想要忽略的属性列表如@JsonIgnoreProperties({"name","age","title"}),也能够注明过滤掉未知的属性如@JsonIgnoreProperties(ignoreUnknown=true)
五、@JsonUnwrapped
当实体类中成员属性是一个类的对象时候,忽略包装。。
public class User { private String name; private String password; @JsonIgnore private List<String> strs ; @JsonUnwrapped private Person p; //setter,getter省略 } public class Person { private String pName; private int age; private boolean sex; @JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss") private Date birthday; private String word; private double salary; //setter,getter省略 } public void testJsonUnWrapped() throws IOException{ User u = new User("guofeipeng","123"); List<String> ls = new ArrayList<String>(); ls.add("123"); ls.add("234"); ls.add("345"); u.setStrs(ls); Person person = new Person("nomouse", 25, true, new Date(),"程序员",2500.0); u.setP(person); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(u); //java 2 json System.out.println(json); User user = mapper.readValue(json, User.class);//json 2 java System.out.println(user); }
注:
1.User类中Person属性不加@JsonUnwarpped,转化后的json为:{"name":"guofeipeng","password":"123","p":{"age":25,"sex":true,"birthday":"2014-12-22 07-15-29","word":"程序员","pname":"nomouse","salary":"2500.00"}}
2.加了@JsonUnwarpped注解,则去掉了p的键(包装),转化后的json为{"name":"guofeipeng","password":"123","age":25,"sex":true,"birthday":"2014-12-22 07-16-38","word":"程序员","pname":"nomouse","salary":"2500.00"}
转自 http://blog.csdn.net/mooner_g...
六、@JsonFormat
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = BceConstant.DATETIME_FORMAT, timezone = "UTC")
一般日期格式都是以时间戳的形式存放在数据库里,当前端页面经过接口查询时,咱们会将一个对象的某些属性查出来返回给页面。通常在存当前含有当前时间的实体时,只须要配置好数据库的存储字段便可。
基本代码部分
for循环的写法
for(Object obj: List<Object> lobj){ obj.get(""); }