ARTS 每周打卡记录——2019/03/30

路漫漫其修远兮,吾将上下而求索

ARTS是什么?

Algorithm:每周至少做一个leetcode的算法题;

Review:阅读并点评至少一篇英文技术文章;

Tip/Techni:学习至少一个技术技巧;

Share:分享一篇有观点和思考的技术文章。

1. Algorithms

  • LeetCode
    • 题目: 计算给定二叉树的所有左叶子之和。
1
2
3
4
5
6
7
    3
/ \
9 20
/ \
15 7

在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
  • 解答:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
return sumOfLeft(root, false);
}

private int sumOfLeft(TreeNode root, Boolean flag){
if(root == null){
return 0;
}
if(root.left == null && root.right == null && flag == true){
return root.val;
}
return sumOfLeft(root.left, true) + sumOfLeft(root.right, false);
}
}

2. Review

3. Tips

  • 在阿里飞冰的文档里面看到的一些小规范:
    • 提交 commti 的类型,包括以下几种
      1. feat: 新功能
      2. fix: 修复问题
      3. docs: 修改文档
      4. style: 修改代码格式,不影响代码逻辑
      5. refactor: 重构代码,理论上不影响现有功能
      6. perf: 提升性能
      7. test: 增加修改测试用例
      8. chore: 修改工具相关(包括但不限于文档、代码生成等)
      9. deps: 升级依赖
  • 这些小规范,有一个好处,在看 git log 的时候,很清晰明了的知道自己和其他人修改了什么内容。

4. Share

  • Spring Autowired 与 Resource 的区别
  • @Resource@Autowired 都是做 bean 的注入时使用,其实 @Resource 并不是 Spring 的注解,它的包是 javax.annotation.Resource, 需要导入,但是 Spring 支持该注解的注入。

共同点

  • 两者都可以卸载字段和 setter 方法上。两者如果都写在字段上,那么就不需要再写 setter 方法。

不同点

  1. @Autowired
  • @Autowired为 Spring 提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
1
2
3
4
5
6
7
8
9
10
public class TestServiceImpl {
// 下面两种@Autowired只要使用一种即可
@Autowired
private UserDao userDao; // 用于字段上

@Autowired
public void setUserDao(UserDao userDao) { // 用于属性的方法上
this.userDao = userDao;
}
}
  • @Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许 null 值,可以设置它的 required 属性为 false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。
1
2
3
4
5
public class TestServiceImpl{
@Autowired
@Qualified("userDao")
private UserDao userDao;
}
  1. @Resource
- `@Resource`默认按照 ByName 自动注入,由 J2EE 提供,需要导入包`javax.annotation.Resource`。`@Resource`有两个重要的属性:name 和 type,而 Spring 将`@Resource`注解的 name 属性解析为 bean 的名字,而 type 属性则解析为 bean 的类型。所以,如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不制定 name 也不制定 type 属性,这时将通过反射机制使用 byName 自动注入策略。
1
2
3
4
5
6
7
8
9
10
public class TestServiceImpl {
// 下面两种@Resource只要使用一种即可
@Resource(name="userDao")
private UserDao userDao; // 用于字段上

@Resource(name="userDao")
public void setUserDao(UserDao userDao) { // 用于属性的setter方法上
this.userDao = userDao;
}
}
- **注**:最好是将`@Resource`放在 setter 方法上,因为这样更符合面向对象的思想,通过 set、get 去操作属性,而不是直接去操作属性。

@Resource 装配顺序

  1. 如果同时指定了 name 和 type,则从 Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛出异常。
  2. 如果指定了 name,则从上下文中查找名称(id)匹配的 bean 进行装配,找不到则抛出异常。
  3. 如果指定了 type,则从上下文中找到类似匹配的唯一 bean 进行装配,找不到或是找到多个,都会抛出异常。
  4. 如果既没有指定 name,又没有指定 type,则自动按照 byName 方式进行装配;如果没有匹配,则退回一个原始类型进行匹配,如果匹配则自动装配。
  • @Resource的作用相当于@Autowired,只不过@Autowired按照 byName 自动注入。