2020-10-31

中超今天关键战再现37人超大规模冲突:世界名帅当场看懵!_大连人

原标题:中超今天关键战再现37人超大规模冲突:世界名帅当场看懵!

中超联赛今天下午结束了一场争夺名次的关键战,天津泰达与大连人队进行了第2回合的较量,最终大连人2比1战胜对手,但是总比分2比3落败。在比赛最后时刻,场上再次出现了罕见的大规模冲突,中超现场出现了多达37人的大混乱,一度让当场比赛大连人主帅、世界级名帅贝尼特斯看懵,展现了中超现阶段火爆的场上氛围!

这是在比赛进行到第94分钟的时候,比赛所剩时间已经非常少,而天津泰达希望将比赛时间拖到最后1秒,就此结束比赛,而大连人显得情绪有些失控,与泰达外援兼队长阿奇姆彭发生了激烈冲突。多名球员发生肢体接触,而大连人队长赵旭日也冲了过来,与阿奇姆彭发生口角,大连人门将徐嘉敏更是飞奔过来,一把将阿奇姆彭推倒在地!

在阿奇姆彭痛苦倒地后,场上双方多名球员都冲到了事发现场,虽然主裁判第一时间向肇事者出示了黄牌,但是显然他已经无法掌控局势,众多球员陷入了激烈冲突,泰达中场郑凯木也与对方互骂,现场气氛颇为紧张火爆,主裁判也只能在场边无奈观看,双方的工作人员也冲入了场内,这次冲突的规模和人数不断增加!

从现场给出的全景镜头可以看到,在角旗区附近,双方聚集了几乎所有球员和双方的替补球员,甚至众多工作人员,多人陷入缠斗当中,也有人在进行劝架,让双方的冲突迅速降温。一时间最高峰人数达到了37人,这也是目前中超非常罕见的场面。主裁判在现场给予了大连人门将徐嘉敏直接红牌处罚,而随后在视频裁判的提醒下,又罚下了郑凯木和孙国文!

比赛最后时刻主裁判竟然一口气掏出了3张红牌,而场上如此大规模的混乱,更是让曾经站上过欧洲足坛巅峰的贝尼特斯在场边看懵,他眼睛里已经充满泪水,他似乎也无法明白场上发生的这一幕。不得不说,中超一场无关保级和争冠的排位关键战也能出现如此规模的冲突,实在令人难以理解,希望中国球员未来能够更多一份冷静!(老邱 中超球评)

返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/367260.html

淘粉吧官网:https://www.ikjzd.com/w/1725.html

ryder:https://www.ikjzd.com/w/1264.html

中转贸易:https://www.ikjzd.com/w/1427


原标题:中超今天关键战再现37人超大规模冲突:世界名帅当场看懵!中超联赛今天下午结束了一场争夺名次的关键战,天津泰达与大连人队进行了第2回合的较量,最终大连人2比1战胜对手,但是总比分2比3落败。在比赛最后时刻,场上再次出现了罕见的大规模冲突,中超现场出现了多达37人的大混乱,一度让当场比赛大连人主帅、世界级名帅贝尼特斯看懵,展现了中超现阶段火爆的场上氛围!这是在比赛进行到第94分钟的时候,比赛所
折扣网:https://www.ikjzd.com/w/74
wario:https://www.ikjzd.com/w/887
口述:老公假离婚给俩女总当甜点女人假离婚甜点:http://lady.shaoqun.com/m/a/35873.html
北京端午限行吗,2020北京端午不限行:http://tour.shaoqun.com/a/76800.html
ShopifyQ2季度总收入3.62亿美元,同比增长48%!:https://www.ikjzd.com/home/103247

49岁“莱托少爷”杰瑞德·莱托新写真曝光!长发大叔,太有魅力啦_小丑

原标题:49岁"莱托少爷"杰瑞德·莱托新写真曝光!长发大叔,太有魅力啦

阿巴阿巴~呃,话痨小编AE,来带你吃国外的瓜啦!

最近,曾出演过《X特遣队》、《搏击俱乐部》等电影的49岁好莱坞男神杰瑞德·莱托,登上了国外时尚杂志的封面!没想到虽然已经快半百的年纪了,但杰瑞德·莱托依旧是一副仙气飘飘的长发+古灵精怪的造型,俨然是一副"老顽童"的模样,和荧幕中的男神造型实在相去甚远哦(狗头)~

要知道这几天杰瑞德·莱托收到了DC和华纳的邀请,将会在明年开播的《正义联盟》扎导剪辑版中再度扮演反派"小丑"一角,因此这个月莱托少爷也是受到了全球媒体的重点关注!要知道原本2017版的《正义联盟》中并没有"小丑"这个角色,也就是说杰瑞德·莱托的加入,将会让电影展开和原作不一样的剧情。

因此不少影迷也是非常期待看到杰瑞德·莱托,在《正义联盟》扎导剪辑版电影中的表现!只不过稍微有点遗憾的是,原本这次拍摄的时尚杂志内页,是准备让杰瑞德·莱托以"小丑"的造型出镜的。但摄影师和杰瑞德·莱托沟通之后,这位洒脱的老顽童表示还是想按照自己生活的风格来出镜

于是我们就看到了照片中这位,留着一头披肩长发,蓄起了浓密络腮胡的中年大叔形象。不得不说,杰瑞德·莱托真的是好莱坞最洒脱的一位演员,浑身充满了一股独立独行的艺术家气质~而实际上的莱托少爷,也真的就是摇滚、攀岩、极限运动、演戏,什么都会的一位全才,在各个领域都有不少的粉丝。

也正是因为这样的性格,使得杰瑞德·莱托在《X特遣队》中扮演的"小丑",虽然没有希斯·莱杰和杰昆·菲尼克斯那样大的知名度,却依旧俘获了不少影迷的芳心!原本AE以为《正义联盟》中出现小丑的话,应该是杰昆·菲尼克斯扮演的可能性大,但或许只有杰瑞德·莱托的小丑,能够驾驭住混乱的超级英雄们哦~

返回搜狐,查看更多

责任编辑:

原文转载:http://yl.shaoqun.com/a/201532.html

派代:https://www.ikjzd.com/w/2197

商标抢注:https://www.ikjzd.com/w/1053

邮乐网购物商城:https://www.ikjzd.com/w/1776


原标题:49岁"莱托少爷"杰瑞德·莱托新写真曝光!长发大叔,太有魅力啦阿巴阿巴~呃,话痨小编AE,来带你吃国外的瓜啦!最近,曾出演过《X特遣队》、《搏击俱乐部》等电影的49岁好莱坞男神杰瑞德·莱托,登上了国外时尚杂志的封面!没想到虽然已经快半百的年纪了,但杰瑞德·莱托依旧是一副仙气飘飘的长发+古灵精怪的造型,俨然是一副"老顽童"的模样,和荧幕中的男神造型实在相去甚远哦
dmm.adult:https://www.ikjzd.com/w/2026
西集网:https://www.ikjzd.com/w/1353
中国卖家的对手又多了!亚马逊全球开店成立越南服务团队!:https://www.ikjzd.com/home/108777
易麦:https://www.ikjzd.com/w/2048
2020昆明黑龙潭梅花展是什么时候?:http://tour.shaoqun.com/a/4200.html

速看!法国德国相继封锁,欧洲卖家该何去何从?

速看!法国德国相继封锁,欧洲卖家该何去何从?


10月29日,法国因为疫情再度爆发性增长,法国总统马克龙宣布从10月30日起再次启动全国封锁政策,至少持续到12月1日。

具体规定如下:

1、完全禁止社交聚会。

2、法国居民如果出门在外,则必须填写表格。

3、唯一可以接受的离开居所的理由是进行基本工作,安排医疗服务,帮助弱势群体,在家附近散步以及进行杂货店购物。

4、非基本业务,包括餐馆和酒吧,将关闭。

5、必须尽可能远程进行工作。

6、大学课程大部分将在线进行。

7、学校和托儿所以及工厂,农场和建筑工地将继续开放。

8、禁止在区域之间旅行。

9、法国的国际边界大部分地区将保持关闭,并将对入境者进行强制性的快速COVID-19测试。

10、欧盟边界将保持开放,法国公民可以返回该国。

11、允许访问养老院。葬礼将被允许进行。

12、大多数公共服务将保持开放。

13、新的限制将每两周重新评估一次。

同时,德国也宣布,11月2日起,全国进入封城一个月。将关闭大部分公共设施,餐饮娱乐场所以及限制个人出游。

具体措施如下:

1、学校和幼儿园将保持开放

2、社会接触仅限于两个家庭,最多可容纳10人,旅游业将停止

3、酒吧将关闭,餐厅将仅限于外卖

4、纹身和按摩店将关闭

5、因关闭遭受严重影响的小型公司将获得2019年11月收入的75%的补偿

6、预计默克尔夫人和州总理将在11月11日的电视会议上再次开会,以重新评估情况。

尽管中小学和幼儿园仍继续开放,但其余措施已经以及达到年初的封城力度。

欧洲的疫情有大面积复发的趋势,在德法宣布"封国"的同时,其他国家也纷纷宣布封锁措施。

在看到这些消息的时候,许多欧洲站的卖家开始慌了,特别是黑五网一将近,如果欧洲航线如年初时再次停航,会对销售造成巨大的影响。

为了获得这个问题的答案,咱们贴心的小秘书就提前找到物流商给各位卖家打探了一波消息。

物流并不会停,最多只会影响进仓的速度以及物流的费用,不会对整体的销售造成过大影响。

那么反过来看,这次德法"封国"其实对于线上购物,会带来新一波的增长。在此前就有数据表示,欧洲的线上销售额比去年增长了12.7%。

居民在难以外出的时候,网络购物无疑是首选。根据一份调查报告显示,德国今年将有77%的人参与黑五的购物活动,较2019年增加了16.7%。

欧洲各国"封国"有利也有弊,在第一时间做好充足准备的情况下,相信各位大卖都是可以轻松应对的,也建议大家多关注欧洲的疫情发展,及时调整自己的运营方式。

来源:跨境电商指南

文章来源:https://www.ikjzd.com/home/132715

智赢:https://www.ikjzd.com/w/1511

盘古集团:https://www.ikjzd.com/w/1448

primc:https://www.ikjzd.com/w/129

海豚村:https://www.ikjzd.com/w/1779

worldfirst:https://www.ikjzd.com/w/289

