路漫漫其修远兮,吾将上下而求索
ARTS是什么?
Algorithm:每周至少做一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip/Techni:学习至少一个技术技巧;
Share:分享一篇有观点和思考的技术文章。
1. Algorithms
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 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 的类型,包括以下几种
feat: 新功能
fix: 修复问题
docs: 修改文档
style: 修改代码格式,不影响代码逻辑
refactor: 重构代码,理论上不影响现有功能
perf: 提升性能
test: 增加修改测试用例
chore: 修改工具相关(包括但不限于文档、代码生成等)
deps: 升级依赖
这些小规范,有一个好处,在看 git log 的时候,很清晰明了的知道自己和其他人修改了什么内容。
4. Share
Spring Autowired 与 Resource 的区别
@Resource
和 @Autowired
都是做 bean 的注入时使用,其实 @Resource
并不是 Spring 的注解,它的包是 javax.annotation.Resource
, 需要导入,但是 Spring 支持该注解的注入。
共同点
两者都可以卸载字段和 setter 方法上。两者如果都写在字段上,那么就不需要再写 setter 方法。
不同点
@Autowired
@Autowired
为 Spring 提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired
;只按照byType注入。
1 2 3 4 5 6 7 8 9 10 public class TestServiceImpl { @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; }
@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 (name="userDao" ) private UserDao userDao; @Resource (name="userDao" ) public void setUserDao (UserDao userDao) { this .userDao = userDao; } }
- **注**:最好是将`@Resource`放在 setter 方法上,因为这样更符合面向对象的思想,通过 set、get 去操作属性,而不是直接去操作属性。
@Resource 装配顺序
:
如果同时指定了 name 和 type,则从 Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛出异常。
如果指定了 name,则从上下文中查找名称(id)匹配的 bean 进行装配,找不到则抛出异常。
如果指定了 type,则从上下文中找到类似匹配的唯一 bean 进行装配,找不到或是找到多个,都会抛出异常。
如果既没有指定 name,又没有指定 type,则自动按照 byName 方式进行装配;如果没有匹配,则退回一个原始类型进行匹配,如果匹配则自动装配。
@Resource
的作用相当于@Autowired
,只不过@Autowired
按照 byName 自动注入。