Spring基础专题——引言

前言:去年到现在一直没有很好的时间完成这个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解决⽅案,整合众多优秀的设计模式 

体现几点点:

  • 轻量级

  1. 开源:对于运⾏环境是没有额外要求的开源tomcat resion jetty

  2. 不收费:weblogic,websphere收费,而spring是免费

  • 代码移植性高

  1. 不需要实现额外的一套接口
  • 解决方案

我们引入了三层的解决方案,spring很好的做了整合和兼容,注意一点,spring不是某一层的解决方案,比如对于控制层,spring有struts,springmvc等

对于service层,spring将其留出给开发人员自己实现

对于dao数据访问层,spring可以整合成hibernate,mybatis,jpa等等,

所以spring是一种解决方案,是一种可以很好的兼容市面上软件架构的设计方案

  • 整合设计模式

  1. 工厂设计模式
  2. 代理设计模式
  3. 模板设计模式
  4. 策略设计模式
  5. .....

4、什么是设计模式(简单版)?

  • 广义概念:面向对象设计中,解决特定问题的经典代码
  • 狭义概念:GOF4⼈帮定义的23种设计模式:工厂、适配器、装饰器、门面、代理、模板...

 

5、工厂设计模式

5.1、什么是工厂设计模式

  • 概念:通过工厂类创建对象:
  1. User user = BeanFatory.getBean("user");
  2. UserDao userDao = BeanFatory.getBean("userDao");
  • 好处:解耦合
  1. 耦合:指定代码之间的强关联关系,一方的改变会影响到另一方
  2. 问题:不利于代码的维护
  3. 简单:将接口实现类或者对象的创建不要通过硬编码在代码中,如: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的讲解。

有不对的地方,或者需要补充的,直接评论,我把这个文章更加完善下去!!!

 

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风清扬逍遥子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值