首页 文章 精选 留言 我的

精选列表

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

简单的设计模式不会还有人不会吧!

前言 掌握设计模式的层次 刚开始学编程不久,听说过什么是设计模式 由很长时间的编程经验,自己写了很多代码,其中用到了设计模式,但是自己却不知道 学习过了设计模式,发现自己已经在使用了,并且发现了一些新的模式挺好用的 阅读了很多别人写的源码和框架,在其中看到别人设计模式,并且能够领会设计模式的精妙和带来的好处。 代码写着写着,字节都没有意识到使用了设计模式,并且熟练的写了出来。 设计模式介绍 设计模式是程序员再面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是 某类问题的通用解决方案,设计模式(Design pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的时间的试验和错误总结出来的。 设计模式的本质提高软件的维护性,通用性和扩展性,并降低软件的复杂度。 设计模式分为三种类型,共23种 创建型模式:单例模式,抽象工厂模式,原型模式,建造者模式,工程模式。 结构型模式:适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式 行为型模式:模块方法模式,命令模式,访问者模式,迭代模式,观察者模式,中介者模式,备忘录模式,解释器模式(Interpreter模式),状态模式,策略模式,职责链模式(责任链模式) 注意:不同的书籍上对分类和名称略有差别。 单例模式 单例模式介绍 ​ 所谓类的单例设计模式,就是采取一定的方法保证再整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供了一个取得对象实例的方法(静态方法)。 ​ 比如Hibernate的SessionFactory,他充当数据存储源的代理,并负责创建Session对象。SessionFactory并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactoury就够,这是就会用到单例模式。 单例设计模式有八种写法 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全,同步代码块) 双重检查 静态内部类 枚举 饿汉式(静态常量) 步骤如下: 构造器私有化(防止 new) 类的内部创建对象 向外暴露一个静态的公共方法。gentInstance 代码实现 public class SingletonTest1 { public static void main(String[] args) { //测试 Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance == instance1);//true System.out.println("instance.hashCode=" + instance.hashCode());//1163157884 System.out.println("instance1.hashCode=" + instance1.hashCode());//1163157884 } } //饿汉式(静态变量) class Singleton { //1. 私有化构造器,外部不能能new private Singleton() {} //2. 在本类内部创建对象实例 private final static Singleton instance = new Singleton(); //3. 提供一个共有的静态方法,返回实例对象 public static Singleton getInstance() { return instance; } } 优缺点说明 优点;这种写法比较简单,就是再类装载的时候就完成实例化。避免了线程同步问题。 缺点;再类装载的时候就完成实例化,没有达到Lazy Loading(懒加载)的效果。如果从始至终从未使用这个实例,则会造成内存的浪费。 这种方法基于classloder机制避免了多线程的同步问题,不过,instance再类装载时就实例化,再单例模式种大多数都是调用getInstance方法,但是导致类装载的原因有很多种,因此不能确定其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance就没有达到lazy loading的效果 结论;这种单例模式可用,可能造成内存浪费。 饿汉式(静态代码块) 代码 public class SingletonTest2 { public static void main(String[] args) { //测试 Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance == instance1);//true System.out.println("instance.hashCode=" + instance.hashCode());//1163157884 System.out.println("instance1.hashCode=" + instance1.hashCode());//1163157884 } } //饿汉式(静态变量) class Singleton { //1. 私有化构造器,外部不能能new private Singleton() { } //2. 在本类内部创建对象实例 private static Singleton instance; //在静态代码块中,创建对象 static { instance = new Singleton(); } //3. 提供一个共有的静态方法,返回实例对象 public static Singleton getInstance() { return instance; } } 优缺点说明 这种方式和上面的方式其实类似,只不过将类实例的过程放在了静态代码块中,也是再类装载的时候,就执行静态代码块中的代码,初始化类的实例。优缺点和上面是一样的。 结论;这种单例模式可用,但是可能造成内存浪费。 懒汉式(线程不安全) 代码 public class SingletonTest03 { public static void main(String[] args) { //测试 System.out.println("懒汉式1,线程不安全"); Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance == instance1);//true System.out.println("instance.hashCode=" + instance.hashCode());//1163157884 System.out.println("instance1.hashCode=" + instance1.hashCode());//1163157884 } } class Singleton { private static Singleton instance; public Singleton() { } //提供一个静态的共有方法,当使用该方法时,才去创建instance //即懒汉式 public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 优点说明 起到Lazy Loading的效果,但是只能再单线程下使用。 如果再多线程下,一个线程进入if(singlenton == null) 判断语句块,还未来得及往下执行,另一个线程也通过这个判断语句,这是便会差生多个实例。所以再多线程环境下不可使用这种方式。 结论:再实际开发中,不要使用这种方式。 懒汉式(线程安全,同步方法) 代码 class Singleton{ private static Singleton singlenton; private Singleton(){} //加入了同步代码,解决线程不安全问题 public static synchronized Singlenton getInstance(){ if(singleton==null){ singleton=new Singleton(); } return singleton; } } 优缺点说明 解决了线程不安全的问题 效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行同步。而其实这个方式执行一次实例化代码就够了,后面的想获得该类实例直接return就行了。方法进行同步效率太低 结论;在实际开发中,不推荐使用这种方式。 懒汉式(线程安全,同步代码块) 代码 class Singleton{ private static Singleton singleton; private Singleton(){} public static Singleton getInstance(){ if(singleton==null){ //同代码块 synchronized (Singleton.class){ singleton=new Singleton(); } return singleton; } } } 优缺点说明 这种方式,本意是相对四种方法的改进,因为前面同步方法效率太低,改为同步生产实例的代码块。 <font color="red">但是这种同步并不能起到线程同步的作用</font>。跟第三种实现方式遇到的情形一致,加入一个线程进入了if(singleton==null)判断语句块,还未来得及往下执行,另外一个线程也通过了这个判断语句,这时便会产生多个实例。 结论:在实际开发中,不能使用这种方式。 双重检查 代码演示 class Singleton{ //volatile把它认为是一个轻量级的synchronized private static volatile Singleton singleton; private Singleton(){} public static Singleton getInstance(){ if(singleton==null){ //保证只有一个线程在这里执行,当下一个线程进来的时候, //上一个线程已经创建完了singleton已经不等于null了,就不会创建了 //提供一个静态的共有方法,加入双重检查代码,解决线程安全问题,同时解决懒加载问题 //同时保证了效率,推荐使用 synchronized(Singleton.class){ if(singleton==null){ singleton=new Singleton(); } } } return singleton; } } 优缺点说明 Double-“Check概念是多线程开发中常使用的,如果代码中所示,我们进行了两次if(singleton==null)检查,这样就可以保证线程安全了。 这样,实例化代码只用执行一次,后面再次访问时,判断if(singleton==null),直接return实例化对象,也避免的反复进行方法同步。 线程安全;延迟加载;效率较高 结论;在实际开发中,推荐使用这种单例设计模式。 静态内部类 代码演示 //当外部类装载的时候静态内部类不会被装载的 //当我们调用静态方法时静态内部类的时候只会装载一次,而且装载的时候线程是安全的。 public class SingletonTest07 { public static void main(String[] args) { Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance == instance1);//true System.out.println("instance.hashCode=" + instance.hashCode());//instance1.hashCode=1163157884 System.out.println("instance1.hashCode=" + instance1.hashCode());//instance1.hashCode=1163157884 } } //静态内部类完成,推荐使用 class Singleton { //构造器私有化 private Singleton() { } //写静态内部类,该类有一个静态属性 private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } //提供一个静态的共有方法,直接返回SingletonInstance.INSTANCE public static Singleton getInstance() { return SingletonInstance.INSTANCE; } } 优缺点说明 这种方式采用了类装载的机制来保证初始化实例时只有一个线程。 静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时调用getInstance方法,才会装载Singleton Instance类,从而完成Singleton的实例化。 类的静态属性只会加载类的时候初始化,所以在这里,jvm帮助我们保证了线程的安全性,再类进行初始化时,别的线程是无法进入的。 优点;避免了线程不安全,利用静态内部类特点实现延迟加载,效率高 结论;推荐使用。 枚举 代码实例 public class SingletonTest8 { public static void main(String[] args) { Singleton instance = Singleton.INSTANCE; Singleton instance2 = Singleton.INSTANCE; System.out.println(instance == instance2);//true System.out.println(instance.hashCode());//1163157884 System.out.println(instance2.hashCode());//1163157884 instance.sayOK(); } } //使用枚举可以实现单例,推荐使用 enum Singleton { INSTANCE; public void sayOK() { System.out.println("ok~");} } 优缺点说明 这借助jdk1.5中添加的枚举来实现单例模式。不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。 这种方式式Effective java作者 josh bloch 提倡的方式 结论;推荐使用 单例模式在jdk应用的源码分析 单例模式在jdk应用的源码分析 我们jdk中 java.lang.Runtime 就是经典的单例模式 代码分析+Ddbug源码+代码说明 //单例设计模式的懒汉式 public class Runtime { private static Runtime currentRuntime = new Runtime(); public static Runtime getRuntime() { return currentRuntime; } private Runtime() {} 单例模式注意事项和细节说明 单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能 当想实例一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new 单例模式使用的场景:需要频繁的进行创建和销毁的对象,创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象,工具类对象,频繁访问数据库或文件的对象(比如数据源,session工程等)

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

MATA,2020年危险的多平台恶意软件框架

卡巴斯基的安全研究人员近日发现了一个名为“MATA”的活跃多平台恶意软件框架,该框架功能非常全面,支持Windows、Linux和MacOS等多个主流平台,拥有多个组件,例如加载程序、编排器和插件,全球企业都在其攻击“射程”范围内。 在官方博客上,卡巴斯基实验室(Kaspersky Lab)透露已经与威胁情报门户(Threat Intelligence Portal)的客户共享了MATA的研究信息,主要内容如下: 与MATA有关的第一批工件出现在2018年4月。然后,恶意软件框架的幕后行为者积极地渗透包括波兰、德国、土耳其、韩国、日本和印度在内的全球范围的企业实体。已经发现的受害者中有一家软件公司、一家电子商务企业和一家互联网服务提供商(ISP)。 通过对已知攻击的分析,研究者弄清楚了该恶意软件框架的目的。例如,在一个组织中,恶意行为者使用该框架查询受害者的数据库,以获取客户列表。攻击者还利用MATA分发了VHD勒索软件。 MATA三个版本(Windows、Linux和MacOS)的主要信息如下: 1. Windows 版本 Windows 版本 MATA的组件 来源:卡巴斯基实验室 MATA的Windows版本由几个组件组成,其中包括装载程序恶意软件和编排器元素。装在程序使用硬编码的十六进制字符串调用加密的有效负载。此操作为协调器加载插件文件并在内存中执行它们铺平了道路。这些插件使攻击者能够篡改文件,创建HTTP代理服务器并执行其他任务。 (1) 加载器 该加载器采用一个硬编码的十六进制字符串,将其转换为二进制并对其进行AES解密,以获得有效负载文件的路径。每个加载程序都有一个硬编码的路径来加载加密的有效负载。然后,将有效负载文件进行AES解密并加载。 从一个受感染的受害者那发现的加载程序恶意软件中,研究人员发现执行加载程序恶意软件的父进程是“C:\Windows\System32\wbem\WmiPrvSE.exe”进程。WmiPrvSE.exe进程是“WMI Provider Host进程”,通常意味着参与者已从远程主机执行了该加载程序恶意软件,以进行横向移动。因此,攻击者很可能是使用此加载程序来破坏同一网络中的其他主机。 (2) Orchestrator编排器和插件 研究者在受害者计算机上的lsass.exe进程中发现了Orchestrator编排器恶意软件。该编排器恶意软件从注册表项加载加密的配置数据,并使用AES算法对其解密。除非注册表值存在,否则恶意软件会使用硬编码的配置数据。以下是来自一个编排器恶意软件样本的配置值示例: 编排器可以同时加载15个插件。有三种加载方式: 从指定的HTTP或HTTPS服务器下载插件 从指定的磁盘路径加载AES加密的插件文件 从当前的MataNet连接下载插件文件 2. 非Windows版本 MATA框架不仅针对Windows系统,而且针对Linux和macOS系统。Linux版本的MATA在合法的发行站点上可用,而macOS变体作为木马两步验证(2FA)应用程序提供。 (1) Linux版本 研究者发现了一个包含不同MATA文件和一套黑客工具的软件包。可以在合法的分发站点上找到该软件包,这可能表明这是分发恶意软件的方式。它包括Windows MATA编排器,用于列出文件夹的Linux工具,用于利用Atlassian Confluence Server(CVE-2019-3396)的脚本,合法的socat工具以及与一组插件捆绑在一起的MATA Orchestrator的Linux版本。中国安全厂商360的网络安全研究院发布过有关该恶意软件的详细博客(https://blog.netlab.360.com/dacls-the-dual-platform-rat-en/)。 (2) MacOS版本 研究人员还在2020年4月8日发现了一个上传到VirusTotal的攻击macOS的MATA恶意软件余本。恶意苹果硬盘镜像文件是一个基于开源双因子认证应用MinaOTP的木马化macOS应用。 木马化 macOS 应用 来源:卡巴斯基实验室 与其他跨平台恶意软件类似,macOS MATA恶意软件也以插件形式运行。插件列表与Linux版本几乎完全相同,但MacOS版本增加了一个名为“plugin_socks”的插件,该插件与“plugin_reverse_p2p” 类似,负责配置代理服务器。 (3) 幕后黑手 MATA的受害者地理分布 来源:卡巴斯基实验室 在研究报告中,卡巴斯基实验室将MATA恶意软件平台归因于著名的APT组织Lazarus: 我们评估了MATA框架与LazarusAPT组织之间的联系。MATA协调器使用两个唯一的文件名c_2910.cls和k_3872.cls,这些文件名以前仅在几种Manuscrypt变体中才能看到,包括在US-CERT出版物中提到的样本(0137f688436c468d43b3e50878ec1a1f)。 研究人员指出,由Lazarus发行的恶意软件家族Manuscrypt的变体与MATA共享了类似的配置结构。这意味着MATA与Lazarus很可能存在直接关联。卡巴斯基实验室表示,随着MATA恶意软件平台的发展,它将继续对其进行监控。 失陷指标 文件哈希(恶意文档、木马、电子邮件、诱饵) (1) Windows加载器 f364b46d8aafff67271d350b8271505a 85dcea03016df4880cebee9a70de0c02 1060702fe4e670eda8c0433c5966feee 7b068dfbea310962361abf4723332b3a 8e665562b9e187585a3f32923cc1f889 6cd06403f36ad20a3492060c9dc14d80 71d8b4c4411f7ffa89919a3251e6e5cb a7bda9b5c579254114fab05ec751918c e58cfbc6e0602681ff1841afadad4cc6 7e4e49d74b59cc9cc1471e33e50475d3 a93d1d5c2cb9c728fda3a5beaf0a0ffc 455997E42E20C8256A494FA5556F7333 7ead1fbba01a76467d63c4a216cf2902 7d80175ea344b1c849ead7ca5a82ac94 bf2765175d6fce7069cdb164603bd7dc b5d85cfaece7da5ed20d8eb2c9fa477c 6145fa69a6e42a0bf6a8f7c12005636b 2b8ff2a971555390b37f75cb07ae84bd 1e175231206cd7f80de4f6d86399c079 65632998063ff116417b04b65fdebdfb ab2a98d3564c6bf656b8347681ecc2be e3dee2d65512b99a362a1dbf6726ba9c fea3a39f97c00a6c8a589ff48bcc5a8c 2cd1f7f17153880fd80eba65b827d344 582b9801698c0c1614dbbae73c409efb a64b3278cc8f8b75e3c86b6a1faa6686 ca250f3c7a3098964a89d879333ac7c8 ed5458de272171feee479c355ab4a9f3 f0e87707fd0462162e1aecb6b4a53a89 f1ca9c730c8b5169fe095d385bac77e7 f50a0cd229b7bf57fcbd67ccfa8a5147 (2) Windows MATA bea49839390e4f1eb3cb38d0fcaf897erdata.dat 8910bdaaa6d3d40e9f60523d3a34f914 sdata.dat 6a066cf853fe51e3398ef773d016a4a8 228998f29864603fd4966cadd0be77fc (3) 注册表路径 HKLM\Software\Microsoft\KxtNet HKLM\Software\Microsoft\HlqNet HKLM\Software\mthjk (4) Linux MATA 859e7e9a11b37d355955f85b9a305fecmdata.dat 80c0efb9e129f7f9b05a783df6959812ldata.dat,mdata.dat d2f94e178c254669fb9656d5513356d2mdata.dat (5) Linux日志收集器 982bf527b9fe16205fea606d1beed7fahdata.dat (6) 开源Linux SoCat e883bf5fd22eb6237eb84d80bbcf2ac9sdata.dat (7) 利用Atlassian Confluence Server的脚本 a99b7ef095f44cf35453465c64f0c70ccheck.vm,r.vm 199b4c116ac14964e9646b2f27595156r.vm (8) macOS MATA 81f8f0526740b55fe484c42126cd8396TinkaOTP.dmg f05437d510287448325bac98a1378de1SubMenu.nib C2服务器地址 104.232.71.7:443 107.172.197.175:443 108.170.31.81:443 111.90.146.105:443 111.90.148.132:443 172.81.132.41:443 172.93.184.62:443 172.93.201.219:443 185.62.58.207:443 192.210.239.122:443 198.180.198.6:443 209.90.234.34:443 216.244.71.233:443 23.227.199.53:443 23.227.199.69:443 23.254.119.12:443 67.43.239.146:443 68.168.123.86:443 【本文是51CTO专栏作者“安全牛”的原创文章,转载请通过安全牛(微信公众号id:gooann-sectv)获取授权】 戳这里,看该作者更多好文 【责任编辑:赵宁宁TEL:(010)68476606】

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

Gartner报告:阿里云与AWS并列,容器产品完善

近日,国际知名调研机构 Gartner 发布 2020 年容器公有云竞争格局报告,阿里云再度成为国内唯一入选厂商。Gartner 报告显示,阿里云容器服务在中国市场表现强劲,产品形态丰富,在如 Serverless 容器、服务网格、安全沙箱容器、混合云和边缘等领域,具备良好的技术发展策略。 2020 年 3 月,Gartner 第二次公开《竞争格局:公共云容器服务》年度调研报告,报告针对 Serverless Kubernetes、服务网格、容器镜像等十项功能维度进行对比,阿里云和 AWS 覆盖九项产品能力,产品丰富度领先 Google、微软、IBM 和 Oracle 四家厂商。 阿里云连续两年入选 Gartner 容器报告,一方面是因为阿里云拥有全球第三的市场份额,另一方面是因为其已经拥有近十年的容器技术储备。 目前,阿里云容器

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

PYPL 4 月排行:Python 流行,Java 还行不行?

PYPL 发布了4 月份的编程语言排行榜。 前五的分别是:Python、Java、Javascript、C# 和 PHP。可以看到,榜单没有什么大变化,但是相比去年 4 月份,Python 市场份额在今年上涨了 5.2%,成绩颇为亮眼。 此外,Python 的采用率在过去 5 年中也增长最多,达到 17.1%,而久坐第一把交椅的 Java 则在 5 年丢失了不少份额,以 -6.2% 的数据垫底。 PYPL 是非常流行的参考指标,其榜单数据的排名均是根据榜单对象在 Google 上相关的搜索频率进行统计排名,原始数据来自 Google Trends,也就是说某项语言或者某款 IDE 在 Google 上搜索频率越高,表示它越受欢迎。开发者可以将 PYPL 作为一个参考,决定学习何种语言或 IDE,或者在新的软件项目中使用何种语言或数据库。 具体榜单查看:http://pypl.github.io/PYPL.html

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

AI加持的mPaaS如何打造“懂用户”的App

摘要:阿里云峰会于2019年3月21日北京如期举办,蚂蚁金服产品服务化技术专家付海涛在《金融专场》分会场做了主题为《新一代移动研发平台mPaaS智能化之路》的精彩分享。 付海涛蚂蚁金服产品服务化技术专家 本次的分享主要围绕以下内容展开: 移动开发平台 mPaaS 发展历程 移动开发平台 mPaaS 3.0 的产品体系 阿里巴巴金融业务的进化 mPaaS 一体化移动智能场景 一、移动开发平台 mPaaS 的发展历程 2016 年 12 月,mPaaS 发布了1.0版本正式对外,1.0 主要是想要延续支付宝的金融属性,服务金融行业。因为我们相信作为同一类别的公司,支付宝已经做过金融行业都要走的路,相应的经验都可以被复制的。当时mPaaS团队跟很多金融机构做了深入沟通,我们发现大部分机构已经研发了自有 App,但难点并不在于 App 研发,而是

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

【机器学习调查】脏数据棘手,逻辑回归最常用

数据科学社区Kaggle的最新调查显示,机器学习和数据科学研究者在被问到工作中面临的最大障碍时,最常见的回答是“脏数据”,其次是缺乏该领域的人才。此外,他们最常用的方法是“逻辑回归”,而神经网络只排在第4位。 想象一下机器学习研究者的生活,你可能会觉得很令人向往。你会给自动驾驶汽车编程,在科技界的巨头公司工作,而你编写的软件甚至可能导致人类的灭亡。太酷了!但是,正如最近一项针对数据科学家和机器学习研究者的调查所显示的,这些期待需要调整,因为这些职业面临的最大的挑战是一些相当平常的事情:清洗脏数据。 这是来自数据科学社区Kaggle(今年早些时候被谷歌收购)的一项调查。该网站130万会员中,约有16700人回答了问卷调查,当被问及工作中面临的最大障碍时,最常见的回答是“脏数据”(dirty data),其次是缺乏该领域的人才。 “工作中遇

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

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应用均可从中受益。

用户登录
用户注册