百度java學習筆記

這幾天初步瞭解了百度雲的後臺架構部分,固然了,本身瞭解的僅限於後臺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("");
}
相關文章
相關標籤/搜索