速看!法国德国相继封锁,欧洲卖家该何去何从?

10月29日,法国因为疫情再度爆发性增长,法国总统马克龙宣布从10月30日起再次启动全国封锁政策,至少持续到12月1日。

曼联开5年合同欲免费签米兰核心!1月可预定,或接班马塔取代帝星_欧冠

原标题:曼联开5年合同欲免费签米兰核心!1月可预定,或接班马塔取代帝星

曼联被指正在与AC米兰中场恰尔汗奥卢进行谈判,有意通过自由转会免费将他签下,继续加强中场实力。

恰尔汗奥卢身披米兰10号战袍,出生于德国,效力土耳其国家队,现年26岁,2017年从勒沃库森加盟红黑军团,4年来137场比赛打入27球。土耳其球星是定位球专家,深受米兰拥趸喜爱,人称「恰球王」。

曼联中场过去两个转会窗接连引援,签下了布鲁诺·费尔南德斯和范德贝克,但如果能够分文不花得到恰尔汗奥卢,也是一笔不错的交易。

恰尔汗奥卢与米兰的现有合同明夏到期,如果无法续约,他将恢复自由身。作为英超球队,曼联可以在1月份时与之草签合同,预定明夏加盟球队。德国《图片报》著名记者克里斯蒂安·法尔克(Christian Falk)披露,曼联早在夏季便已经与恰尔汗奥卢的经纪人团队进行了接洽,土耳其中场很感兴趣,为此还拒绝了尤文图斯的邀请。

意大利《米兰体育报》则披露,曼联向恰尔汗奥卢提供了一份5年的丰厚合同,周薪可能接近10万镑。

在曼联阵中,马塔已经32岁,而27岁的林加德则已经失去索尔斯克亚的信任,两人的合同明夏都会到期,虽然均有一年优先续约权,但索帅仍然考虑引进恰尔汗奥卢,接班西班牙暖男,取代大英帝星。

恰尔汗奥卢本赛季在米兰主帅皮奥利麾下主要踢前腰,但他也能胜任边路进攻位置,不过,这些特点与费尔南德斯和范德贝克有些重叠,并非曼联更为迫切需要的后腰球员。

曼联名宿斯科尔斯则认为,索尔斯克亚更应该引进中卫,如周中欧冠对手莱比锡红牛阵中的于帕梅卡诺。「他是曼联需要的球员,与马奎尔和林德勒夫截然不同的中卫。」斯科尔斯分析道,「他绝对热衷于一对一防守,喜欢出现在肋部,他知道自己可以战胜对手。这就跟过去曼联的里奥(费迪南德)和斯塔姆一样。」

但从球员的角度,恰尔汗奥卢的经纪人戈顿·史蒂皮奇(Gordon Stipic)从6月开始,就跟米兰洽谈续约事宜,但因为无法达成协议,与曼联的转会谈判,可以一举两得,一方面逼宫红黑军团高层,另一方面也可以争取看看是否能够在红魔争取到高薪,再权衡二者哪个是最佳选择。

曼联今夏3900万镑引进了荷兰中场范德贝克,他至今尚未在英超首发出场,对此,23岁的前阿贾克斯中场表示:「球员总是希望出场比赛,训练也很美妙,但比赛才是你踢球的原因。我想在很多比赛中我们都可以改善,我相信只要保持专注,曼联赢球会比失利更多。阿森纳也有真正出色的球员,我的意思是,我们必须专心。我们赢下了欧冠对莱比锡的比赛,每个人都开心,这对整体信心有帮助,但现在要应对下一场。现在会有大战连场,比赛很多,我们要专心应对,我相信可以好好取胜。」返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/367251.html

空中云汇:https://www.ikjzd.com/w/2684

yeepay:https://www.ikjzd.com/w/2574

worldfirst:https://www.ikjzd.com/w/289


原标题:曼联开5年合同欲免费签米兰核心!1月可预定,或接班马塔取代帝星曼联被指正在与AC米兰中场恰尔汗奥卢进行谈判,有意通过自由转会免费将他签下,继续加强中场实力。恰尔汗奥卢身披米兰10号战袍,出生于德国,效力土耳其国家队,现年26岁,2017年从勒沃库森加盟红黑军团,4年来137场比赛打入27球。土耳其球星是定位球专家,深受米兰拥趸喜爱,人称「恰球王」。曼联中场过去两个转会窗接连引援,签下了布鲁
kili:https://www.ikjzd.com/w/238
epc:https://www.ikjzd.com/w/488
柞水峡谷第一漂团购多少钱?柞水峡谷第一漂流团体票怎么买?:http://tour.shaoqun.com/a/48184.html
丰顺韩山有直达车吗?广东丰顺韩山乘车路线?:http://tour.shaoqun.com/a/70044.html
海南万宁兴隆热带花园自驾游怎么走呢?:http://tour.shaoqun.com/a/5545.html

德帅上任效应或再现!篮网抢走火箭三分王?杜兰特夺MVP更有戏了_德安东尼

原标题:德帅上任效应或再现!篮网抢走火箭三分王?杜兰特夺MVP更有戏了

北京时间10月31日,篮网官网方宣布,德安东尼成为球队新任助教,与他一起加盟的还有76人助教乌多卡以及小斯塔德迈尔。篮网教练组的组建基本完成。德安东尼将辅佐昔日弟子纳什执教篮网。他的加盟很可能带来两大效应,其一是篮网可能成为联盟三分火力最凶猛的球队,其二是杜兰特重夺MVP的机会增大。

纳什在前几天已经表态,他希望篮网提速,打快节奏的进攻。纳什曾经是德安东尼跑轰打法的受益者,球员时代两次夺得常规赛MVP。纳什在篮网也将高举恩师的跑轰大旗,更何况新赛季有恩师亲手指点。

火箭统治联盟三分榜的时代很可能要在这个赛季终结了。德安东尼在2016年成为火箭主帅,随后4个赛季,火箭都是联盟三分王,统治了三分榜,其中2018-19赛季场均投进16.1个三分球创造了联盟历史纪录。

火箭并不是三分最准的球队,但是三分最疯狂的球队,出手三分数、三分命中数和三分投丢数不断刷新联盟纪录。火箭的德安东尼时代结束了,进入赛拉斯时代,球队仍然可能继续投大量三分球,但可能不会像过去4个赛季那么疯狂。

德帅则可能将他的效应带到纽约布鲁克林,再推出一支三分王球队。德帅执教太阳时期,太阳是全联盟三分投射最疯狂的球队,成为了联盟三分王,执教火箭时也是这么干的。如今篮网有成为三分王的充足条件。两大核心杜兰特和欧文都是三分非常出色的球员,论三分精准度要比哈登更出色。球队计划续约乔·哈里斯,他可是不折不扣的三分王。相信篮网的引援也会更倾向于引进三分出色的球员,提升球队的三分火力。

德帅带来的第二大效应是有望推动杜兰特冲击MVP。德帅在太阳时期帮助纳什两次成为MVP,在火箭帮助哈登成为MVP。

如今在篮网,他的跑轰打法再造出MVP?诚然欧文是控卫,但杜兰特才是篮网核心。杜兰特在勇士最后一个赛季已经将场均助攻提升到5.9次,创造生涯新高。在篮网,杜兰特有机会迎来职业生涯数据再次全面爆炸的时期,场均助攻可能进一步提升,他可能会打出更多的三双。

杜兰特在2019年总决赛遭遇跟腱断裂重伤,但是他的恢复情况很不错,如今已经完全健康。在德帅的跑轰体系下,杜兰特这种投射能力出众、进攻无死角的球员将大放异彩。

除了数据爆炸外,篮网也有望在新赛季取得佳绩,德帅曾将太阳和火箭都带到常规赛第一。篮网在2019-20赛季只是东部第七,新赛季有望迎来战绩排名大幅跃升,这也可能为杜兰特夺取MVP增加筹码。

新赛季的MVP赔率榜上,东契奇、字母哥和詹姆斯排名前三,杜兰特只排名第八,但因为德帅效应,杜兰特有机会逆袭,再次夺得MVP。返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/367250.html

鸥鹭:https://www.ikjzd.com/w/2568

韩蓬:https://www.ikjzd.com/w/1635

优1宝贝:https://www.ikjzd.com/w/1507


原标题:德帅上任效应或再现!篮网抢走火箭三分王?杜兰特夺MVP更有戏了北京时间10月31日,篮网官网方宣布,德安东尼成为球队新任助教,与他一起加盟的还有76人助教乌多卡以及小斯塔德迈尔。篮网教练组的组建基本完成。德安东尼将辅佐昔日弟子纳什执教篮网。他的加盟很可能带来两大效应,其一是篮网可能成为联盟三分火力最凶猛的球队,其二是杜兰特重夺MVP的机会增大。纳什在前几天已经表态,他希望篮网提速,打快节奏
patents:https://www.ikjzd.com/w/857
易佰:https://www.ikjzd.com/w/1482
【端午节去厦门旅游】2020端午节去厦门好吗,厦门端午节旅:http://tour.shaoqun.com/a/33443.html
今年元旦广州冷不冷?:http://tour.shaoqun.com/a/41828.html
中山金斗湾怡乐园团购价格?金斗湾怡乐园网上可以预订吗?:http://tour.shaoqun.com/a/19037.html

电商、社交和广告,巨头们的“混战”和繁忙的中国跨境从业者

电商、社交和广告,巨头们的"混战"和繁忙的中国跨境从业者

其实除了苹果以外,剩余的 5 家公司的发力方向都和同一个词沾边——电商。

疫情导致 2020 年是太难的一年,但是疫情带来的影响也是魔幻的,尤其是在电商领域。

各个数据平台发出的购物 App 增长愈发明显,美洲(美国和巴西)最显眼;今天发布的 Amazon 财报数字很耀眼(但是投资人们好像还有别的顾虑,这一点后面说);腾讯和阿里在东南亚布局的 2 个电商平台在疯狂地战略性亏损;而在日常交流中笔者也发现越来越多的创业者想借这股"东风"搏一把。不论是电商或者社交巨头、还是拥有供应链优势的中国厂商,都想从这波疫情催化的购物行为线上转移红利中抓住些什么。

而今天写这个选题,也是看到了几家的财报,里面很有意思的一点是,Amazon 的营收数据非常漂亮,超分析师预期,但是财报发布后,股价给出的反应先是跌了 1% 左右,最后当天的收盘价也是勉强收了一个红十字星(微涨)。

