清朝云资源网

作者: 清朝云

  • Shell 批量下载随机图片


    共计 156 个字符,预计需要花费 1 分钟才能阅读完成。

    有时候想要下载别人随机图片,一个个保存非常麻烦,既然它是随机的图片,那么完全可以写个脚本进行保存,不过这种方式有可能存在相同文件。

    for i in {1..200}
    do
     wget https://www.dmoe.cc/random.php --no-check-certificate -O $i'.png'
    done

    结果如图:

    Shell 批量下载随机图片

    提醒:本文发布于461天前,文中所关联的信息可能已发生改变,请知悉!

    />

    Tips:清朝云网络工作室

  • WordPress 更改图片域名


    共计 385 个字符,预计需要花费 1 分钟才能阅读完成。

    有时候图床挂了,但是其他地方有备份站点时,可以通过如下方式进行修改图片地址。

    例如,将 www.qcyqq.com/img 修改为 www.qcyqq.com。

    // 更新图片链接
    function replace_image_urls($content) {
        $pattern = '/<img([^>]*)data-original=["\']https?:\/\/img\.amjun\.com(.*?)["\'](.*?)>/i';
        $replacement = '<img$1data-original="https://www.qcyqq.com$2"$3>';
        $content = preg_replace($pattern, $replacement, $content);
        return $content;
    }
    add_filter('the_content', 'replace_image_urls');

    提醒:本文发布于461天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • Docker 搭建图床兼文件床 EasyImage


    共计 468 个字符,预计需要花费 2 分钟才能阅读完成。

    一、简介

    EasyImage 是一款开源的图床,支持多文件上传,并且简单无数据库,返回图片 url 包括 markdown、bbscode、html 的格式。

    它虽然名为简单图床,但是功能却很强。它能够支持 API,且支持压缩、去水印、转换格式,还支持鉴黄,设置黑名单和自定义代码等等。

    二、安装

    搭建代码如下:

    docker run -d \
    --name easyimage \
    -p 80:80  \
    ddsderek/easyimage

    安装非常简单,部署好以后访问页面。进入如下页面,由于是 docker 安装,环境检测肯定是通过的,点击下一步即可。

    Docker 搭建图床兼文件床 EasyImage

    />

    设置管理员账户和密码,并设置图片链接域名,这个链接域名就是返回的链接所包含的域名。

    Docker 搭建图床兼文件床 EasyImage

    />

    三、配置和使用

    1. 图床

    下面的页面是后台设置页面,可以看见功能很多,具体相关设置就自行尝试了。

    Docker 搭建图床兼文件床 EasyImage

    />

    批量上传图片效果如下:

    Docker 搭建图床兼文件床 EasyImage

    />

    另外,统计界面如下,内容还是比较详细的。

    Docker 搭建图床兼文件床 EasyImage

    />

    2. 文件床

    虽然名为图床,但它可以关闭图床模式,也就可以上传任意文件,操作如下:

    Docker 搭建图床兼文件床 EasyImage

    />

    并且还需要在上传设置中,配置允许的后缀名,清朝云这里设置为星号,也就是允许任意后缀。

    Docker 搭建图床兼文件床 EasyImage

    />

    测试一下文件上传,效果如下:

    Docker 搭建图床兼文件床 EasyImage

    提醒:本文发布于461天前,文中所关联的信息可能已发生改变,请知悉!

    />

    Tips:清朝云网络工作室

  • 11月07日,星期四, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 郑钦文,创造历史! 北京时间11月6日,郑钦文在WTA年终总决赛展开小组赛最后一轮中成功晋级半决赛,实现职业生涯首次参加总决赛便闯进四强的佳绩。

    2. 苹果喊话iPhone13和14钉子户

    3. “人气聚起来、商气汇起来” 11月3日,中国国际消费中心城市精品消费月活动在上海启动,本次活动将采用“1+4+N”的形式,举办一系列消费主题活动。

    4. 特朗普宣布胜选

    5. 企业退休人员养老金提高到3162元 据社会保险法实施情况的报告介绍,2012年至2023年,企业退休人员月人均养老金由1686元提高到3162元。

    6. 以色列爆发大规模抗议

    7. 杨紫32岁生日发文

    8. 外交部对特朗普当选总统表示祝贺 11月6日,外交部发言人就美国总统选举结果答记者问:我们尊重美国人民的选择,对特朗普先生当选总统表示祝贺。

    9. 董宇辉就烧麦言论道歉 日前,董宇辉在直播时就此前称内蒙古的烧麦是“裂开的包子”一事道歉,董宇辉表示,自己没有恶意,主要还是因为自己见识短浅。

    10. 行贿者一次性送150瓶五粮液 11月5日,廉洁四川网站披露了安岳县柠都自来水公司原董事长肖剑的一系列贪腐行为。据悉,更有行贿者一次送了150瓶五粮液。

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 如果我有一个葫芦原本可以饮用 X 次,每次饮用葫芦有概率 p 不消耗次数,葫芦可以饮用次数的期望是多少?
    链接: https://daily.zhihu.com/story/9776656
    ———————-
    标题: 为什么线粒体 DNA 只能通过母亲传给孩子?
    链接: https://daily.zhihu.com/story/9776647
    ———————-
    标题: 金子为什么是金色,而不是普通金属的银色?
    链接: https://daily.zhihu.com/story/9776649
    ———————-
    标题: 瞎扯 · 如何正确地吐槽
    链接: https://daily.zhihu.com/story/9776659
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: 苹果 iOS 18.2 新特性:iPhone 充电剩余时间一目了然
    发布时间: 2024-11-06T08:21:02.55
    新闻简介: 科技媒体 9to5Mac 昨日(11 月 5 日)发布博文,报道称苹果公司计划在 iOS 18.2 系统中引入新的“BatteryIntelligence”框架,可预估 iPhone 充满电所耗时间。
    ———————-
    标题: 第三轮开抢:M4 版 Mac mini 补贴价 3565 元低过教育优惠
    发布时间: 2024-11-06T10:54:08.897
    新闻简介: 苹果 2024 款 Mac mini 搭载 M4 / M4 Pro 芯片,内存 16GB 起步,售价 4499 元起。
    京东叠加下方多重优惠后,实付仅需 3565.21 元起 + 限时白条 6 期免息。
    ———————-
    标题: 马斯克杀入《暗黑破坏神 4》深坑天梯榜 TOP20,游戏 ID 就是真名
    发布时间: 2024-11-06T09:31:16.843
    新闻简介: 马斯克昨天在参加 Joe Rogan 最新节目表示自己已经杀入《暗黑破坏神 4》深坑天梯榜 TOP20,而且 TOP20 中仅有两位美国玩家。
    ———————-
    标题: 纯血鸿蒙版微信开启邀请内测
    发布时间: 2024-11-06T20:21:04.313
    新闻简介: 腾讯 WXG(微信事业群)员工 @客村小蒋 今晚发文宣布,当前纯血鸿蒙版微信已经趋于稳定,后续将继续努力迭代,现在计划邀请已升级鸿蒙next的用户来参加鸿蒙微信新版本的内测,一起完善体验。
    ———————-
    标题: 消息称小米 Redmi K80 系列手机屏幕基材升级为 TCL 华星 C9,配备龙晶玻璃
    发布时间: 2024-11-06T13:57:29.383
    新闻简介: 博主 @差评帝 今日发文爆料,小米 Redmi K80 系列手机屏幕基材从 C8 升级到 C9(此处预计指 TCL 华星 C 系发光材料),显示效果提升、功耗降低。新机还将配备龙晶玻璃(非最新一代)。
    ———————-
    标题: 昆明多人反映“地图导航定位在滇池里”,高德回应称非产品问题、正多方排查沟通
    发布时间: 2024-11-06T19:31:33.367
    新闻简介: 据澎湃新闻报道,近期云南昆明多名网友在社交平台反映称,自己的定位存在“漂移”,位置显示“在滇池里”。
    ———————-
    标题: 小鹏宣布老用户芯片焕新众筹计划:单 Orin 升至双 Orin,座舱 820A 升级 8295
    发布时间: 2024-11-06T15:48:55.26
    新闻简介: 在今天的小鹏 AI 科技日活动中,小鹏汽车宣布将为用户提供众筹芯片升级方案,号称“相当于老车换新,Pro 升 Max”。
    ———————-
    标题: 重型舰载战斗机歼-15T 亮相珠海,人民海军战机首次出现在中国航展
    发布时间: 2024-11-06T12:35:39.617
    新闻简介: 刚刚,海军重型舰载战斗机歼-15T 落地珠海,它是航母编队的核心武器装备,是中国海军航空兵的重要力量。这也是人民海军首次出现在中国航展。
    ———————-
    标题: 英伟达 RTX 50 系列显卡即将登场,游戏体验再升级
    发布时间: 2024-11-06T09:24:53.85
    新闻简介: 消息源 Kopite7kimi 昨日(11 月 5 日)在 X 平台发布推文,曝料称英伟达“很快”发布 GeForce RTX 50 系列“Blackwell”游戏显卡。
    ———————-
    标题: 大众汽车在华外派员工高福利曝光:每月租房补贴 4000 欧元起,德国本土却减薪 10%
    发布时间: 2024-11-06T10:16:10.487
    新闻简介: 德国和欧洲发行量最大的日报《图片报》11 月 3 日曝光了大众汽车在华外派员工的高工资和高福利,这一消息迅速在德国本土引发轩然大波。
    ———————-
    标题: 郭明錤剖析英特尔 Lunar Lake 失败原因:制程落后,更在于产品规划能力
    发布时间: 2024-11-06T06:40:03.94
    新闻简介: 天风证券分析师郭明錤昨日(11 月 5 日)在 Medium 上发布博文,深入分析了英特尔 Lunar Lake 失败的前因后果。
    ———————-
    标题: 消息称某厂新机全系配备定制直屏 + 单点超声波指纹,预计为小米 Redmi K80 系列
    发布时间: 2024-11-06T11:51:40.817
    新闻简介: 博主 @数码闲聊站 今日发文爆料,某厂新机“全系旗舰款定制直屏 + 全系单点超声波指纹 + 全系高规格防尘防水 + 全系大底主摄 + 全系金属中框 + 前后抗摔玻璃结构 + 全系超大电池”,预计为小米 Redmi K80 系列。
    ———————-

    —- IT之家新闻 End —-

  • 11月07日,星期四, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 郑钦文,创造历史! 北京时间11月6日,郑钦文在WTA年终总决赛展开小组赛最后一轮中成功晋级半决赛,实现职业生涯首次参加总决赛便闯进四强的佳绩。

    2. 苹果喊话iPhone13和14钉子户

    3. “人气聚起来、商气汇起来” 11月3日,中国国际消费中心城市精品消费月活动在上海启动,本次活动将采用“1+4+N”的形式,举办一系列消费主题活动。

    4. 特朗普宣布胜选

    5. 企业退休人员养老金提高到3162元 据社会保险法实施情况的报告介绍,2012年至2023年,企业退休人员月人均养老金由1686元提高到3162元。

    6. 以色列爆发大规模抗议

    7. 杨紫32岁生日发文

    8. 外交部对特朗普当选总统表示祝贺 11月6日,外交部发言人就美国总统选举结果答记者问:我们尊重美国人民的选择,对特朗普先生当选总统表示祝贺。

    9. 董宇辉就烧麦言论道歉 日前,董宇辉在直播时就此前称内蒙古的烧麦是“裂开的包子”一事道歉,董宇辉表示,自己没有恶意,主要还是因为自己见识短浅。

    10. 行贿者一次性送150瓶五粮液 11月5日,廉洁四川网站披露了安岳县柠都自来水公司原董事长肖剑的一系列贪腐行为。据悉,更有行贿者一次送了150瓶五粮液。

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 如果我有一个葫芦原本可以饮用 X 次,每次饮用葫芦有概率 p 不消耗次数,葫芦可以饮用次数的期望是多少?
    链接: https://daily.zhihu.com/story/9776656
    ———————-
    标题: 为什么线粒体 DNA 只能通过母亲传给孩子?
    链接: https://daily.zhihu.com/story/9776647
    ———————-
    标题: 金子为什么是金色,而不是普通金属的银色?
    链接: https://daily.zhihu.com/story/9776649
    ———————-
    标题: 瞎扯 · 如何正确地吐槽
    链接: https://daily.zhihu.com/story/9776659
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: 苹果 iOS 18.2 新特性:iPhone 充电剩余时间一目了然
    发布时间: 2024-11-06T08:21:02.55
    新闻简介: 科技媒体 9to5Mac 昨日(11 月 5 日)发布博文,报道称苹果公司计划在 iOS 18.2 系统中引入新的“BatteryIntelligence”框架,可预估 iPhone 充满电所耗时间。
    ———————-
    标题: 第三轮开抢:M4 版 Mac mini 补贴价 3565 元低过教育优惠
    发布时间: 2024-11-06T10:54:08.897
    新闻简介: 苹果 2024 款 Mac mini 搭载 M4 / M4 Pro 芯片,内存 16GB 起步,售价 4499 元起。
    京东叠加下方多重优惠后,实付仅需 3565.21 元起 + 限时白条 6 期免息。
    ———————-
    标题: 马斯克杀入《暗黑破坏神 4》深坑天梯榜 TOP20,游戏 ID 就是真名
    发布时间: 2024-11-06T09:31:16.843
    新闻简介: 马斯克昨天在参加 Joe Rogan 最新节目表示自己已经杀入《暗黑破坏神 4》深坑天梯榜 TOP20,而且 TOP20 中仅有两位美国玩家。
    ———————-
    标题: 纯血鸿蒙版微信开启邀请内测
    发布时间: 2024-11-06T20:21:04.313
    新闻简介: 腾讯 WXG(微信事业群)员工 @客村小蒋 今晚发文宣布,当前纯血鸿蒙版微信已经趋于稳定,后续将继续努力迭代,现在计划邀请已升级鸿蒙next的用户来参加鸿蒙微信新版本的内测,一起完善体验。
    ———————-
    标题: 消息称小米 Redmi K80 系列手机屏幕基材升级为 TCL 华星 C9,配备龙晶玻璃
    发布时间: 2024-11-06T13:57:29.383
    新闻简介: 博主 @差评帝 今日发文爆料,小米 Redmi K80 系列手机屏幕基材从 C8 升级到 C9(此处预计指 TCL 华星 C 系发光材料),显示效果提升、功耗降低。新机还将配备龙晶玻璃(非最新一代)。
    ———————-
    标题: 昆明多人反映“地图导航定位在滇池里”,高德回应称非产品问题、正多方排查沟通
    发布时间: 2024-11-06T19:31:33.367
    新闻简介: 据澎湃新闻报道,近期云南昆明多名网友在社交平台反映称,自己的定位存在“漂移”,位置显示“在滇池里”。
    ———————-
    标题: 小鹏宣布老用户芯片焕新众筹计划:单 Orin 升至双 Orin,座舱 820A 升级 8295
    发布时间: 2024-11-06T15:48:55.26
    新闻简介: 在今天的小鹏 AI 科技日活动中,小鹏汽车宣布将为用户提供众筹芯片升级方案,号称“相当于老车换新,Pro 升 Max”。
    ———————-
    标题: 重型舰载战斗机歼-15T 亮相珠海,人民海军战机首次出现在中国航展
    发布时间: 2024-11-06T12:35:39.617
    新闻简介: 刚刚,海军重型舰载战斗机歼-15T 落地珠海,它是航母编队的核心武器装备,是中国海军航空兵的重要力量。这也是人民海军首次出现在中国航展。
    ———————-
    标题: 英伟达 RTX 50 系列显卡即将登场,游戏体验再升级
    发布时间: 2024-11-06T09:24:53.85
    新闻简介: 消息源 Kopite7kimi 昨日(11 月 5 日)在 X 平台发布推文,曝料称英伟达“很快”发布 GeForce RTX 50 系列“Blackwell”游戏显卡。
    ———————-
    标题: 大众汽车在华外派员工高福利曝光:每月租房补贴 4000 欧元起,德国本土却减薪 10%
    发布时间: 2024-11-06T10:16:10.487
    新闻简介: 德国和欧洲发行量最大的日报《图片报》11 月 3 日曝光了大众汽车在华外派员工的高工资和高福利,这一消息迅速在德国本土引发轩然大波。
    ———————-
    标题: 郭明錤剖析英特尔 Lunar Lake 失败原因:制程落后,更在于产品规划能力
    发布时间: 2024-11-06T06:40:03.94
    新闻简介: 天风证券分析师郭明錤昨日(11 月 5 日)在 Medium 上发布博文,深入分析了英特尔 Lunar Lake 失败的前因后果。
    ———————-
    标题: 消息称某厂新机全系配备定制直屏 + 单点超声波指纹,预计为小米 Redmi K80 系列
    发布时间: 2024-11-06T11:51:40.817
    新闻简介: 博主 @数码闲聊站 今日发文爆料,某厂新机“全系旗舰款定制直屏 + 全系单点超声波指纹 + 全系高规格防尘防水 + 全系大底主摄 + 全系金属中框 + 前后抗摔玻璃结构 + 全系超大电池”,预计为小米 Redmi K80 系列。
    ———————-

    —- IT之家新闻 End —-

  • 11月06日,星期三, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 瑞士卷当事人称非常后悔并抱歉 近日,一女子因吃瑞士卷遭丈夫责备,被网友怀疑是剧本,引发热议。当事人回应:非摆拍,当时夫妻俩正闹口角,占用公共资源很抱歉。

    2. 3款五代隐身战机齐聚中国 解读来了 第十五届中国国际航空航天博览会开幕在即,11月5日,空军在京组织新闻发布会介绍航展有关情况。

    3. 进博会七岁了 11月5日,第七届进博会在上海开幕。自2018年首次举办以来,进博会的规模不断扩大。迈入第七个年头,进博会再度启幕,又带来了新的期待与机遇。

    4. 男子将全裸女子扛出地铁 警方回应

    5. 马斯克:苹果若作恶特斯拉就造手机

    6. 美国超20个州开放总统大选投票站 当地时间11月5日,截至美国东部时间5日早上7时(北京时间20时),美国已有超过20个州开放2024年总统大选投票站。

    7. 3娃打闹家长先指挥后互殴 警方通报

    8. 羽绒服涨价了 竟与猪价有关 近日,不少消费者发现羽绒服涨了价。猪肉供应的恢复和周期性低谷影响,导致肉鸭和肉鹅出栏数持续减少。羽绒服成本上涨,因此涨价。

    9. 全球金融市场交易员通宵待命

    10. 郑州一老师称需要统计上报夜骑人数 5日,郑州某高校信科院的工作人员告诉媒体,“目前只是接到郑州市的要求把人数上报,后续(是否批评)暂不清楚。”

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 人类是被氦闪结束还是星系相撞结束?
    链接: https://daily.zhihu.com/story/9776608
    ———————-
    标题: 东周时期为什么很多人的称呼或名字中用到「桓」这个字?
    链接: https://daily.zhihu.com/story/9776603
    ———————-
    标题: 为什么「冀」的简称给了河北而不是给了山西?
    链接: https://daily.zhihu.com/story/9776611
    ———————-
    标题: 瞎扯 · 如何正确地吐槽
    链接: https://daily.zhihu.com/story/9776615
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: 高德地图推出行业首个骑行地图
    发布时间: 2024-11-05T10:48:07.647
    新闻简介: 在国家体育总局群众体育司指导下,国家体育总局自行车击剑运动管理中心、中国自行车运动协会联合高德地图,于 11 月 4 日共同推出业内首个中国骑行地图,同时公布了 2024 年中国骑行地图百余条精品路线,用户在高德地图上搜索“中国骑行地图”即可查看身边的精品骑行地图,一键骑行。
    ———————-
    标题: 纯血鸿蒙版微信将接入 HarmonyOS NEXT 系统 Call Kit 通话服务,支持便捷来电接听功能
    发布时间: 2024-11-05T17:28:55.09
    新闻简介: IT之家注意到,腾讯 WXG(微信事业群)员工 @客村小蒋 今日在微博评论区中回复了网友关于微信能否接入鸿蒙 Call Kit 的问题,他明确表示“会上”。
    ———————-
    标题: 小米 SU7 Ultra 量产版车型由于道路法规限制,前铲、尾翼部分设计较原型车做明显缩减
    发布时间: 2024-11-05T06:53:07.617
    新闻简介: 小米汽车昨晚继续发布答网友问(第八十一集),此次对于 SU7 Ultra 量产版车型和原型车之间的设计差异作出解答:SU7 Ultra 量产版车型由于道路法规限制,前铲、尾翼设计较原型车进行明显缩减。
    ———————-
    标题: 华为鸿蒙 HarmonyOS NEXT 系统开放三方 App 升级权益领取,6 选 2
    发布时间: 2024-11-05T07:17:59.483
    新闻简介: 华为 HarmonyOS NEXT 系统公测权益今日开放第三方 App 会员权益领取,包括哔哩哔哩、爱奇艺、优酷、芒果 TV、喜马拉雅和 WPS 三方 App 的会员季卡。
    ———————-
    标题: 小米智能家庭屏 Mini 发售:语音、触屏操控家居设备,首发价 249 元
    发布时间: 2024-11-05T10:19:49.05
    新闻简介: 该产品搭载小米澎湃 OS,支持语音、触控操作各种米家生态链产品,还可 OTA 升级小爱同学大模型、远程控车小米 SU7(IT之家注:2024 年 12 月下旬陆续升级)。
    ———————-
    标题: 红魔 10 Pro 系列手机首发搭载“悟空屏”:1.5K 真全面屏、屏占比 95.3%
    发布时间: 2024-11-05T11:36:14.793
    新闻简介: 红魔游戏手机官方今日发文宣布,旗下红魔 10 Pro 系列手机将首发搭载“悟空屏”,由红魔 x 京东方 BOE 联合打造,号称“全球首发 1.5K 真全面屏,95.3% 屏占比”。
    ———————-
    标题: 消息称米哈游将大幅“下云”,对某云大厂预算减半
    发布时间: 2024-11-05T16:36:48.723
    新闻简介: 消息称国内头部游戏公司米哈游据传正在大幅收缩用云量,其中对某家云大厂的预算近乎砍半,计划由原先的每年 10 亿左右,逐步降至不足 6 亿。(雷峰网)
    ———————-
    标题: 8999 元 → 6363 元:16G 苹果 M3 版 MacBook Air 再降价
    发布时间: 2024-11-05T16:35:46.213
    新闻简介: MacBook Air M3 版 16+256G 版售价 8999 元,今日除京东直降 1000 元外,部分地区支持叠加 8 折整补贴。
    ———————-
    标题: 消息称某厂新机将搭载骁龙 8 Gen3 处理器、支持 100W 快充,预计为一加 Ace 5 手机
    发布时间: 2024-11-05T10:27:41.897
    新闻简介: 博主 @数码闲聊站 今日发文爆料某厂新机配置,该机搭载高通骁龙 8 Gen3 处理器、配备 6xxxmAh 电池、支持 100W 快充。结合评论讨论和过往爆料来看,新机预计为一加 Ace 5。
    ———————-
    标题: 中国空军歼 35A 等新型装备首次公开亮相:第十五届中国航展 11 月 12 日开幕
    发布时间: 2024-11-05T09:23:15.087
    新闻简介: 空军在京组织新闻发布会介绍庆祝空军成立 75 周年以及参加第十五届中国航展有关信息。#歼35A将亮相中国航展##歼35A真的来了##歼35A图片发布##中国空军将同时装备两款隐身战机##红19地空导弹首次展出##空军运20将首次开放展示飞机货舱#
    ———————-
    标题: IT之家纯血鸿蒙 1.20 原生正式版上架:消息 / 私信系统、底栏背景高斯模糊、文章列表缩略图左右调节…
    发布时间: 2024-11-05T18:02:02.973
    新闻简介: 本次更新主要增加了消息 / 私信功能,以后之家的重要系统通知、小伙伴们被家友在评论区 @点名的消息……就都不会再错过啦。
    ———————-
    标题: 2025 款雷克萨斯 ES 实车曝光:外观、内饰全面升级
    发布时间: 2024-11-05T08:13:32.653
    新闻简介: 2025 款雷克萨斯 ES 说明书曝光后,国外科技媒体 Drive 今天(11 月 5 日)发布博文,分享了该车的实车照片。
    ———————-

    —- IT之家新闻 End —-

  • 11月06日,星期三, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 瑞士卷当事人称非常后悔并抱歉 近日,一女子因吃瑞士卷遭丈夫责备,被网友怀疑是剧本,引发热议。当事人回应:非摆拍,当时夫妻俩正闹口角,占用公共资源很抱歉。

    2. 3款五代隐身战机齐聚中国 解读来了 第十五届中国国际航空航天博览会开幕在即,11月5日,空军在京组织新闻发布会介绍航展有关情况。

    3. 进博会七岁了 11月5日,第七届进博会在上海开幕。自2018年首次举办以来,进博会的规模不断扩大。迈入第七个年头,进博会再度启幕,又带来了新的期待与机遇。

    4. 男子将全裸女子扛出地铁 警方回应

    5. 马斯克:苹果若作恶特斯拉就造手机

    6. 美国超20个州开放总统大选投票站 当地时间11月5日,截至美国东部时间5日早上7时(北京时间20时),美国已有超过20个州开放2024年总统大选投票站。

    7. 3娃打闹家长先指挥后互殴 警方通报

    8. 羽绒服涨价了 竟与猪价有关 近日,不少消费者发现羽绒服涨了价。猪肉供应的恢复和周期性低谷影响,导致肉鸭和肉鹅出栏数持续减少。羽绒服成本上涨,因此涨价。

    9. 全球金融市场交易员通宵待命

    10. 郑州一老师称需要统计上报夜骑人数 5日,郑州某高校信科院的工作人员告诉媒体,“目前只是接到郑州市的要求把人数上报,后续(是否批评)暂不清楚。”

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 人类是被氦闪结束还是星系相撞结束?
    链接: https://daily.zhihu.com/story/9776608
    ———————-
    标题: 东周时期为什么很多人的称呼或名字中用到「桓」这个字?
    链接: https://daily.zhihu.com/story/9776603
    ———————-
    标题: 为什么「冀」的简称给了河北而不是给了山西?
    链接: https://daily.zhihu.com/story/9776611
    ———————-
    标题: 瞎扯 · 如何正确地吐槽
    链接: https://daily.zhihu.com/story/9776615
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: 高德地图推出行业首个骑行地图
    发布时间: 2024-11-05T10:48:07.647
    新闻简介: 在国家体育总局群众体育司指导下,国家体育总局自行车击剑运动管理中心、中国自行车运动协会联合高德地图,于 11 月 4 日共同推出业内首个中国骑行地图,同时公布了 2024 年中国骑行地图百余条精品路线,用户在高德地图上搜索“中国骑行地图”即可查看身边的精品骑行地图,一键骑行。
    ———————-
    标题: 纯血鸿蒙版微信将接入 HarmonyOS NEXT 系统 Call Kit 通话服务,支持便捷来电接听功能
    发布时间: 2024-11-05T17:28:55.09
    新闻简介: IT之家注意到,腾讯 WXG(微信事业群)员工 @客村小蒋 今日在微博评论区中回复了网友关于微信能否接入鸿蒙 Call Kit 的问题,他明确表示“会上”。
    ———————-
    标题: 小米 SU7 Ultra 量产版车型由于道路法规限制,前铲、尾翼部分设计较原型车做明显缩减
    发布时间: 2024-11-05T06:53:07.617
    新闻简介: 小米汽车昨晚继续发布答网友问(第八十一集),此次对于 SU7 Ultra 量产版车型和原型车之间的设计差异作出解答:SU7 Ultra 量产版车型由于道路法规限制,前铲、尾翼设计较原型车进行明显缩减。
    ———————-
    标题: 华为鸿蒙 HarmonyOS NEXT 系统开放三方 App 升级权益领取,6 选 2
    发布时间: 2024-11-05T07:17:59.483
    新闻简介: 华为 HarmonyOS NEXT 系统公测权益今日开放第三方 App 会员权益领取,包括哔哩哔哩、爱奇艺、优酷、芒果 TV、喜马拉雅和 WPS 三方 App 的会员季卡。
    ———————-
    标题: 小米智能家庭屏 Mini 发售:语音、触屏操控家居设备,首发价 249 元
    发布时间: 2024-11-05T10:19:49.05
    新闻简介: 该产品搭载小米澎湃 OS,支持语音、触控操作各种米家生态链产品,还可 OTA 升级小爱同学大模型、远程控车小米 SU7(IT之家注:2024 年 12 月下旬陆续升级)。
    ———————-
    标题: 红魔 10 Pro 系列手机首发搭载“悟空屏”:1.5K 真全面屏、屏占比 95.3%
    发布时间: 2024-11-05T11:36:14.793
    新闻简介: 红魔游戏手机官方今日发文宣布,旗下红魔 10 Pro 系列手机将首发搭载“悟空屏”,由红魔 x 京东方 BOE 联合打造,号称“全球首发 1.5K 真全面屏,95.3% 屏占比”。
    ———————-
    标题: 消息称米哈游将大幅“下云”,对某云大厂预算减半
    发布时间: 2024-11-05T16:36:48.723
    新闻简介: 消息称国内头部游戏公司米哈游据传正在大幅收缩用云量,其中对某家云大厂的预算近乎砍半,计划由原先的每年 10 亿左右,逐步降至不足 6 亿。(雷峰网)
    ———————-
    标题: 8999 元 → 6363 元:16G 苹果 M3 版 MacBook Air 再降价
    发布时间: 2024-11-05T16:35:46.213
    新闻简介: MacBook Air M3 版 16+256G 版售价 8999 元,今日除京东直降 1000 元外,部分地区支持叠加 8 折整补贴。
    ———————-
    标题: 消息称某厂新机将搭载骁龙 8 Gen3 处理器、支持 100W 快充,预计为一加 Ace 5 手机
    发布时间: 2024-11-05T10:27:41.897
    新闻简介: 博主 @数码闲聊站 今日发文爆料某厂新机配置,该机搭载高通骁龙 8 Gen3 处理器、配备 6xxxmAh 电池、支持 100W 快充。结合评论讨论和过往爆料来看,新机预计为一加 Ace 5。
    ———————-
    标题: 中国空军歼 35A 等新型装备首次公开亮相:第十五届中国航展 11 月 12 日开幕
    发布时间: 2024-11-05T09:23:15.087
    新闻简介: 空军在京组织新闻发布会介绍庆祝空军成立 75 周年以及参加第十五届中国航展有关信息。#歼35A将亮相中国航展##歼35A真的来了##歼35A图片发布##中国空军将同时装备两款隐身战机##红19地空导弹首次展出##空军运20将首次开放展示飞机货舱#
    ———————-
    标题: IT之家纯血鸿蒙 1.20 原生正式版上架:消息 / 私信系统、底栏背景高斯模糊、文章列表缩略图左右调节…
    发布时间: 2024-11-05T18:02:02.973
    新闻简介: 本次更新主要增加了消息 / 私信功能,以后之家的重要系统通知、小伙伴们被家友在评论区 @点名的消息……就都不会再错过啦。
    ———————-
    标题: 2025 款雷克萨斯 ES 实车曝光:外观、内饰全面升级
    发布时间: 2024-11-05T08:13:32.653
    新闻简介: 2025 款雷克萨斯 ES 说明书曝光后,国外科技媒体 Drive 今天(11 月 5 日)发布博文,分享了该车的实车照片。
    ———————-

    —- IT之家新闻 End —-

  • 11月05日,星期二, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 郑钦文获WTA年终总决赛首胜 11月4日,郑钦文击败莱巴金娜获WTA年终总决赛小组赛首胜,这也是她在双方三次交锋中取得的首胜!

    2. 考研报名禁止使用海马体照片 近日,25年考研网上确认系统中,辽宁抚顺报考点禁止准考证中使用由“海马体照相馆”拍摄的照片。招考办:会影响考试及身份核验。

    3. “小文创”有“大新意” 近期,国家博物馆设计的凤冠冰箱贴持续热销,广受欢迎。这种文创冰箱贴以小巧之姿,承载厚重底蕴,是旅行记忆和情感寄托的载体。

    4. 缅甸小姐未夺冠当场翻脸

    5. 台湾附近海域冒出个“神秘玩意” 台军秘密推进一个名为“慧龙”的无人潜艇项目。该项目直到最近几个月才因在台湾附近海域进行测试而曝光。

    6. 厨房爆炸丈夫返回救妻子去世 日前,河南洛阳一对夫妻做早饭时厨房突然爆炸,丈夫跑出来后又折返救妻子,最终导致两人严重烧伤。最新消息显示,丈夫已不幸去世。

    7. 发型师晓华直播被半个理发界围观学艺

    8. 农村啃老现象抬头 记者发现,部分农村中青年人出现啃老现象。有的打工数年,仍须家里老人贴补;有的为了结婚成家,婚前婚后都让老人“大力支持”等。

    9. 航天员称仿佛坐在炼丹炉里回地球 11月4日,神舟十八号载人飞船返回舱在东风着陆场成功着陆,航天员们一句“仿佛坐在炼丹炉里回到地球”引发了广泛关注。

    10. 火车站员工睡过头致旅客被关门外 11月4日,网传常德火车站工作人员睡觉,导致旅客被关大门内无法出站,引发热议。常德火车站回应:涉事人员已被处理。

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 为什么在水草丰美的北美诸部落没有发展出像华夏一样的文明,但在山区的印加却发展出了庞大的文明帝国?
    链接: https://daily.zhihu.com/story/9776586
    ———————-
    标题: CPU 温度是越低越好吗?
    链接: https://daily.zhihu.com/story/9776581
    ———————-
    标题: 重机枪需要准星吗?
    链接: https://daily.zhihu.com/story/9776584
    ———————-
    标题: 瞎扯 · 如何正确地吐槽
    链接: https://daily.zhihu.com/story/9776594
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: 华为 Mate 70 将至!余承东宣布史上最强大的 Mate:11 月见
    发布时间: 2024-11-04T09:03:39.227
    新闻简介: 今年 4 月,华为副董事长、轮值董事长徐直军表示,公司努力的目标是期望在今年 Mate 70 系列手机开售时,能够带着“纯血鸿蒙”上市。
    ———————-
    标题: realme 真我 GT7 Pro 手机发布:骁龙 8 至尊版处理器、5000 万超光影潜望长焦,首发 3599 元起
    发布时间: 2024-11-04T15:18:44.6
    新闻简介: realme 真我 GT7 Pro 手机今日正式发布,该机搭载骁龙 8 至尊版处理器,配备等效 6500mAh 新硅电池,拥有星迹钛、光域白、火星探索版 3 种配色,售价 3699 元起,首发 3599 元起。
    ———————-
    标题: 腾讯 QQ 办公简洁版 TIM 开启安卓 / iOS 4.0 公测,升级 NT 架构
    发布时间: 2024-11-04T12:31:23.647
    新闻简介: 新版 TIM 界面变得更简洁、清爽,引入了深色模式,优化了红包发送和文件传输功能。
    ———————-
    标题: 小米 15 系列手机获推澎湃 HyperOS 2.0.16.0 升级:焦点通知动画支持打断、新增相册编辑画质修复等功能
    发布时间: 2024-11-04T08:19:47.387
    新闻简介: 小米 15 系列手机现获推澎湃 HyperOS 2.0.16.0 升级,系统升级包大小约 616MB。新版本焦点通知支持打断动画、同时新增相册编辑画质修复等功能。
    ———————-
    标题: 华为 HarmonyOS NEXT 系统纯血鸿蒙小艺助手获推 11.2.8.300 版本升级,声音修复功能上线
    发布时间: 2024-11-04T07:36:16.94
    新闻简介: 华为 HarmonyOS NEXT 纯血鸿蒙系统预装的小艺助手昨日(11 月 3 日)获推 11.2.8.300 版本升级,支持识屏问话、重要信息记忆等功能,同时声音修复功能上线。
    ———————-
    标题: 导演郭帆:《流浪地球 3》电影剧本推翻了 9 版,可能会更偏向写实、回归科学本身
    发布时间: 2024-11-04T14:28:15.137
    新闻简介: 《流浪地球》系列电影导演郭帆今日在成都参加腾讯科学 WE 大会,与《星际穿越》科学顾问基普・索恩对话时,回应被催更《流浪地球 3》。
    ———————-
    标题: 小米张国全:14 Ultra 机型稳定版系统已在测试中,若无问题本周发布
    发布时间: 2024-11-04T19:59:51.07
    新闻简介: 小米手机系统软件部总监张国全在微博评论区中针对用户“小米 14 Ultra 手机稳定版内测系统更新时间”的提问作出回复,称“14U Beta 版已发,稳定版内部已经在测试中,如果没啥问题,下周就发”。结合评论发布时间来看,预计本周发布。
    ———————-
    标题: 消息称某厂超大杯手机配备“50Mp 23mm f/1.6x”主摄、全新定制硬件模组,预计为小米 15 Ultra
    发布时间: 2024-11-04T09:19:50.467
    新闻简介: 博主 @数码闲聊站 今日发文透露,某厂 S8750 超大杯手机配备“50Mp 23mm f/1.6x”主摄,物理焦距大于前代的 8.7xmm,全新定制硬件模组。结合评论区讨论来看,新机预计为小米 15 Ultra。
    ———————-
    标题: 消息称华为本月新品含 MatePad Pro 13.2 柔光版平板、智界 S7 汽车
    发布时间: 2024-11-04T10:07:52.203
    新闻简介: 博主 @Adak封狼居胥 今日发文透露华为本月新品部分细节信息,包括:Mate 70 /Mate X6 系列手机、非凡大师 / WATCH D2 手表、Freebuds Pro 4 耳机、MatePad Pro 13.2 柔光平板,以及“配置不一样”的智界 S7 汽车。
    ———————-
    标题: 神舟十八号载人飞行任务圆满成功,乘组载誉归家
    发布时间: 2024-11-04T06:44:08.043
    新闻简介: 今日(11 月 4 日)1 时 24 分,神舟十八号载人飞船返回舱在东风着陆场成功着陆,现场医监医保人员确认航天员叶光富、李聪、李广苏身体状态良好,神舟十八号载人飞行任务取得圆满成功。#中国航天员按时回家了##神舟十八号返回舱成功着陆#
    ———————-
    标题: 任天堂 Switch 2 游戏机模型机曝光:直观展示 8 英寸屏幕及磁性 Joy-Con 手柄
    发布时间: 2024-11-04T17:09:34.067
    新闻简介: 博主 @BehindTGames 根据此前泄露的“疑似”任天堂 Switch 2 游戏机工程文件图制作了模型,并将这一模型与索尼 PS Portal 串流掌机、V社 Steam Deck 及现款 Switch OLED 进行比较。相应对比图直观展示了“Switch 2”配备的 8 英寸屏幕及磁性 Joy-Cons 控制器,整体尺寸要比现款 Switch OLED 大了不少。
    ———————-
    标题: 索尼 PS5 Pro 主机说明书曝光:GPU 算力 16.7 TFLOPS,额外 2GB DDR5 内存
    发布时间: 2024-11-04T10:10:41.197
    新闻简介: PS5 Pro 的 FP32 算力较原版提升约 62%,引入的 2GB DDR5 预计用于系统运行、SSD 缓存等方面。
    ———————-

    —- IT之家新闻 End —-

  • Spring 基于 xml 方式的 bean 的配置


    共计 10577 个字符,预计需要花费 27 分钟才能阅读完成。

    一、简介

    spring 可以通过读取 xml 配置文件的方式,生成 bean 实例对象。

    现有如下 beans.xml 配置文件和实体类与接口。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                               http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="userService" class="com.amjun.spring.service.impl.UserServiceImpl">
        </bean>
    </beans>

    UserService.java

    public interface UserService {
    
        void save();
    }

    UserServiceImpl.java

    package com.amjun.spring.service.impl;
    
    import com.amjun.spring.service.UserService;
    
    public class UserServiceImpl implements UserService {
    
         @Override
        public void save() {
    
        }
    }

    可以通过 BeanFactory 创建容器。

    public class BeanFactoryTest {
    
        public static void main(String[] args) {
            // 创建工程对象
            DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
            // 创建xml文件读取器
            XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
            // 读取配置文件给工厂
            reader.loadBeanDefinitions("beans.xml");
            // 去工厂获取实例
            UserService userService = (UserService)beanFactory.getBean("userService");
            System.out.println(userService);
        }
    }

    也可以通过 ApplicationContext 创建容器,但实际上 ApplicationContext 还是通过 BeanFactory 创建,并且他们创建实例的时机不通。

    ApplicationContext 在加载配置文件时创建 bean 对象放入容器,BeanFactory 在获取 bean 对象时才创建,并放入容器。

    public class BeanFactoryTest {
    
        public static void main(String[] args) {
    
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
            UserService userService = (UserService)applicationContext.getBean("userService");
            System.out.println(userService);
        }
    }

    二、xml配置文件详解

    Spring 开发中主要是对 Bean 的配置,Bean 的常用配置如下:

    Spring 基于 xml 方式的 bean 的配置

    />

    1. 基础配置

    这里的基础配置比较简单,这里只给出最终的 xml 文件和相关文件。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                               http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- 1. 可以配置 id 或者 别名,如果 id 和别名都不配置则可以通过全限定名进行获取对象
             2. 默认对象是单例模式 singleton,可设置为 prototype 多例模式(springmvc 情况下可以设置 request、session 域)
             3. lazy-init 配置懒加载,对于 beanfactory 无效,因为 beanfactory 是获取时才创建
             4. init-method 指定初始化方法,destroy-method 指定销毁方法 - 当容器显示关闭时执行
                除了指定 init-method,还可以通过实现 InitializingBean 接口的 afterPropertiesSet 方法实现初始化, 并在 init-method 之前执行
        -->
        <bean id="userService" name="alaisName,alaisName2" scope="singleton" lazy-init="false" init-method="init" destroy-method="destory"
              class="com.amjun.spring.service.impl.UserServiceImpl">
              <!--<constructor-arg name="name" value="abc"></constructor-arg>-->
            <property name="userMapper" ref="userMapper"></property>
        </bean>
    
        <bean id="userMapper" class="com.amjun.spring.mapper.impl.UserMapperImpl"></bean>
    </beans>

    UserService.java

    public interface UserService {
    
        void save();
    }

    UserServiceImpl.java

    public class UserServiceImpl implements UserService, InitializingBean {
    
        private String name;
    
        private UserMapper userMapper;
    
        public UserServiceImpl() {
            System.out.println("UserService实例化-无参构造");
        }
    
        public UserServiceImpl(String name) {
            System.out.println("UserService实例化-有参构造");
        }
    
        public void setUserMapper(UserMapper userMapper) {
            System.out.println("依赖注入userMapper");
            this.userMapper = userMapper;
        }
    
        public void init(){
            System.out.println("UserService初始化方法");
        }
    
        public void destory(){
            System.out.println("UserService销毁方法");
        }
    
        @Override
        public void save() {
            System.out.println("UserService 调用 userMapper 的 insert 方法");
            userMapper.insert();
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("执行afterPropertiesSet方法....");
        }
    }
    

    UserMapper.java

    public interface UserMapper {
    
        void insert();
    }

    UserMapperImpl.java

    public class UserMapperImpl implements UserMapper {
    
        public UserMapperImpl() {
            System.out.println("UserMapper实例化");
        }
    
        @Override
        public void insert() {
            System.out.println("用户信息入库");
        }
    }

    测试方法:

    public class BeanFactoryTest {
    
        public static void main(String[] args) {
    
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
            UserService userService = (UserService)applicationContext.getBean("userService");
            System.out.println(userService);
            userService.save();
            // 设置为多例模式每个对象都是新创建的
            UserService userService2 = (UserService)applicationContext.getBean("userService");
            System.out.println(userService2);
            applicationContext.close();
        }
    }

    2. 实例化bean的方式

    2.1 构造方法实例化

    默认就是使用无参构造方法进行实例化,如果需要有参构造方法实例化需要配置 constructor-arg 标签,且可以配置多个标签。

    <bean id="userService" class="com.amjun.spring.service.impl.UserServiceImpl">
        <constructor-arg name="name" value="abc"></constructor-arg>
    </bean>

    2.2 工厂方式实例化

    底层通过调用自定义的工厂方法对Bean进行实例化。

    • 静态工厂实例化
    public class MyBeanFactory1 {
    
        // 如果 userMapper 方法需要参数,同时配置 constructor-arg 即可
        public static UserMapper userMapper(){
            return new UserMapperImpl();
        }
    }

    xml 文件。

    <bean id="userMapper1" class="com.amjun.spring.factory.MyBeanFactory1" factory-method="userMapper"></bean>

    测试方法:

    public class BeanFactoryTest {
    
        public static void main(String[] args) {
    
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
            UserMapper userMapper1 = (UserMapper)applicationContext.getBean("userMapper1");
            System.out.println(userMapper1);
        }
    }

    静态工厂可以不创建工厂实例,通过静态方法创建对象。

    Spring 基于 xml 方式的 bean 的配置

    />

    原理是 spring 解析配置文件时发现,需要生成的不是 MyBeanFactory1 对象,而是 userMapper 方法返回的对象。

    好处:

    1. bean 创建前后可以进行一些其他操作
    2. 可以通过这种方式创建非自定义的 bean 交给 spring 进行管理(通过静态方法创建的bean)
    • 实例工厂实例化
    public class MyBeanFactory2 {
    
        // 如果 userMapper 方法需要参数,同时配置 constructor-arg 即可
        public UserMapper userMapper(){
            return new UserMapperImpl();
        }
    }

    xml 文件。

    <bean id="myBeanFactory2" class="com.amjun.spring.factory.MyBeanFactory2"></bean>
    
    <bean id="userMapper2" factory-bean="myBeanFactory2" factory-method="userMapper"></bean>

    测试方法:

    public class BeanFactoryTest {
    
        public static void main(String[] args) {
    
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
            UserMapper userMapper2 = (UserMapper)applicationContext.getBean("userMapper2");
            System.out.println(userMapper2);
        }
    }

    可以看见先创建了工厂实例,再通过工厂方法创建实例。

    Spring 基于 xml 方式的 bean 的配置

    />

    好处:

    1. bean 创建前后可以进行一些其他操作
    2. 可以通过这种方式创建非自定义的 bean 交给 spring 进行管理(通过实例对象创建的bean)
    • 实现FactoryBean规范延迟实例化Bean

    FactoryBean 是工厂 Bean, 注意和 BeanFactory 区分开。

    FactoryBean 是一个接口。

    public interface FactoryBean<T> {
        String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
    
        @Nullable
        T getObject() throws Exception;
    
        @Nullable
        Class<?> getObjectType();
    
        default boolean isSingleton() {
            return true;
        }
    }

    创建一个 MyBeanFactory3 实现 FactoryBean。

    public class MyBeanFactory3 implements FactoryBean<UserMapper> {
    
        @Override
        public UserMapper getObject() throws Exception {
            return new UserMapperImpl();
        }
    
        @Override
        public Class<?> getObjectType() {
            return UserMapper.class;
        }
    }

    xml 文件。

    <bean id="userMapper3" class="com.amjun.spring.factory.MyBeanFactory3"></bean>

    测试方法:

    public class BeanFactoryTest {
    
        public static void main(String[] args) {
    
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
            UserMapper userMapper3 = (UserMapper)applicationContext.getBean("userMapper3");
            System.out.println(userMapper3);
        }
    }

    为什么叫延迟实例化bean?

    当加载配置文件时,可以看见并没有创建 UserMapper 实例,而是创建了工厂 Bean,并且此时 factoryBeanObjectCache 里面没有任何东西。

    Spring 基于 xml 方式的 bean 的配置

    />

    当去容器里面获取实例时,FactoryBean 才调用 getObject 方法进行实例化 bean,并将实例放入 factoryBeanObjectCache 中。

    Spring 基于 xml 方式的 bean 的配置

    />

    3. bean的依赖注入

    3.1 手动装配

    bean 的依赖注入有两种方式。

    Spring 基于 xml 方式的 bean 的配置

    />

    依赖注入的数据类型有如下三种

    • 普通数据类型,例如:String、int、boolean 等,通过 value 属性指定
    • 引用数据类型,例如:UserDaolmpl、DataSource 等,通过 ref 属性指定
    • 集合数据类型,例如:List、Map、Properties等

    前面两种数据类型比较常见,这里说下 list 数据类型的注入,配置 set 将 list 标签替换为 set 即可。

    现 UserServiceImpl.java 如下:

    public class UserServiceImpl implements UserService {
    
        private List<String> stringList;
    
        private List<UserMapper> userMapperList;
    
        private Map<String, UserMapper> map;
    
        private Properties properties;
    
        public void setStringList(List<String> stringList) {
            this.stringList = stringList;
        }
    
        public void setUserMapperList(List<UserMapper> userMapperList) {
            this.userMapperList = userMapperList;
        }
    
        public void setMap(Map<String, UserMapper> map) {
            this.map = map;
        }
    
        public void setProperties(Properties properties) {
            this.properties = properties;
        }
    }

    则 xml 配置如下:

    <bean id="userService" class="com.amjun.spring.service.impl.UserServiceImpl">
        <property name="stringList">
            <list>
                <value>aaa</value>
                <value>bbb</value>
            </list>
        </property>
         <property name="userMapperList">
            <list>
                <!--  方式一 -->
                <!-- <bean class="com.amjun.spring.mapper.impl.UserMapperImpl"></bean>
                <bean class="com.amjun.spring.mapper.impl.UserMapperImpl"></bean>
                <bean class="com.amjun.spring.mapper.impl.UserMapperImpl"></bean>-->
                <!-- 方式二 -->
                <ref bean="userMapper1"></ref>
                <ref bean="userMapper2"></ref>
                <ref bean="userMapper3"></ref>
            </list>
        </property>
        <property name="map">
            <map>
                <entry key="d1" value-ref="userMapper1"></entry>
                <entry key="d2" value-ref="userMapper2"></entry>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="p1">ppp1</prop>
                <prop key="p2">ppp2</prop>
            </props>
        </property>
    </bean>
    
    <bean id="userMapper1" class="com.amjun.spring.mapper.impl.UserMapperImpl"></bean>
    <bean id="userMapper2" class="com.amjun.spring.mapper.impl.UserMapperImpl"></bean>
    <bean id="userMapper3" class="com.amjun.spring.mapper.impl.UserMapperImpl"></bean>

    3.2 自动装配

    如果被注入的属性类型是Bean引用的话,那么可以在<bean>标签中使用autowire属性去配置自动注入方式,属性值有两个:

    • byName:通过属性名自动装配,即去匹配 setXxx 与 id=“xxx”(name=“xxx”)是否一致
    • byType:通过 Bean 的类型从容器中匹配,匹配出多个相同 Bean 类型时,报错
    <!-- 需要 UserServiceImpl 有 setUserMapper 方法, 有此方法时,自动去容器里面寻找 id 为 userMapper 的对象进行自动装配-->
    <bean id="userService" class="com.amjun.spring.service.impl.UserServiceImpl" autowire="byName">
    </bean>
    
    <!-- 不管 UserMapperImpl 的 id 为任何值都可以自动装配,但是存在多个时报错-->
    <bean id="userService2" class="com.amjun.spring.service.impl.UserServiceImpl" autowire="byType">
    </bean>
    
    <bean id="userMapper" class="com.amjun.spring.mapper.impl.UserMapperImpl"></bean>

    4. spring的其他配置标签

    Spring的xml标签大体上分为两类,一种是默认标签,一种是自定义标签

    • 默认标签:就是不用额外导入其他命名空间约束的标签,例如 <bean>标签

    • 自定义标签:就是需要额外引入其他命名空间约束,并通过前缀引用的标签,例如<context:property-placeholder/>标签

    例如引入 context 命名空间,使用它里面的标签需要添加前缀。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:property-placeholder></context:property-placeholder>
    </beans>

    默认标签如下:

    Spring 基于 xml 方式的 bean 的配置

    />

    需要注意的是,<beans>标签可以嵌套。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                               http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- 默认环境 -->
        <bean id="userService" class="com.amjun.spring.service.impl.UserServiceImpl"></bean>
    
        <!-- 开发环境 -->
        <beans profile="dev">
            <bean id="userService1" class="com.amjun.spring.service.impl.UserServiceImpl"></bean>
        </beans>
    
        <!-- 测试环境 -->
        <beans profile="test">
            <bean id="userService2" class="com.amjun.spring.service.impl.UserServiceImpl"></bean>
        </beans>
    </beans>

    可以使用以下两种方式指定被激活的环境:

    • 使用命令行动态参数,虚拟机参数位置加载 -Dspring.profiles.active=test
    • 使用代码的方式设置环境变量 System.setProperty(“spring.profiles.active”,”test”)·

    当激活 test 环境时,可以在 environment 对象中看见。

    Spring 基于 xml 方式的 bean 的配置

    />

    即使指定激活了 test 环境,还是可以获取到 id 为 userService 的实例,因为它是公共的。

    当配置文件很多时,可以通过主配置文件引入其他配置文件。

    <!-- 引入数据库配置文件-->
    <importresource="classpath:dataSource.xml"></import>
    <!-- 引入springmvc配置文件-->
    <importresource="classpath:springMvc.xml"></import>

    提醒:本文发布于424天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • Spring 实例化 Bean 对象的基本流程


    共计 10181 个字符,预计需要花费 26 分钟才能阅读完成。

    一、 实例化基本流程

    基本流程图如下:

    Spring 实例化 Bean 对象的基本流程

    />

    Spring 容器在进行初始化时,会将 xml 配置的 <bean> 的信息封装成一个 BeanDefinition 对象,所有的 BeanDefinition 存储到一个名为 beanDefinitionMap 的 Map 集合中。

    Spring 实例化 Bean 对象的基本流程

    />

    Spring 框架再对该 beanDefinitionMap 进行遍历,使用反射创建 Bean 实例对象,创建好的 Bean 对象存储在一个名为 singletonObjects 的 Map 集合中。

    Spring 实例化 Bean 对象的基本流程

    />

    当调用 getBean 方法时则最终从该 singletonObjects 集合中取出 Bean 实例对象返回。

    二、 spring后处理器

    Spring 的后处理器是 Spring 对外开发的重要扩展点,允许许我们介入到 Bean 的整个实例化流程中来,以达到动态注册 BeanDefinition,动态修改 BeanDefinition,以及动态修改 Bean的作用。Spring 主要有两种后处理器:

    • BeanFactoryPostProcessor:Bean工厂后处理器,在 BeanDefinitionMap 填充完毕,Bean 实例化之前执行
    • BeanPostProcessor:Bean后处理器,一般在 Bean 实例化之后,填充到单例池 singletonObjects 之前执行。

    1 BeanFactoryPostProcessor

    1.1 基本使用

    BeanFactoryPostProcessor 是一个接口规范,实现了该接口的类只要交由 Spring 容器管理的话,那么 Spring 就会回调该接口的方法,用于对 BeanDefinition 注册和修改的功能。

    @FunctionalInterface
    public interface BeanFactoryPostProcessor {
        void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException;
    }

    此时流程图如下:

    Spring 实例化 Bean 对象的基本流程

    />

    现有如下 BeanFactoryPostProcessor 实现类:

    MyBeanFactoryPostProcessor.java

    public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            System.out.println("MyBeanFactoryPostProcessor 的 postProcessBeanFactory 方法");
            // 修改 BeanDefinition
            BeanDefinition beanDefinition = beanFactory.getBeanDefinition("userService");
            beanDefinition.setBeanClassName("com.amjun.spring.mapper.impl.UserMapperImpl");
    
            // 最好实现 BeanDefinitionRegistryPostProcessor 接口来实现
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
            rootBeanDefinition.setBeanClassName("com.amjun.spring2.service.impl.PersonServiceImpl");
            // beanFactory 实际上是 DefaultListableBeanFactory, 是 ConfigurableListableBeanFactory 的子类
            DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory;
            defaultListableBeanFactory.registerBeanDefinition("personService", rootBeanDefinition);
        }
    }

    MyBeanFactoryPostProcessor2.java

    // 专门用于注册 BeanDefinition
    public class MyBeanFactoryPostProcessor2 implements BeanDefinitionRegistryPostProcessor {
    
        // 先执行该方法
        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
            System.out.println("MyBeanFactoryPostProcessor2 的 postProcessBeanDefinitionRegistry 方法");
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
            rootBeanDefinition.setBeanClassName("com.amjun.spring2.service.impl.PersonServiceImpl");
            beanDefinitionRegistry.registerBeanDefinition("personService2", rootBeanDefinition);
        }
    
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
            System.out.println("MyBeanFactoryPostProcessor2 的 postProcessBeanFactory 方法");
        }
    }

    xml 配置文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                               http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="userService" class="com.amjun.spring.service.impl.UserServiceImpl">
    
        </bean>
    
        <bean id="userMapper" class="com.amjun.spring.mapper.impl.UserMapperImpl">
        </bean>
    
        <bean id="myBeanFactoryPostProcessor" class="com.amjun.spring2.processor.MyBeanFactoryPostProcessor"></bean>
    
        <bean id="myBeanFactoryPostProcessor2" class="com.amjun.spring2.processor.MyBeanFactoryPostProcessor2"></bean>
    </beans>

    测试代码:

    public class ApplicationContextTest {
    
        public static void main(String[] args) throws SQLException, IOException {
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans2.xml");
            /*Object userService = applicationContext.getBean("userService");
            System.out.println(userService);*/
    
            /*Object personService = applicationContext.getBean("personService");
            System.out.println(personService);*/
    
            Object personService2 = applicationContext.getBean("personService2");
            System.out.println(personService2);
        }
    }

    1.2 案例-实现自动扫描

    Spring 实例化 Bean 对象的基本流程

    />

    注解类:MyComponent.java

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyComponent {
    
        String value();
    }

    待扫描的对象 OtherBean.java。

    @MyComponent("otherBean")
    public class OtherBean {
    }

    MyComponentBeanFactoryPostProcessor.java

    public class MyComponentBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
    
        }
    
        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
            // 通过扫描工具去扫描指定包及其子包下的所有类,收集使用@Mycomponent的注解的类
            Map<String, Class> stringClassMap = BaseClassScanUtils.scanMyComponentAnnotation("com.amjun.spring2");
            // 遍历 Map,组装BeanDefinition进行注册
            stringClassMap.forEach((beanName, clazz) -> {
                String beanClassName = clazz.getName(); // com.amjun.spring2.beans.OtherBean
                BeanDefinition beanDefinition = new RootBeanDefinition();
                beanDefinition.setBeanClassName(beanClassName);
                beanDefinitionRegistry.registerBeanDefinition(beanName, beanDefinition);
            });
        }
    }

    xml 配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                               http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="myComponentBeanFactoryPostProcessor" class="com.amjun.spring2.processor.MyComponentBeanFactoryPostProcessor"></bean>
    </beans>

    测试方法:

    public class ApplicationContextTest {
    
        public static void main(String[] args) throws SQLException, IOException {
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans2.xml");
    
            Object otherBean = applicationContext.getBean("otherBean");
            System.out.println(otherBean);
        }
    }

    2 BeanPostProcessor

    Bean 被实例化后,到最终缓存到名为 singletonObjects 单例池之前,中间会经过 Bean 的初始化过程,例如:属性的填充、初始方法 init 的执行等,其中有一个对外进行扩展的点 BeanPostProcessor,我们称为 Bean 后处理。跟上面的 Bean 工厂后处理器相似,它也是一个接口,实现了该接口并被容器管理的 BeanPostProcessor,会在流程节点上被 Spring 自动调用。

    此时的流程图如下:

    Spring 实例化 Bean 对象的基本流程

    />

    2.1 基本使用

    BeanPostProcessor 源码如下,实现该接口可以实现两个方法,但不是必须的。

    public interface BeanPostProcessor {
        @Nullable
        default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    
        @Nullable
        default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    }

    2.2 相关方法执行顺序

    现有如下对象 UserServiceImpl.java:

    public class UserServiceImpl implements UserService, InitializingBean {
    
        private String name;
    
        private UserMapper userMapper;
    
        public UserServiceImpl() {
            System.out.println("UserService实例化-无参构造");
        }
    
        public UserServiceImpl(String name) {
            System.out.println("UserService实例化-有参构造");
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setUserMapper(UserMapper userMapper) {
            System.out.println("依赖注入userMapper");
            this.userMapper = userMapper;
        }
    
        public void init(){
            System.out.println("执行初始化 init 方法");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("属性设置之后执行初始化 afterPropertiesSet 方法");
        }
    
        @Override
        public void show() {
            System.out.println("show....");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    则执行方法的顺序如下:

    Spring 实例化 Bean 对象的基本流程

    />

    2.3 案例-实现日志增强

    UserServiceImpl.java 同上,UserService.java 如下:

    public interface UserService {
    
        void show();
    }

    必须定义一个接口,因为动态代理中生成的代理对象类型是根据目标对象实现的接口来确定的,不能直接强转为对象。

    TimeLogBeanPostProcessor.java

    public class TimeLogBeanPostProcessor implements BeanPostProcessor {
    
        @Nullable
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            // 使用动态代理对目标Bean进行增强,返回proxy对象
            Object beanProxy = Proxy.newProxyInstance(
                    bean.getClass().getClassLoader(),
                    bean.getClass().getInterfaces(),
                    ((proxy, method, args) -> {
                        // 1. 输出开始时间
                        System.out.println("方法:" + method.getName() + "开始时间:" + new Date());
                        // 2. 执行目标方法
                        Object result = method.invoke(bean, args);
                        // 3. 输出结束时间
                        System.out.println("方法:" + method.getName() + "结束时间:" + new Date());
                        return result;
                    })
            );
            return beanProxy;
        }
    }

    xml 文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                               http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="userService" class="com.amjun.spring2.service.impl.UserServiceImpl" init-method="init">
    
        </bean>
    
        <bean id="userMapper" class="com.amjun.spring2.mapper.impl.UserMapperImpl">
        </bean>
    
        <!-- 测试 BeanPostProcessor -->
        <bean id="myBeanPostProcessor" class="com.amjun.spring2.processor.MyBeanPostProcessor"></bean>
    
        <bean id="timeLogBeanPostProcessor" class="com.amjun.spring2.processor.TimeLogBeanPostProcessor"></bean>
    </beans>

    测试:

    public class ApplicationContextTest {
    
        public static void main(String[] args) throws SQLException, IOException {
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans2.xml");
    
            UserService userService = (UserService)applicationContext.getBean("userService");
            userService.show();
    
        }
    }

    结果如下:

    Spring 实例化 Bean 对象的基本流程

    />

    三、完整流程图

    Spring 实例化 Bean 对象的基本流程

    />

    此流程图基于上诉流程图演变,且 bean 初始化阶段除了 Aware 接口方法回调基本都接触过。

    这里简单了解一下 Aware 接口, 它允许 Bean 在被 Spring 容器创建时获取对容器或其他相关对象的引用,以便进行进一步的自定义操作或获取特定的资源。

    以下是几个常见的Aware接口及其作用:

    • ApplicationContextAware:实现该接口的Bean可以获取对ApplicationContext的引用,从而可以在运行时访问Spring容器的功能和资源。

    • BeanFactoryAware:实现该接口的Bean可以获取对BeanFactory的引用,以便在需要时访问BeanFactory的功能。

    • BeanNameAware:实现该接口的Bean可以获取其在Spring容器中注册的名称。

    • EnvironmentAware:实现该接口的Bean可以获取对Environment的引用,以便在运行时获取配置属性和环境变量。

    • ResourceLoaderAware:实现该接口的Bean可以获取对ResourceLoader的引用,以便在运行时加载外部资源。

    举个例子。

    public class UserServiceImpl implements UserService, ApplicationContextAware, BeanFactoryAware, BeanNameAware {
    
        private String name;
        private UserMapper userMapper;
    
        public UserServiceImpl() {
            //System.out.println("UserService实例化");
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setUserMapper(UserMapper userMapper) {
            //System.out.println("userService注入userMapper");
            this.userMapper = userMapper;
        }
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            System.out.println("创建userService的BeanFactory: " + beanFactory);
        }
    
        @Override
        public void setBeanName(String beanName) {
            System.out.println("userService的beanName: " + beanName);
        }
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            System.out.println("创建userService的ApplicationContext: " + applicationContext);
        }
    }

    ApplicationContextTest.java

    public class ApplicationContextTest {
    
        public static void main(String[] args) throws SQLException, IOException {
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans3.xml");
            UserServiceImpl userService = applicationContext.getBean("userService", UserServiceImpl.class);
            System.out.println(userService);
        }
    }

    结果如下:

    Spring 实例化 Bean 对象的基本流程

    />

    打印的这些内容都是创建对象之前无法获取的,因为 beanName 是在 xml 配置文件中指定的,ApplicationContext 获取到的 ClassPathXmlApplicationContext 也是在测试时创建的。

    提醒:本文发布于423天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室