前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从一个互联网职场小白到一个沪漂湿人,一路让我知道分享是一件多么重要的事情,总之不对的地方,多多指出,我们一起徜徉代码的海洋!
我这里做每个章节去说的前提,不是一定很标准的套用一些官方名词,目的是为了让大家可以理解更加清楚,如果形容的不恰当,可以留言出来,万分感激
1、EJB存在的一些问题?
什么是EJB,我们给EJB下个简单的定义:
EJB:Enterprise Java Bean,叫做企业级的java豆子,实际上可以理解为一种组件体系结构,只不过用个Bean来统称罢了(不要纠结)
EJB是用于开发和部署多层结构的、分布式的、面向对象的Java应用系统的跨平台的构件体系结构。
EJB开发的过程中会有很多缺点,比如:
1)运行环境很苛刻,像以前的weblogic(oracle),websphere(ibm)之类的一些web容器,每个容器有特定的规则,一定要满足它的规则才可以开发
2)代码移植性差,比如我写了一套代码,或者假如一个servlet实现在weblogic叫做WebLogicServlet,而在websphere叫做WebSphereServlet,这样我代码也要改,对于开发来说,太重了!!
总结下:EJB为重量级框架
2、Spring出来之前人们怎么开发的?
上面说EJB是在框架层面上属于重量级别的框架,缺点可以看见,但是对于开发来说,EJB也并没有将我们平时所说的代码耦合给解决掉!
那什么是代码的耦合呢,会有哪些场景出现耦合?以及我们最简单解决耦合的一种软件设计思想是什么呢?
我之前发布了两篇博客,希望读者要抽时间看看,里面废话不多
链接一:为什么工厂模式可以解耦?(一)
链接二:为什么工厂模式可以解耦?(二)
3、什么是Spring?
我们给个定义:Spring是⼀个轻量级的JavaEE解决⽅案,整合众多优秀的设计模式
体现几点点:
轻量级
开源:对于运⾏环境是没有额外要求的开源tomcat resion jetty
不收费:weblogic,websphere收费,而spring是免费
代码移植性高
- 不需要实现额外的一套接口
解决方案
我们引入了三层的解决方案,spring很好的做了整合和兼容,注意一点,spring不是某一层的解决方案,比如对于控制层,spring有struts,springmvc等
对于service层,spring将其留出给开发人员自己实现
对于dao数据访问层,spring可以整合成hibernate,mybatis,jpa等等,
所以spring是一种解决方案,是一种可以很好的兼容市面上软件架构的设计方案
整合设计模式
- 工厂设计模式
- 代理设计模式
- 模板设计模式
- 策略设计模式
- .....
4、什么是设计模式(简单版)?
- 广义概念:面向对象设计中,解决特定问题的经典代码
- 狭义概念:GOF4⼈帮定义的23种设计模式:工厂、适配器、装饰器、门面、代理、模板...
5、工厂设计模式
5.1、什么是工厂设计模式
- 概念:通过工厂类创建对象:
- User user = BeanFatory.getBean("user");
- UserDao userDao = BeanFatory.getBean("userDao");
- 好处:解耦合
- 耦合:指定代码之间的强关联关系,一方的改变会影响到另一方
- 问题:不利于代码的维护
- 简单:将接口实现类或者对象的创建不要通过硬编码在代码中,如:UserDao userDao = new UserDaoImpl(); 这个代码就是耦合
5.2、简单工厂的设计
/** * 定义一个bean工厂,专门生产普通对象 */ public class BeanFactory { private static Properties properties = new Properties(); //1.加载配置文件 static { InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties"); try { properties.load(resourceAsStream); resourceAsStream.close(); } catch (IOException e) { e.printStackTrace(); } } public static UserDao getBean(String key){ // 2.使用key获得value String className = properties.getProperty(key); // 3.使用value利用反射技术创建对象 try{ return (UserDao) Class.forName(className).newInstance(); }catch(Exception e){ e.printStackTrace(); return null; } } }
5.3、通用工厂的设计
简单工厂中,每次有一个新的对象,我们就需要手动的加一个对应的getBean方法,可重用性大大降低,所以改造下:
/** * 定义一个bean工厂,专门生产普通对象 */ public class BeanFactory { private static Properties properties = new Properties(); //1.加载配置文件 static { InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties"); try { properties.load(resourceAsStream); resourceAsStream.close(); } catch (IOException e) { e.printStackTrace(); } } // 来个对象就要在工厂创建一个 // public static UserDao getMysqlBean() { // return new UserDaoMysqlImpl(); // } // // public static UserDao getOracleBean() { // return new UserDaoOracleImpl(); // } // 来个对象就要在工厂创建一个,冗余代码太多 // public static UserDao getBean(String key){ // // 2.使用key获得value // String className = properties.getProperty(key); // // 3.使用value利用反射技术创建对象 // try{ // return (UserDao) Class.forName(className).newInstance(); // }catch(Exception e){ // e.printStackTrace(); // return null; // } // } /** * 通用工厂方法,不必要一个新来对象就要创建一个getBean * @param key * @return */ public static Object getBean(String key){ Object ret = null; String className = properties.getProperty(key); // 3.使用value利用反射技术创建对象 try{ ret = Class.forName(className).newInstance(); }catch(Exception e){ e.printStackTrace(); } return ret; } }
6、总结
本章引言部分我就详细介绍了下EJB弊端和引出Spring,对于代码如果有疑问,一定要记得看我中间引入的链接,里面讲的很清楚!下一节正式步入Spring的讲解。
有不对的地方,或者需要补充的,直接评论,我把这个文章更加完善下去!!!