这里面的原因及现在美国电商市场的格局变化,还是很有意思的。

亚马逊疫情期间赚翻了,但股价为何还是没涨?

我们先简单看下 Amazon 的 Q3 财报。

亚马逊 Q3 的净销售是 961 亿美金,较上年同比增长 37%。净利润是 63.31 亿美金,同比大涨 197%。如此大的体量,这个增速是非常可怕的。但投资人到底哪里不满意呢?我们可以把 Amazon 的收入拆开看。

亚马逊的销售额按照形式来看的话,主要分 2 部分,产品销售和服务销售。

2019 年 Amazon 收入构成

用 2019 年的全年数据来看,进一步拆分是这样的。

产品销售,主要是自营电商;服务销售就复杂一些,AWS 云服务+第三方商家服务(抽成、物流等等)+广告、订阅等等。

Amazon Q3 财报

回到 Q3 财报可以看到,作为一家以电商为主业的巨头,亚马逊的服务收入这一部分其实和产品销售已经快持平了,基本上是 55:45 的比例关系。

而不得不说,不论是发展势头强劲的 AWS、还是亚马逊一直在投资的电商基础设施、以及不断冒头抢占两巨头市场份额的广告业务,都看似更有增长空间,而这部分完全围绕在第三方的,其中第三方电商卖家是非常大的一块。而在美国市场,所有人都在抢第三方电商卖家,这是笔者认为 Amazon 财报出来之后,虽然数字很亮眼,但股价反应平平最重要的原因。

Amazon 按区域划分的收入 (AWS 云服务除外)

按区域来看,美国是亚马逊最重要的收入和利润市场(这里按照区域去划分的收入包含其他收入,例如广告、流媒体订阅等等,但主要是电商收入 | AWS 云服务收入除外)

各家对第三方卖家的争夺

本篇主要论述的是美国市场,几个原因。

1、这次疫情导致全球多个国家的电商市场快速发展,美国是最明显的一个市场。

2、新兴市场不论怎么火热,当笔者去询问一些跨境从业者"哪个市场最赚钱时",得到的回答永远是美国。

3、几家巨头,包括 TikTok 在内,不论是平台的购物闭环、还是社交引流等等,都是从美国起步的,如果出现红利,也是美国最先体现出来。

沿着上面对亚马逊非常重要的第三方卖家继续说。

美国的零售市场,2019 年沃尔玛第一,亚马逊第二。而沃尔玛今年整个向线上的转移除了自有商品有不错的竞争优势之外,也向第三方商家抛出了橄榄枝。

2020 年 6 月,沃尔玛宣布与 Shopify 达成合作,Shopify 的美国商家能够在沃尔玛的平台上出售产品。6 月 15 日,TechCrunch 报道,沃尔玛的 Marketplace(第三方)卖家突破了 5 万,是 2019 年 6 月的两倍。沃尔玛 2020 年 Q2 财报显示,电商销售额飙升了 97%。

当时《卫报》揣摩的 Amazon 心理

GeekWire 对沃尔玛美国电商销售额的预期

可能令 Amazon 更头痛的是,以前作为第三方出现在 Amazon Marketplace 的卖家们,以后不仅将出现在沃尔玛的平台上、还会出现在 Facebook、Instagram 上、甚至 YouTube、和 TikTok 上。

各家平台电商业务策略一览

向上滑动阅览

谷歌

4 月——Google Shopping 搜索结果展示大量未付费推广的产品

7 月——谷歌宣布取消 Google Shopping 服务费

7 月——谷歌推出短视频带货平台 Shoploop

10 月——YouTube 与 Shopify 合作,测试 Shopify 在商家直接出售商品,并将数据与谷歌的分析和 Shopping 数据打通

Facebook

5 月——宣布与 Shopify 等第三方合作,上线 Facebook Shop,实现 Facebook 的购物闭环

8 月份——Ins 和 Facebook 推出多项新的直播购物功能

沃尔玛

2 月 WFS 服务(仓储、配送等)接收第三方商家订单

6 月牵手 Shopify,大力发展 Marektplace 业务

7 月推出会员服务,直指亚马逊

9 月参与 TikTok 竞购,借 TikTok 引流电商业务 

其中,最近 YouTube 与 Shopify 合作,测试 Shopify 在商家直接出售商品,并将数据与谷歌的分析和 Shopping 数据打通。这个应该是最重磅的、对以后 KOL 带货影响最重要的政策之一。

除此之外,TikTok 也牵手 Shopify,未来是否和沃尔玛合作还不知道,亚马逊也推出了 Amazon LIVE 鼓励直播带货。

可以看到,FB、TikTok、谷歌都打算在自身的社交平台内做购物闭环,电商的流量以后也会主要在内部循环,对沃尔玛和亚马逊这样的平台来说,压力不小。

繁忙的中国跨境从业者和更多可能

鉴于之前的种种,从平台的角度看,Shopify 应该是最大的赢家,各家争相与其合作,无法从 Amazon 前些年的快速增长中获利的 Shopify,因为其更偏底层的业务逻辑,获得了各"前端"的青睐。

而 Shopify 踩中的另一个趋势是,独立站的形式除去铺货以外,也更适合发展到一定程度的卖家树立品牌。这给有供应链优势、正在转型的中国卖家提供了更多的机会,而资本也更青睐于 DTC 形式的跨境电商项目。

白鲸出海今年在采访坚果资本合伙人孙鸿达时对方表示,"从 2019 年来看,整个资本市场环境对于跨境电商已经更加友好,这体现在 Anker 等企业在创业板上市。资本原来的主要退出路径是并购,现在国家在跨界并购和出口创汇上推出了一系列利好政策。"

以 DTC(direct-to-consumer)模式为例,从社交到品牌的闭环越来越完善,可以看到有大量独立站的卖家正在涌出。而整个媒体巨头的入局,会导致 KOL 带货和社交电商在美国这样的发达市场更快发展起来。

TikTok 加购物车、与 Shopify 牵手帮助独立站商家推广、甚至之后的直播带货,会起到助推作用。毕竟,据 CNBC 报道,TikTok 已经是美国最受青少年喜欢的第 2 大平台,超越了 Ins。在 2020 年年初的时候,TikTok 还排在第 3。

而现在已经有不少中国跨境从业者去运营 TikTok,这会进一步推动整个 TikTok 生态的快速形成。一个训练营的从业者表示,自己运营的 1 个账号发布的 1 个视频,在 4 天之内给自己带来了 740 单、1 万多美金的收入。

另一位从业者向白鲸出海表示:"之前主要是做平台,现在选择多了很多,平台还是会继续做,但独立站肯定会去尝试的。"

不仅是跨境商家,随着整个海外电商的加速发展和引流"媒体化",一些 KOL 平台在杭州这类城市,搭建了跨境直播基地。而在近期,也有多家与跨境电商相关的项目找到白鲸出海寻求合作,也希望能够吃到这一波红利。这里面有从事十余年的电商老兵、也有以前从事程序化广告业务现在想结合趋势做 KOL 大数据的"电商新人",有些已经接近达成融资意向,他们甚至希望能够在 Q4 大促季来临之前,能够攒足"弹药"争夺市场。

但当模式越发多样的时候,其实门槛也会更高。创业者选择合适自己的平台、在平台上获取流量、运营,以及供应链能力是否能够留出足够的利润空间,这些都需要更加谨慎地思考。

仍以坚果资本为例,会更多去看能够沉淀用户和品牌价值的时尚类 DTC 品牌,也看好跨境电商产业链上的服务商。但是同时表示,"头部卖家和早期小团队之间的那部分卖家,因为估值和规模储量的原因可能融资机会更少一些。现在各投资机构偏好有点向两头集中,要么投资入局更早的,要么是更晚的。"

来源:白鲸出海

文章来源:https://www.ikjzd.com/home/132718

myyearbook:https://www.ikjzd.com/w/726

网上1号店:https://www.ikjzd.com/w/2263

farfetch:https://www.ikjzd.com/w/2133

海拍客:https://www.ikjzd.com/w/1742

catch:https://www.ikjzd.com/w/832

电商、社交和广告,巨头们的"混战"和繁忙的中国跨境从业者

美国时间 9 月 29 日,大公司又扎堆发财报了,苹果、谷歌、Facebook、Amazon、Shopify,还有一个轻量级一些的 Pinterest。

Java异常之异常处理机制

Java异常之异常处理机制

异常处理机制

 

1、抛出异常

2、捕获异常

3、异常处理五个关键字:

try、catch、finally、throw、throws

注意:假设要捕获多个异常:需要按照层级关系(异常体系结构) 从小到大!

package exception;/** * Java 捕获和抛出异常: * 异常处理机制 * 1、抛出异常 * 2、捕获异常 * 3、异常处理五个关键字 * try、catch、finally、throw、throws * 注意:假设要捕获多个异常:需要按照层级关系(异常体系结构) 从小到大! */public class Test { public static void main(String[] args) {  int a = 1;  int b = 0;  /**   * try catch 是一个完整的机构体,finally 可以不要   * 假设IO流,或者跟资源相关的东西,最后需要关闭,关闭的操作就放在 finally 中   */  try { //try 监控区域   System.out.println(a / b);  } catch (ArithmeticException exception){ //catch(想要捕获的异常类型) 捕获异常   System.out.println("程序出现异常,变量b不能为0");  } finally { //处理善后工作   System.out.println("finally");  }  System.out.println("-------------- 分隔符 --------------");  try {   new Test().a(); //无限循环  } catch (Error error){   System.out.println("Error");  } catch (Exception exception){   System.out.println("Exception");  } catch (Throwable throwable){   System.out.println("Throwable");  } finally {   System.out.println("finally");  } } public void a(){  b(); } public void b() {  a(); }}
 

捕获异常

 

快捷键:选中代码 Ctrl + Alt + T

捕获异常的好处:程序不会意外的停止,try catch 捕获异常后程序会正常的往下执行

package exception;/** * 捕获异常快捷键 * 选中代码后:Ctrl + Alt + T * 如: * 选中 System.out.println(a / b); * 然后快捷键 Ctrl + Alt + T */public class Test2 { public static void main(String[] args) {  int a = 1;  int b = 0;  try {   System.out.println(a / b);  } catch (Exception exception) {   exception.printStackTrace(); //打印错误的栈信息  } finally {  } }}
 

抛出异常

 

1、在方法中抛出异常:throw

2、在方法上抛出异常:throws

package exception;/** * 捕获异常 * 抛出异常 */public class Test3 { public static void main(String[] args) {  /**   * 方法中抛出异常   */  new Test3().test(1,0); //匿名内部类直接调用  System.out.println("------------ 分隔符 -------------");  /**   * 方法上抛出异常   * 捕获异常的好处:   * 程序不会意外的停止,try catch 捕获异常后程序会正常的往下执行   */  try {   new Test3().test2(1,0); //匿名内部类直接调用  } catch (ArithmeticException e) {   e.printStackTrace();  } } /**  * 在方法中抛出异常:throw  * @param a  * @param b  */ public void test(int a, int b){  if (b == 0){ //throw   throw new ArithmeticException(); //主动抛出异常,一般在方法中使用  }  System.out.println(a / b); } /**  * 假设在方法中处理不了这个异常,就在方法上抛出异常,然后捕获异常  * 在方法上抛出异常:throws  * @param a  * @param b  * @throws ArithmeticException  */ public void test2(int a, int b) throws ArithmeticException{  if (b == 0){   throw new ArithmeticException();  } }}
 

原文转载:http://www.shaoqun.com/a/485819.html

贝贝官网:https://www.ikjzd.com/w/1321

aeo:https://www.ikjzd.com/w/2356

auditor:https://www.ikjzd.com/w/2437


Java异常之异常处理机制异常处理机制1、抛出异常2、捕获异常3、异常处理五个关键字:try、catch、finally、throw、throws注意:假设要捕获多个异常:需要按照层级关系(异常体系结构)从小到大!packageexception;/***Java捕获和抛出异常:*异常处理机制*1、抛出异常*2、捕获异常*3、异常处理五个关键字*try、catch、finally、throw、th
俄罗斯灰色清关:https://www.ikjzd.com/w/1409
isbn:https://www.ikjzd.com/w/174
为打击刷单控评行为,亚马逊又开始测试新功能?:https://www.ikjzd.com/home/113423
review上评3W+,这家大卖究竟做了什么神操作?:https://www.ikjzd.com/home/101981
珠海梦幻水城优惠门票在哪买?梦幻水城优惠票需要提前预约吗?:http://tour.shaoqun.com/a/58283.html

2020-10-30

你要的区块链书单来了!

点击蓝色"程序员书单"关注我哟

加个"星标",每天带你读好书!

区块链系列书单

图说区块链

内容简介

区块链,如瑞士仪表般精密,如互联网般惊世骇俗,它在以神一般的节奏颠覆社会。

当新兴技术来临时,你可以选择规避——如果明天也可以规避的话。区块链也一样。

作为一个现象级概念,金融科技创新在过去几年迎来了奇点式发展。其中引人注目的当属区块链技术。区块链技术正在动摇全球金融基础设施,它是全球*级银行和其他金融机构重点追逐的领域。毫无疑问,区块链是未来5年有前景的行业之一。

《图说区块链》用生动、形象的语言,以漫画、故事的方式,全面揭示了区块链的基本原理、应用及发展前景,告诉读者区块链是什么,区块链有哪些应用价值,让读者通过一本书读懂区块链。

作者简介

徐明星,OKCoin币行&OKLink创始人兼CEO,全球区块链商业理事会中国分中心副主席,中国区块链应用研究中心创始理事兼理事长。曾担任豆丁网CTO和雅虎开发工程师。

田颖,OKLink副总裁。资深互联网从业者及创业者,曾服务于易车网、艺龙旅行网、上海证大等上市公司,后作为联合创始人参与科技金融企业创业。

李霁月,OKLink首席研究员,品牌经理。资深互联网金融从业者,曾服务于融360、中国金融在线集团等企业,融360网站《图话财经》、OKLink《图解区块链》等栏目专栏作者。

区块链原理、设计与应用

内容简介

  本书由超级账本核心设计和开发者撰写,是区块链开发落地专业指南。由浅入深、系统化介绍超级账本Fabric设计精华、应用开发等。全书分为理论篇和实践篇两大部分;第13章介绍区块链技术的由来、核心思想及典型的应用场景;第45章重点介绍区块链技术中大量出现的分布式系统技术和密码学安全技术;第6~8章介绍区块链领域的三个典型开源项目:比特币、以太坊以及超级账本;第9-11章以超级账本Fabric项目为例,具体讲解了安装部署、配置管理,以及使用 Fabric CA 进行证书管理的实践经验;第12章重点剖析超级账本Fabric项目的核心架构设计;第13章介绍区块链应用开发的相关技巧和示例;第14章介绍区块链服务平台的设计与开发,并讲解应用超级账本Cello项目构建服务平台的相关知识。本书覆盖了区块链和分布式账本领域的*新技术,可帮助读者深入理解区块链核心原理和典型设计实现,以及高效地开发基于区块链平台的分布式应用。

作者简介

  杨保华:博士,毕业于清华大学。超级账本(Hyperledger)大中华区技术工作组主席,IBM大中华区Blockchain技术社区首席顾问,资深研究员。曾主持多个大规模系统平台的架构设计和研发实施,是区块链、云计算、大数据等技术的早期研究者和实践者。他热爱开源技术,曾贡献OpenStack、OpenDaylight等开源项目,是超级账本Fabric项目核心设计和开发者,也是Cello和Fabric-SDK-Py项目的发起人。个人主页为https://yeasy.github.com。

  陈昌:毕业于清华大学。纸贵科技CTO,曾任IBM高级研究员。技术方向包括云计算、区块链、机器学习等。他是区块链技术的早期研究和推动者,是超级账本(Hyperledger)项目核心开发者。他有丰富的区块链应用实践经验,曾负责金融行业区块链解决方案的架构设计和实施,并主导开发了若干区块链服务平台。

区块链技术及应用

内容简介

本书系统详实地介绍了区块链技术和应用,主要包括三大部分内容:由浅入深地介绍了区块链技术缘起、演进过程、技术原理和发展趋势;分享并解析了落地应用案例,以华为云区块链服务为例示范了区块链应用实践的过程;分析探究了区块链的价值、未来发展趋势以及有关区块链的其他问题,为区块链应用的开发和创新提供多视角的思路。

本书的目标读者是所有想充分了解区块链技术和应用的人群。本书既包含区块链基础知识,又有对区块链应用场景以及发展趋势的探究,可以帮助非专业人员系统地了解区块链;同时,本书也有对一些技术原理、算法和应用实践的讨论,期望帮助开发工程师更加快速、深入地投入区块链的开发工作当中。

作者简介

本书编著团队系华为公司在国内外区块链技术和应用领域的深度实践者,是由大学教授、博士、留学归国人员、华为海外研究所科研人员、技术骨干等组成的一个高水平技术研究团队。该团队在区块链相关的技术,如分布式系统、算法、密码学、网络、数据管理等领域都有丰富经验,平均相关从业经验超过6年,成功推动多个政务、金融、供应链、存证等应用的落地,并担任可信区块链推进计划BaaS组组长,积极参加了计算机学会区块链专业委员会、ITU-T等行业、学术和标准组织。

原文转载:http://www.shaoqun.com/a/485805.html

淘粉吧怎么返利:https://www.ikjzd.com/w/1725

gem:https://www.ikjzd.com/w/1997

淘粉吧返利:https://www.ikjzd.com/w/1725


点击蓝色"程序员书单"关注我哟加个"星标",每天带你读好书!​区块链系列书单​图说区块链内容简介区块链,如瑞士仪表般精密,如互联网般惊世骇俗,它在以神一般的节奏颠覆社会。当新兴技术来临时,你可以选择规避——如果明天也可以规避的话。区块链也一样。作为一个现象级概念,金融科技创新在过去几年迎来了奇点式发展。其中引人注目的当属区块链技术。区块链技术正在动摇全球金融基础设施,它是全球*级银行和其他金融机构
斑马物流:https://www.ikjzd.com/w/1316
acedota:https://www.ikjzd.com/w/2070
亚马逊线上工具大起底(七):选品工具中篇,依然有免费工具哦:https://www.ikjzd.com/home/2100
漓江在哪个省 :http://tour.shaoqun.com/a/16262.html
三清山旅游小贴士三清山旅游注意事项:http://tour.shaoqun.com/a/25946.html

一起来读官方文档

1.11。使用JSR 330标准注解
从Spring 3.0开始,Spring提供了对JSR-330标准注解(依赖注入)的支持。
这些注解的扫描方式与Spring注解相同。
要使用它们,您需要在类路径中包含相关的jar。

如果你使用Maven, javax。 注入工件在标准Maven存储库中可用(https://repo1.maven.org/maven2/javax/inject/javax.inject/1/)。 你可以添加以下依赖到你的文件pom.

1.11.1。@Inject和@Named
除了@Autowired,您可以使用@javax.inject.Inject注入:

import javax.inject.Inject;public class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(MovieFinder movieFinder) {  this.movieFinder = movieFinder; } public void listMovies() {  this.movieFinder.findMovies(...);  // ... }}

与@Autowired一样,你可以在字段级、方法级和构造参数级使用@Inject。

此外,您可以将注入点声明为提供者,从而允许按需访问作用域较短的bean,或者通过Provider.get()延迟调用访问其他bean。
以下示例提供了先前示例的变体:

import javax.inject.Inject;import javax.inject.Provider;public class SimpleMovieLister { private Provider<MovieFinder> movieFinder; @Inject public void setMovieFinder(Provider<MovieFinder> movieFinder) {  this.movieFinder = movieFinder; } public void listMovies() {  this.movieFinder.get().findMovies(...);  // ... }}

如果要为应该注入的依赖项使用qualified名称,则应使用@Named批注,如以下示例所示:

import javax.inject.Inject;import javax.inject.Named;public class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(@Named("main") MovieFinder movieFinder) {  this.movieFinder = movieFinder; }}

与一样@Autowired,@Inject也可以与java.util.Optional或 一起使用@Nullable。
这在这里更为适用,因为@Inject它没有required属性。
以下示例展示了如何使用@Inject和 @Nullable:

public class SimpleMovieLister { @Inject public void setMovieFinder(Optional<MovieFinder> movieFinder) {  // ... }}
public class SimpleMovieLister { @Inject public void setMovieFinder(@Nullable MovieFinder movieFinder) {  // ... }}

1.11.2。@Named和@ManagedBean:
您可以使用@javax.inject.Named或@javax.annotation.ManagedBean代替@Component

如以下示例所示:

import javax.inject.Inject;import javax.inject.Named;@Named("movieListener") // @ManagedBean("movieListener") could be used as wellpublic class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(MovieFinder movieFinder) {  this.movieFinder = movieFinder; } // ...}

在不指定Component名称的情况下使用@Component是很常见的。
@Named也可以以类似的方式使用,如下面的示例所示:

import javax.inject.Inject;import javax.inject.Named;@Namedpublic class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(MovieFinder movieFinder) {  this.movieFinder = movieFinder; } // ...}

当使用@Named或时@ManagedBean,可以使用与使用Spring注解完全相同的方式来使用组件扫描,如以下示例所示:

@Configuration@ComponentScan(basePackages = "org.example")public class AppConfig { // ...}
与相比@Component,JSR-330的@Named和JSR-250的ManagedBean 注解是不可组合的。
1.11.3。JSR-330标准注解的局限性

当你使用标准注解时,你应该知道一些重要的特性是不可用的,如下表所示:

Springjavax.inject.*javax.inject限制/解释
@Autowired@Inject@Inject没有"required"属性。
可以与Java 8一起使用Optional
@Component@Named/@ManagedBeanJSR-330没有提供可组合模型,
只是提供了一种识别已命名组件的方法。
就是说这俩注解仅仅是把类标识为bean
@Scope("singleton")@SingletonJSR-330的默认作用域类似于Spring的prototype。
但是,为了保持它与Spring的一般默认值一致,
在Spring容器中声明的JSR-330 bean在默认情况下是单例的。
为了使用除singleton之外的作用域,
您应该使用Spring的@Scope注解。
javax.inject包中还提供了一个@Scope注解。
不过,这个注解仅用于创建您自己的注解。
具体例子就看同层级包下的@Singleton注解就可以了
@Qualifier@Qualifier / @Namedjavax.inject.Qualifier只是用于构建自定义限定符的元注解。
具体String qualifiers (例如Spring的带有value的@Qualifier)
可以通过javax.inject.Named关联。
@Value--no equivalent
@Required--no equivalent
@Lazy--no equivalent
ObjectFactoryProviderjavax.inject.Provider是Spring的
直接替代方法ObjectFactory,
只是get()方法名称较短。
它也可以与Spring@Autowired或
非注解构造函数和setter方法结合使用。
1.12。基于Java的容器配置

本节介绍如何在Java代码中使用注解来配置Spring容器。它包括以下主题:

  • 基本概念:@Bean和@Configuration
  • 使用实例化Spring容器 AnnotationConfigApplicationContext
  • 使用@Bean注解
  • 使用@Configuration注解
  • 组成基于Java的配置
  • Bean定义配置文件
  • PropertySource 抽象化
  • 使用 @PropertySource
  • 声明中的占位符解析
1.12.1。基本概念:@Bean和@Configuration

Spring的新Java配置支持中的主要组件是-带@Configuration注解的类和-带@Bean注解的方法。

@Bean注解用于指示方法实例化、配置和初始化的新对象并将由Spring IoC容器管理。
对于那些熟悉Spring的元素相同的角色。

您可以对任何Spring @Component使用@bean注解的方法。
但是,它们最常与@Configuration bean一起使用。

用@Configuration注解类表明它的主要用途是作为bean定义的源。
此外,@Configuration类通过调用同一类中的其他@Bean方法来定义bean间的依赖关系。
最简单的@Configuration类如下:

@Configurationpublic class AppConfig { @Bean public MyService myService() {  return new MyServiceImpl(); }}

上一AppConfig类等效于以下Spring

<beans> <bean id="myService" /></beans>
Full @Configuration 与 "lite" @Bean?当@Bean方法在没有使用@Configuration注解的类中声明时,它们被称为在"lite"模式下处理。与 full 的@Configuration不同,lite@Bean方法不能声明bean之间的依赖关系。 Spring会正常实例化 lite @Bean,并执行依赖注入 但是单独调用这个@Bean方法的话,就仅仅是执行new 操作没有进行依赖注入在常见的场景中,@Bean方法将在@Configuration类中声明,以确保始终使用"full"模式,这样可以使用方法之间互相调用。并防止通过常规Java调用意外地调用相同的@Bean方法,这有助于减少在"lite"模式下操作时难以跟踪的细微错误。

下面几节将深入讨论@Bean和@Configuration注解。
但是,首先,我们将介绍使用基于java的配置创建spring容器的各种方法。

1.12.2。使用AnnotationConfigApplicationContext实例化Spring容器

下面几节介绍了Spring3.0中引入的AnnotationConfigApplicationContext。
这个多功能的ApplicationContext实现不仅可以接受@Configuration类作为输入,还可以接受普通的@Component类和用JSR-330元数据注解的类。

当@Configuration类作为输入提供时,@Configuration类本身被注册为bean定义,类中所有声明的@bean方法也被注册为bean定义。
当@Component和JSR-330类被提供时,它们被注册为bean定义,并且会被用在在必要的地方进行注入,比如@Autowired或@Inject。

Simple Construction

与使用Spring

如下面的示例所示,这允许完全不使用

public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); MyService myService = ctx.getBean(MyService.class); myService.doStuff();}

如前所述,AnnotationConfigApplicationContext不仅限于仅使用@Configuration类。@Component可以将任何一个或带有JSR-330注解的类作为输入提供给构造函数,如以下示例所示:

public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(MyServiceImpl.class, Dependency1.class, Dependency2.class); MyService myService = ctx.getBean(MyService.class); myService.doStuff();}

前面的例子中假定MyServiceImpl,Dependency1以及Dependency2使用Spring依赖注入注解,例如@Autowired。

通过使用编程方式构建容器 register(Class<?>…​)

您可以AnnotationConfigApplicationContext使用no-arg构造函数实例化一个对象,然后使用register()方法配置它。
以编程方式构建AnnotationConfigApplicationContext时,此方法特别有用。
以下示例显示了如何执行此操作:

public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(AppConfig.class, OtherConfig.class); ctx.register(AdditionalConfig.class); ctx.refresh(); MyService myService = ctx.getBean(MyService.class); myService.doStuff();}
使用启用组件扫描 scan(String…​)

要启用组件扫描,您可以@Configuration按如下方式注解您的类,此处不用加(.*):

@Configuration@ComponentScan(basePackages = "com.acme") public class AppConfig { ...}

ComponentScan注解启用组件扫描。

有经验的Spring用户可能熟悉Springcontext:命名空间中的

<beans> <context:component-scan base-package="com.acme"/></beans>

在前面的示例中,将扫描com.acme包以查找任何带 @Component注解的类,
并将这些类注册为容器内的Spring bean定义。
AnnotationConfigApplicationContext公开此scan(String…​)方法以允许相同的组件扫描功能,如以下示例所示:

public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.scan("com.acme"); ctx.refresh(); MyService myService = ctx.getBean(MyService.class);}
请记住,@Configuration的元注解用@Component,所以他们是组件扫描候选人。 在前面的示例中,假设AppConfig在com.acme包(或下面的任何包)中声明,则在调用scan()期间将扫描到。 通过refresh()方法,其所有@Bean方法都将在容器内进行处理并注册为Bean定义。
支持Web应用程序 AnnotationConfigWebApplicationContext

一个基于AnnotationConfigApplicationContext的WebApplicationContext变种是AnnotationConfigWebApplicationContext。
可以使用此实现来配置Spring ContextLoaderListenerservlet监听器,Spring MVC的 DispatcherServlet。
以下web.

<web-app> <!-- 配置 ContextLoaderListener来使用AnnotationConfigWebApplicationContext  替换默认的 default 
1.12.3。使用@Bean注解

@Bean是方法级别的注解,是元素的直接类似物。
注解提供的某些属性,例如:* init-method * destroy-method * autowiring * name *。

你可以一个注解@Configuration-annotated或在 @Component-annotated类使用@Bean。

声明一个bean

要声明一个bean,可以用注解对方法进行@Bean注解。
方法返回值的类型就是在ApplicationContext中注册的bean定义的类型。
默认情况下,Bean名称与方法名称相同。
以下示例显示了@Bean方法声明:

@Configurationpublic class AppConfig { @Bean public TransferServiceImpl transferService() {  return new TransferServiceImpl(); }}

前面的配置与下面的Spring

<beans> <bean id="transferService" /></beans>

这两个声明都使名为transferService的bean在ApplicationContext中可用,该bean绑定到类型为TransferServiceImpl的对象实例,
如下图所示:

transferService -> com.acme.TransferServiceImpl

您还可以使用@Bean将接口(或基类)作为返回类型声明您的方法,
如以下示例所示:

@Configurationpublic class AppConfig { @Bean public TransferService transferService() {  return new TransferServiceImpl(); }}
如果您一直通过声明的服务接口引用您的类型,@Bean返回类型可以安全地加入到设计决策中。但是,对于实现多个接口的组件或其实现类型可能引用的组件,声明最具体的返回类型更安全(至少与引用bean的注入点所需的返回类型相同)。
Bean依赖

带@Bean注解的方法可以具有任意数量的参数,这些参数描述了构建该bean所需的依赖关系。
例如,如果我们TransferService需要AccountRepository,我们可以使用方法参数来实现该依赖关系,如以下示例所示:

@Configurationpublic class AppConfig { @Bean public TransferService transferService(AccountRepository accountRepository) {  return new TransferServiceImpl(accountRepository); }}

解析机制与基于构造函数的依赖注入几乎相同。

接收生命周期回调

使用@Bean注解定义的任何类都支持常规的生命周期回调,并且可以使用JSR-250中的@PostConstruct和@PreDestroy注解。

还完全支持常规的Spring生命周期回调。
如果bean实现InitializingBean,DisposableBean或Lifecycle,则容器将调用它们各自的方法。

还完全支持标准*Aware接口集(例如BeanFactoryAware, BeanNameAware, MessageSourceAware, ApplicationContextAware等)。

该@Bean注解支持指定任意初始化和销毁回调方法,就像Spring

public class BeanOne { public void init() {  // initialization logic }}public class BeanTwo { public void cleanup() {  // destruction logic }}@Configurationpublic class AppConfig { @Bean(initMethod = "init") public BeanOne beanOne() {  return new BeanOne(); } @Bean(destroyMethod = "cleanup") public BeanTwo beanTwo() {  return new BeanTwo(); }}
默认情况下,使用Java配置定义的具有公共close或shutdown方法的bean将自动与销毁回调一起调用。比如这样:在容器销毁的时候就会被调用,不需要继承任何接口@Beanpublic class ServiceFour {	public void close(){		System.out.println("20201030-close");	}}如果您有一个公共的close或shutdown方法,并且不希望在容器关闭时调用它,那么可以将@Bean(destroyMethod="")添加到Bean定义中,以禁用默认(推断)模式。@Bean(destroyMethod="")public class ServiceFour {	public void close(){		System.out.println("20201030-close");	}}默认情况下,您可能希望对使用JNDI获取的资源执行此操作,因为它的生命周期是在应用程序外部管理的。特别是,确保总是对数据源执行此操作。以下示例显示如何阻止数据源的自动销毁回调:@Bean(destroyMethod="")public DataSource dataSource() throws NamingException { return (DataSource) jndiTemplate.lookup("MyDS");}此外,对于@Bean方法,通常使用程序化JNDI查找,方法是使用SpringJndiTemplate或JndiLocatorDelegate辅助方法,或者直接InitialContext使用JNDI, 但不使用JndiObjectFactoryBean变体(这将迫使您将返回类型声明为FactoryBean类型,而不是实际的目标类型,不是目标类型的话就很难使其他的@Bean方法来交叉调用此方法)。

对于上述示例中的BeanOne,在构造过程中直接调用init()方法同样有效,如下例所示:

@Configurationpublic class AppConfig { @Bean public BeanOne beanOne() {  BeanOne beanOne = new BeanOne();  beanOne.init();  return beanOne; } // ...}
当您直接使用Java工作时,您可以对对象执行任何操作,而不必总是依赖于容器生命周期。
指定Bean范围

Spring包含@Scope注解,以便您可以指定bean的范围。

使用@Scope注解

@Bean默认作用域是singleton,但是您可以使用@Scope注解覆盖它,如以下示例所示:

@Configurationpublic class MyConfiguration { @Bean @Scope("prototype") public Encryptor encryptor() {  // ... }}
@Scope 和 scoped-proxy

Spring提供了一种通过作用域代理处理作用域依赖关系的方便方法。
在使用

	<bean id="serviceOne" >		<aop:scoped-proxy />	</bean>

用@Scope注解在Java中配置bean提供了与proxyMode属性相同的支持。
默认设置为无代理(ScopedProxyMode.NO),但您可以指定ScopedProxyMode.TARGET_CLASS or ScopedProxyMode.INTERFACES。

<?

如果您使用Java Config将上述

// an HTTP Session-scoped bean exposed as a proxy@Bean@SessionScopepublic UserPreferences userPreferences() { return new UserPreferences();}@Beanpublic Service userService() { UserService service = new SimpleUserService(); // a reference to the proxied userPreferences bean service.setUserPreferences(userPreferences()); return service;}
自定义Bean命名

默认情况下,配置类使用@Bean方法的名称作为结果bean的名称。
但是,可以使用name属性覆盖此功能,如以下示例所示:

@Configurationpublic class AppConfig { @Bean(name = "myThing") public Thing thing() {  return new Thing(); }}
Bean别名

正如在命名bean中所讨论的,有时需要为单个bean指定多个名称,或者称为bean别名。
为此,@Bean注解的name属性接受一个字符串数组。
下面的示例演示如何为bean设置多个别名:

@Configurationpublic class AppConfig { @Bean({"dataSource", "subsystemA-dataSource", "subsystemB-dataSource"}) public DataSource dataSource() {  // instantiate, configure and return DataSource bean... }}
bean描述

有时,提供bean的更详细的文本描述是很有帮助的。当bean(可能通过JMX)公开以进行监视时,这一点特别有用。

要向@Bean添加说明,可以使用@description注解,如下示例所示:

@Configurationpublic class AppConfig { @Bean @Description("Provides a basic example of a bean") public Thing thing() {  return new Thing(); }}
1.12.4。使用@Configuration注解

@Configuration是一个类级别的注解,来指定当前类是一些bean definition的聚合。
@Configuration 类通过public@Bean注解方法声明Bean。

对@Configuration类上的@Bean方法的调用也可以用来定义Bean间的依赖关系。

注入bean间的依赖关系

当bean彼此依赖时,表达这种依赖就像让一个bean方法调用另一个一样简单,如以下示例所示:

@Configurationpublic class AppConfig { @Bean public BeanOne beanOne() {  return new BeanOne(beanTwo()); } @Bean public BeanTwo beanTwo() {  return new BeanTwo(); }}

在前面的示例中,通过构造函数注入beanOne接收对的引用beanTwo。

仅当@Bean在@Configuration类中声明该方法时,此声明bean间依赖关系的方法才有效。您不能使用普通@Component类声明bean间的依赖关系。
Lookup Method注入

如前所述,Lookup Method注入是一种高级特性,应该很少使用。
在单例范围bean依赖于原型范围bean的情况下,它非常有用。

将Java用于此类配置提供了实现此模式的自然方法。
以下示例演示如何使用查找方法注入:

public abstract class CommandManager { public Object process(Object commandState) {  Command command = createCommand();  command.setState(commandState);  return command.execute(); } // okay... but where is the implementation of this method? protected abstract Command createCommand();}

通过使用Java配置,可以创建一个覆盖CommandManager抽象createCommand()方法的子类,该方法将以某种方式查找新的(原型)命令对象。以下示例显示了如何执行此操作:

@Bean@Scope("prototype")public AsyncCommand asyncCommand() { AsyncCommand command = new AsyncCommand(); return command;}@Beanpublic CommandManager commandManager() { // return CommandManager 的匿名实现类 并且实现了 createCommand()方法 // return a new 原型类的 Command object return new CommandManager() {  protected Command createCommand() {   return asyncCommand();  } }}
有关基于Java的配置如何在内部工作的更多信息

考虑以下示例,该示例显示了一个带@Bean注解的方法被调用两次:

@Configurationpublic class AppConfig { @Bean public ClientService clientService1() {  ClientServiceImpl clientService = new ClientServiceImpl();  clientService.setClientDao(clientDao());  return clientService; } @Bean public ClientService clientService2() {  ClientServiceImpl clientService = new ClientServiceImpl();  clientService.setClientDao(clientDao());  return clientService; } @Bean public ClientDao clientDao() {  return new ClientDaoImpl(); }}

clientDao()被clientService1()调用一次和被clientService2()调用一次。
由于此方法创建的新实例ClientDaoImpl并返回它,因此通常来说希望有两个实例(每个服务一个)。

那肯定是有问题的:在Spring中,实例化的bean singleton默认具有作用域。
这就是神奇的地方:所有@Configuration类在启动时都使用子类化CGLIB。在子类中,子方法在调用父方法并创建新实例之前,首先检查容器中是否有任何缓存(作用域)的bean。

根据bean的范围,行为可能有所不同。 我们在这里谈论单例。
从Spring 3.2开始,不再需要将CGLIB添加到您的类路径中,因为CGLIB类已经被重新打包org.springframework.cglib并直接包含在spring-core JAR中。
由于CGLIB在启动时动态添加特性,因此有一些限制。尤其是,配置类不能是final。但是,从4.3开始,配置类上允许使用任何构造函数,包括使用@Autowired或一个用于默认注入的非默认构造函数声明。如果您希望避免任何CGLIB强加的限制,请考虑在非@configuration 类上声明@Bean方法(例如,在普通@Component类上)。然后@Bean方法之间的跨方法调用不会被拦截,但是因此您必须在构造函数或方法级别专门进行依赖的注入,直接调用非@configuration的@Bean方法Spring将不再负责依赖注入。
1.12.5。组成基于Java的配置

Spring基于Java的配置特性允许您编写注解,这可以降低配置的复杂性。

使用@Import注解

正如Spring 该元素来帮助模块化配置一样,该@Import注解允许@Bean从另一个配置类加载定义,如以下示例所示:

@Configurationpublic class ConfigA { @Bean public A a() {  return new A(); }}@Configuration@Import(ConfigA.class)public class ConfigB { @Bean public B b() {  return new B(); }}

现在,不需要同时指定两者ConfigA.class和ConfigB.class实例化上下文,只需ConfigB显式提供,如以下示例所示:

public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class); // now both beans A and B will be available... A a = ctx.getBean(A.class); B b = ctx.getBean(B.class);}

这种方法简化了容器实例化,因为只需要处理一个类,而不是要求您@Configuration在构造过程中记住大量潜在的类。

从Spring Framework 4.2开始,@Import还支持对常规component 类的引用,类似于该AnnotationConfigApplicationContext.register方法。 如果要通过使用一些配置类作为入口点来显式定义所有组件,从而避免组件扫描,则此功能特别有用。
注入对导入@Bean定义的依赖

前面的示例有效,但过于简单。
在大多数实际情况下,Bean在配置类之间相互依赖。

使用

使用@Configuration类时,Java编译器会在配置模型上施加约束,因为对其他bean的引用必须是有效的Java语法。

幸运的是,解决这个问题很简单。
正如我们已经讨论的那样,一种@Bean方法可以具有任意数量的描述Bean依赖关系的参数。
考虑以下具有多个@Configuration类的更真实的场景,每个类都取决于其他类中声明的bean:

@Configurationpublic class ServiceConfig { @Bean public TransferService transferService(AccountRepository accountRepository) {  return new TransferServiceImpl(accountRepository); }}@Configurationpublic class RepositoryConfig { @Bean public AccountRepository accountRepository(DataSource dataSource) {  return new JdbcAccountRepository(dataSource); }}@Configuration@Import({ServiceConfig.class, RepositoryConfig.class})public class SystemTestConfig { @Bean public DataSource dataSource() {  // return new DataSource }}public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(SystemTestConfig.class); // everything wires up across configuration classes... TransferService transferService = ctx.getBean(TransferService.class); transferService.transfer(100.00, "A123", "C456");}

还有另一种方法可以达到相同的结果。
请记住,@Configuration类是在容器中最终只有一个bean:这意味着他们可以利用 @Autowired与@Value注入等功能相同的其它bean。

确保以这种方式注入的依赖项只属于最简单的类型。@Configuration 类在上下文初始化过程中很早就被处理,强制以这种方式注入依赖项可能会导致意外的早期初始化。只要有可能,就尽可能使用基于参数的注入,如前面的示例所示。另外,通过@Bean使用BeanPostProcessor和BeanFactoryPostProcessor定义要特别小心。这些方法通常应该声明为static@Bean方法,而不是触发其包含的配置类的实例化。如果自定义的BeanPostProcessor创建为早于AutowiredAnnotationBeanPostProcessor的bean实例,那么,@Autowired和@Value不适用于配置类本身,

以下示例说明如何将一个bean自动连接到另一个bean:

@Configurationpublic class ServiceConfig { @Autowired private AccountRepository accountRepository; @Bean public TransferService transferService() {  return new TransferServiceImpl(accountRepository); }}@Configurationpublic class RepositoryConfig { private final DataSource dataSource; public RepositoryConfig(DataSource dataSource) {  this.dataSource = dataSource; } @Bean public AccountRepository accountRepository() {  return new JdbcAccountRepository(dataSource); }}@Configuration@Import({ServiceConfig.class, RepositoryConfig.class})public class SystemTestConfig { @Bean public DataSource dataSource() {  // return new DataSource }}public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(SystemTestConfig.class); // everything wires up across configuration classes... TransferService transferService = ctx.getBean(TransferService.class); transferService.transfer(100.00, "A123", "C456");}
从springframework4.3开始,@Configuration类中的构造函数注入才受支持。还要注意,如果目标bean只定义了一个构造函数,则不需要指定@Autowired。
Fully-qualifying imported beans for ease of navigation

在前面的场景中,使用@Autowired可以很好地工作并提供所需的模块性,但是准确地确定注入的bean定义的声明位置仍然有些模糊。
例如,作为一个正在查看ServiceConfig的开发人员,您如何确切地知道@autowiredaccountrepository bean是在哪里声明的?
如果这种模糊性是不可接受的,并且您希望在IDE中从一个@Configuration类直接导航到另一个@Configuration类,可以考虑自动连接配置类本身。

下面的示例演示如何执行此操作:

@Configurationpublic class ServiceConfig { @Autowired private RepositoryConfig repositoryConfig; @Bean public TransferService transferService() {  // navigate 'through' the config class to the @Bean method!  return new TransferServiceImpl(repositoryConfig.accountRepository()); }}

在前面的情况下,AccountRepository的定义是完全显式的。
但是,ServiceConfig现在与RepositoryConfig紧密耦合。
这就是取舍。
通过使用基于接口或基于抽象类的@Configuration类,可以在一定程度上缓解这种紧耦合。
考虑以下示例:

@Configurationpublic class ServiceConfig { @Autowired private RepositoryConfig repositoryConfig; @Bean public TransferService transferService() {  return new TransferServiceImpl(repositoryConfig.accountRepository()); }}@Configurationpublic interface RepositoryConfig { @Bean AccountRepository accountRepository();}@Configurationpublic class DefaultRepositoryConfig implements RepositoryConfig { @Bean public AccountRepository accountRepository() {  return new JdbcAccountRepository(...); }}@Configuration@Import({ServiceConfig.class, DefaultRepositoryConfig.class}) // import the concrete config!public class SystemTestConfig { @Bean public DataSource dataSource() {  // return DataSource }}public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(SystemTestConfig.class); TransferService transferService = ctx.getBean(TransferService.class); transferService.transfer(100.00, "A123", "C456");}

现在ServiceConfig就具体而言已松散耦合DefaultRepositoryConfig
并且内置的IDE工具仍然有用:您可以轻松地获得实现的类型层次结构RepositoryConfig。
通过这种方式,导航@Configuration类及其依赖项与导航基于接口的代码的通常过程没有什么不同。

如果您想影响某些bean的启动创建顺序,可以考虑将其中一些bean声明为@Lazy(用于在首次访问时而不是在启动时创建)或@DependsOn某些其他bean(确保在当前bean之前创建特定的其他bean,而不是后者的直接依赖关系)。
最好是从例如,在使用Spring 在本节的后面,我们将介绍在这种"以

请记住,@Configuration类最终是容器中的bean定义。
在本系列示例中,我们创建一个@Configuration名为的类,AppConfig并将其包含在其中system-test-config.定义。
因为 context:annotation-config/已打开,所以容器会识别 @Configuration注解并 正确处理@Bean声明的方法AppConfig。

以下示例显示了Java中的普通配置类:

@Configurationpublic class AppConfig { @Autowired private DataSource dataSource; @Bean public AccountRepository accountRepository() {  return new JdbcAccountRepository(dataSource); } @Bean public TransferService transferService() {  return new TransferService(accountRepository()); }}

以下示例显示了示例system-test-config.

<beans> <context:annotation-config/>  <context:property-placeholder location="classpath:/com/acme/jdbc.properties"/> <bean /> <bean >  <property name="url" value="${jdbc.url}"/>  <property name="username" value="${jdbc.username}"/>  <property name="password" value="${jdbc.password}"/> </bean></beans>

以下示例显示了一个可能的jdbc.properties文件:

jdbc.url = jdbc:hsqldb:hsql:// localhost / xdbjdbc.username = sajdbc.password =
public static void main(String[] args) { ApplicationContext ctx = new ClassPath

因为@Configuration元注解是@Component,@Configuration注解的类会自动成为组件扫描的候选类。

使用与前一个例子中描述的相同场景,我们可以重新定义system-test-config.

注意,在这种情况下,我们不需要显式声明context:annotation-config/,因为context:component-scan/启用相同的功能。

以下示例显示了修改后的system-test-config.

<beans> <context:component-scan base-package="com.acme"/> <context:property-placeholder location="classpath:/com/acme/jdbc.properties"/> <bean >  <property name="url" value="${jdbc.url}"/>  <property name="username" value="${jdbc.username}"/>  <property name="password" value="${jdbc.password}"/> </bean></beans>
@Configuration@ImportResource("classpath:/com/acme/properties-config.

properties-config.

<beans> <context:property-placeholder location="classpath:/com/acme/jdbc.properties"/></beans>

jdbc.properties

jdbc.url = jdbc:hsqldb:hsql:// localhost / xdbjdbc.username = sajdbc.password = adsdfas
public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); TransferService transferService = ctx.getBean(TransferService.class); // ...}

本文由博客一文多发平台 OpenWrite 发布!

原文转载:http://www.shaoqun.com/a/485798.html

aeo:https://www.ikjzd.com/w/2356

三维度科技:https://www.ikjzd.com/w/1312

zen cart:https://www.ikjzd.com/w/1282


1.11。使用JSR330标准注解从Spring3.0开始,Spring提供了对JSR-330标准注解(依赖注入)的支持。这些注解的扫描方式与Spring注解相同。要使用它们,您需要在类路径中包含相关的jar。如果你使用Maven,javax。注入工件在标准Maven存储库中可用(https://repo1.maven.org/maven2/javax/inject/javax.inject/1/
自贸区跨境通网站:https://www.ikjzd.com/w/1329
敦煌网站:https://www.ikjzd.com/w/189
2020年深圳哪里有花市?:http://tour.shaoqun.com/a/1105.html
西岭雪山最佳滑雪时间 :http://tour.shaoqun.com/a/56287.html
速卖通2020招商新政:三次考核不过将清退!:https://www.ikjzd.com/home/111204

1024程序员节 我在自研数据库,我为技术代言

image.png

随着互联网的发展,"程序员"这个名字逐渐为人们所关注到,其所代表的标签印象也变得更加多样 —— 改变世界?Debug专业户?格子衫代言人?……事实上,有那么一群人,比如腾讯数据库工程师,他们将自己定义为"数字的工匠",初心如一地用代码创造产品、解决问题,为国产数据库发展助力。而对于我们来说,有他们的努力,数字世界也不再是虚无缥缈的数据,而像冰山盘亘在海面一样,深邃而沉稳。

在"1024"程序员节到来之际,我们推出本期特别分享,邀请腾讯6位数据库技术工程师,讲述了他们对代码技术的理解。

image.png

"我是腾讯云数据库技术负责人雷海林,2007年大学毕业加入腾讯,负责过计费、支付底层各大模块的开发,包括分布式Cache系统'Hold(厚德)'等,以及腾讯金融级安全可控分布式数据库研发。我在腾讯,为数据库国产化发展助力。"

image.png

"我是腾讯云数据库高级工程师赖铮,2018年加入腾讯,曾经在MySQL数据库官方团队工作,现在负责腾讯云数据库内核开发。我在腾讯,为数据库国产化发展助力。"

image.png

"我是腾讯IEG数据库专家工程师陈福荣,2011年加入腾讯,曾经做过Tendb Cluster和Tendis项目,现在腾讯IEGCROS团队负责腾讯游戏云存储开发。我在腾讯,为数据库国产化发展助力。"

image.png

"我是腾讯云数据库高级工程师陈再妮,2019年加入腾讯,从事数据多活、Oracle兼容、读写分离等项目开发。我在腾讯,为数据库国产化发展助力。"

image.png

"我是腾讯云数据库工程师张风啸,2019年加入腾讯,从事多源同步和数据校验模块的设计与开发。我在腾讯,为国产数据库发展助力。"

image.png

"我是腾讯云数据库高级工程师陈松威,2018年加入腾讯,从事云数据库内核研发,开发过的功能包括企业级列加密函数、数据恢复工具、异步审计,数据预热等。我在腾讯,为国产数据库发展助力。"

你为什么从事数据库底层研发

雷海林:

个人兴趣更喜欢与计算机打交道,通过code去解决问题;而一般来说,越是偏低层的系统软件,技术挑战也越大,而数据库领域在性能优化、高可用、扩展性、数据一致性等方面一直有无限的可能,技术上可以做各种尝试、各种创新探索,同时驱动更广泛的技术生态创新突破。

image.png

赖铮:

数据库系统作为基础的系统软件,是很多应用系统的核心。它涉及到的知识领域非常广泛,包括操作系统、事务系统、并发处理等等,可以说是软件领域的明珠、人类智慧的结晶。能从事这个领域的研发工作,会有一种使命感,同时,如果做出了一点点成绩,也会给自己带来巨大的满足感。尤其是在数据爆炸的时代,对于数据的存储和管理技术越来越成为计算机领域的关键性技术,能在这样快速变化的大潮中奋发搏击,也是一件幸事。

陈福荣:

应该说比较幸运,研究生阶段就是从事数据库方面的学习和研究,第一份工作是跟着导师做国产数据库,积累了一些经验,后来加入了腾讯游戏的DBA团队。所以,从学生到现在超过10年了,一直都是做数据库相关的开发工作。也很庆幸一直做着自己比较喜欢的工作。

陈再妮:

最早在业务系统的后台开发时,底层数据存储使用到了数据库,发现很多大段的业务逻辑代码,一条SQL就可以搞定,这使得我对数据库产生了浓厚的兴趣,开始进入这个领域。进入后发现数据库底层确实是复杂的东西,做起来特别有挑战,但一旦完成后也会让我产生更多的成就感,这也驱动了我一直从事下去。

张风啸:

才开始接触技术是写Java Web的,参与了校内小项目的开发,做了有一年多。在开始觉得只是用框架,不够深入有点无聊。后来通过社区接触了很多之前没接触的新技术,对一些基础组件的底层实现产生了比较浓厚的兴趣。后来进入腾讯实习期间,调研了解了一些新的DB技术,从而对数据库的兴趣更加浓烈。后来面试的时候也和面试官表达了想去做数据库的意愿,没想到真的遇上了。

陈松威:

数据库是三大系统软件之一,涉及到的模块众多,是非常有深度、值得探索的领域。能从事数据库底层研发,是一件非常荣幸的事情。特别是在我们团队,有多位在数据库内核领域深耕多年的技术大牛,他们总能知无不言言无不尽地帮助我,使我快速成长,这我更加坚信从事数据库内核研发的选择是正确的。

作为程序员,你做过觉得罪有成就感的三个业务或者事情是什么?

雷海林:

我觉得最有成就感的事情是技术上比较追求完美地做出一些组件或者产品,解决难以解决的BUG,或者性能上的每一次超越和升级:

a) 比如封装zkapi,能让大家用起来更方便,屏蔽很难处理的一些细节问题,实现一个基本无锁化的内存池组件,解决偶发的毛刺问题等等;
b) 比如花一个星期以上的时间,构造数十亿的请求去解决某个难以重现的数据一致性BUG;
c) 负责腾讯国产分布式数据库的研发,支撑各行业对分布式数据库的需求。

赖铮:

a)在InnoDB存储引擎中实现了透明加密功能;
b)在InnoDB存储引擎中实现了基于R树的空间索引;
c)通过优化热点更新大幅度提升了秒杀场景下的系统性能。

image.png

陈福荣:

作为程序员,最有成就感的事情应该就是做的一些核心功能或者优化,能够真正在业务上落地并且发挥作用。举三个例子:

第一个是在数据库上增加了在线加字段的能力。这应该是我个人加入腾讯做的第一个比较大的功能点,需要对Innodb底层存储格式进行优化,当时做的时候技术上挑战很大,但完成后,它对业务减少停服时间的收益也特别明显。当第一个Demo做出来并且在第一个业务(当年应该是斗战神)上线时,还是很有成就感的。

第二个是研发互娱的分布式解决方案TenDBCluster,解决了原来数据库无法水平扩展的问题,顺应了手游时代的爆发。大约在2015年,第一款业务从单机数据库切换到TenDB Cluster时,我跟另外一个同事一直坚守了凌晨两三点,最终业务顺利切换,虽然比较晚了,但心里还是感到非常兴奋。

第三个是TendisX冷热混合存储在腾讯云商业化,通过腾讯云对外开放。

image.png

陈再妮:

a)数据库多中心多活模块研发:保障企业数据库的高可用,为客户业务系统实现7×24小时不间断高效平稳运行发挥了重要作用;
b)Oracle兼容特性研发,助力Oracle兼容版本的数据库产品功能顺利上线,极大提升了腾讯云数据库助力行业技术国产化的优势;
c)完成腾讯自研分布式HTAP国产数据库开源。

张风啸:

a)一个是实现了数据库迁移中异构数据迁移和同步的数据校验模块,解决了据迁移中的一致性校验问题。
b)进一步完善了数据库异构多源同步的功能,提升了产品的易用性。
c)最关键的是大学期间教女孩子写计算机的大作业,最后变成了女朋友。

陈松威:

a)原创了业界唯一的数据恢复工具,能够从损坏的表文件中恢复用户数据,保障数据安全。
b)设计并实现了异步审计,将审计性能影响降至3%,在业界遥遥领先。
c)原创了数据库主从切换前,备机的数据预热功能。

你认为对程序员来说最重要的非技术因素是什么?

雷海林:

寻根问底的精神。比如程序出现了某个罕见的异常现象,那也一定是在代码层面出现了问题,我们要尽全力找到并解决它,不能因为它非常偶发而忽视。

赖铮:

保持好奇。

陈福荣:

第一,需要刨根问底的精神。对于一个技术问题,如果这个问题是自己的主要工作,或者是某个待解决问题的关键路径,必须把这些问题完全搞清楚,不能似懂非懂。对于底层技术而言,对更多底层问题的钻研,会发现这些问题的解决思路其实是类似的,渐渐会建立自己的方法论,因此不要轻易放过一个问题或者bug。

第二,对最终结果负责。不能仅仅满足于功能开发完成,这点特别重要。一个任务,一定不仅仅是希望这个功能跑起来,更多是希望真正能够解决业务问题和痛点。如果开发人员仅仅把自己定位成代码编写者,是不够的。

第三,可以有一点点代码洁癖,这样会让自己写出风格更好的代码。

陈再妮:

做事严谨,就像计算机的世界非0即1;态度认真负责,值得信赖。

image.png

张风啸:

我觉得是对感兴趣的事情的喜爱和追求。技术和其他方面都一样,一定是有兴趣、有追求,才能做得更好。

陈松威:

我觉得是,要有一种"空杯心态"。

厉害的程序员都有哪些特别的能力 ?

雷海林:

a)学习能力。个人很渺小,要不断地虚心学习,看书、看文章论文、多掌握原理性质的东西;
b)热爱阅读开源社区好的代码,通过学习别人的代码提升自己的编程能力;
c)对自己有信心,遇事不妥协,高标准要求自己,喜欢去解决工作领域各种技术上的挑战。

陈福荣:

第一是学习能力。开发这个领域新技术是层出不穷,如果不具备很好的学习能力,很容易会出现一些力不从心的状态。当然,如果有比较好的计算机基础理论的背景,学习起来是可以触类旁通的。

第二个是抗压能力。线上bug是不可避免的,如果出现线上故障压力一定是很大的。但此时最重要的是优先恢复业务,因此,一定要顶住压力,保持思路清晰,寻找最高效的解决办法。

第三个是心态调整能力。厉害的程序员都会表现出干劲十足,精神饱满,除了本身对工作的热爱外,还需要自己心态上的调整,以及适当的泄压方式包括锻炼身体等。

陈再妮:

a)极客精神:对未知技术保持好奇之心,并持续学习;
b)看待问题可以通过表象直到问题根源;
c)有趣的灵魂:代码注释写的让人如沐晨风,比如让模块运行起来:

/* Do the modulemagic dance */PG_MODULE_MAGIC;

赖铮:

思维缜密,逻辑性极强。

张风啸:

专注, 细致,心思缜密,思考全面;以及对问题刨根究底的态度,深入钻研。

陈松威:

逻辑性强、创造力强、思维严谨、良好的沟通能力。

对数据库未来发展趋势,有什么看法或建议

雷海林:

数据库必定还是会往分布式数据库的方向继续发展。整体来看,则将在数据库弹性扩展、跨地域进行分布调度、6个9(99.9999%)以上的可用性、HTAP融合、SQL智能诊断与优化、极致的性能等方向持续发展——最后回归数据库的本质:当某个业务获取到一个数据库的域名地址,数据库就是一个黑盒子以极致的性能提供SQL读写服务。不用再关心容量、SQL调优、容灾等细节。

赖铮:

数据库未来会操作面向云计算的方向发展,云原生数据库将会成为主流。弹性扩展、TP+AP、海量数据等特点将会充分显示出云原生数据库的优势。

陈福荣:

1)分布式。未来的数据库一定主要是使用分布式的架构,无论是share nothing还是share disk,都能较好解决数据库的容量问题,便于弹性扩缩容;

2)软硬结合。未来数据库一定会结合软硬一体化的设计理念,充分发挥硬件的性能,满足企业级用户的需求,如更快的响应时间、更高的安全性、更大的容量、更低的成本等;

3)智能化。未来的数据库会结合数据库的运行状态以及AI的能力,提升数据库管理的智能化水平,包括故障诊断、故障预测、自动扩缩容、更优的执行计划等。

陈再妮:

未来数据库一定会依据新型硬件做架构层面的改良,举个例子:传统数据库是基于存储不可靠以及存储性能差设计的(WAL、REDO、UNDO、DO、CHECKPOINT),是基于当前CPU运算速度设计的(32位事务ID,64位事务ID),但是好多理论随着硬件的快速发展会被彻底颠覆:比如基于云原生数据库(接近于基于存储可靠的设计),云原生内存数据库(数据全部存储于内存,主要解决网络问题 RDMA、DPDK、SPDK 等)、量子数据库等,这些基于新硬件新理论才是数据库的未来。

image.png

张风啸:

一方面是,当前业界关于数据库的架构、存储结构等很多方面的研究已经很多且比较完善了,而存储介质等硬件方面的变化,可能给会给存储的架构设计带来很大的变化,所以我们可以多关注新型存储产品的出现带来的一些变化。

另一方面是我很赞同的观点:性能不是唯一的肌肉,稳定性、产品化、运营体系等方面,才是当前国产数据库面对最突出的几个挑战。数据库要发展好,发展优秀的生态和做好产品化是至关重要的。

陈松威:

数据库未来趋势是云原生。在未来的产业互联网中,数据库的弹性扩展能力、自我诊断快速运维能力、个性化服务能力将非常重要。

image.png

推荐一段值得称道或简短代码片段?

雷海林:

Linux内核的list.h组件,实现简单,通用性好:

/* * Insert a new entry between two known consecutive entries. * * This is only for internal list manipulation where we know * the prev/next entries already! */#ifndef CONFIG_DEBUG_LISTstatic inline void __list_add(struct list_head *new,struct list_head *prev,struct list_head *next){ next->prev = new;new->next = next;new->prev = prev; prev->next = new;}#elseextern void __list_add(struct list_head *new,struct list_head *prev,struct list_head *next);