面向对象含义+Spring管理本质(通俗的案例颠覆你的认知)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/PSY_God/article/details/80227701
       我们在学习java的时候,都是在一个main方法中进行各种各样的代码活动。后来学到了面向对象,知道了很多流程是通过不同的对象合作来完成业务逻辑。我们在main方法中,new了很多个对象,完成了业务功能,然后这个main方法就结束了,虚拟机停止了.

一个main方法,他是一个线程,所有的逻辑代码顺序的再线程上执行,我们遇到了一个问题,需要一个对象了,ok,我们new了一个对象,然后完成了业务逻辑. 线程结束,对象被回收. 实际上,main方法也是一个方法,所以这些在线程中创建的对象,在main方法作用域的范围之外都会被销毁了。

       希望大家想象这样一个过程:假如你开了一间房产公司,你是老板,你没有员工,这个时候,有一个客户上门办业务,你就零时的雇佣了一个员工,把你的业务办完了,然后解雇了这个员工.又有一个客户来了,你又去雇佣了一个员工,结束了业务你又解雇了他.并且还有一个问题,那就是来了这个客户,他还要等着你,去把员工找好了,他的业务才可以得到办理,整个过程,分成了招员工+办业务两件事. 你的客户一定会抱怨:怎么不提前把员工请好呢?这样多耽误我的时间啊!

       回到刚才的线程的问题:线程是用来干什么? 
      线程就是用来办业务的,我们的线程资源提供了程序的计算能力,处理问题的能力. 可是,你在碰到一个问题了:你需要一个人来解决问题的时候,你发现你没有这个人,于是,你把这个业务计算资源,用来去创造对象了.所有的业务就要等着你把对象创建完毕了,才能继续进行下去...这样,一个线程并没有专注的干自己的业务,而是一边创建对象,一边办理业务.我们可不可以改进一下我们的程序呢?

       在main方法启动的时候,提前创建好我们的业务需要的所有的对象,放在一个池子里呢?我们需要谁的时候,直接叫一声,池子里的对象就跑出来了。直接来办理业务不就好了吗?
       我想到了一个方法,那就是在main方法头部创建了一个map,把然后new很多个对象,给对象起一个名字:比如经纪人A、经纪人B、银行代表C 放在map中。后面的业务处理部分,直接map来get谁,办理业务 但是,这样性价比不高.因为我们在学习java的时候,都是单线程程序,程序都是一次性的。这种java程序不能称之为一个持续提供服务的系统,我们开一个房地产经纪公司,也不是一锤子买卖。我们需要雇佣很多员工,在很长时间内,重复服务很多很多的客户.这个过程是持续的,不间断的,我们不能说,等到公司开起来了,来了客户,我们才知道去找人.而是,在公司建立起来,还没有对外提供服务的时候,所有的员工都准备好了包括 会计,销售,技术,客户代表所有这些人都各就各位了并且,这些系统中的对象要能够服务不同的客户,不同的线程,那么他们应该在全局系统范围是可见的,不受任何一个线程,或者方法的结束而结束。

      我们想到了static类,是吗?因为static池,可以在全局范围内来存储这些对象
比如,我们不用spring来建立一个web程序,我们可能会有一个监听器,web容器启动了.监听器中给一个静态池(一个静态类)中的map属性中添加所有web系统需要服务的对象,各类dao,各类service等 把所有这些对象,都建立好,各就各位。

假如你的系统需要1000个对象,那么,你就需要在这个池类中部署1000个,然后你在servlet中办理业务的时候,你需要一个人了,直接获取这个池类,得到这个对象.而不是new一个,因为new一个就是一锤子买卖了.方法结束,对象被回收.这个做法就是,applicationContext.getBean的基本雏形了。

     一个静态类,可以提供全局存储的功能 但是,他并不专业.一个static类,他并不是专业的池,spring提供了很多特性。比如,可以设置是否是全局范围,singleTon,还是一次建立就销毁,还是session范围有效.spring的池,很多选项.但是一个static类来提供全局池,是很简陋的,不专业的.我只是单纯的比静态类和IOC容器在对象管理这块的问题。

假如,我们用了静态类来管理对象,可能我们有一个BeanContext这样一个静态类,然后在监听器中,把所有的系统需要的全局对象,都set到这个类中的某个map上再servlet中需要这些对象的时候,直接静态类,BeanContext.getBean来获取静态方法,这是一个很大的进步,至少,我也提供了系统对象的管理了。但是,有一个问题,我的static类提供了对象管理,我可以随意的获取一个service对象,我也可以随意的获取一个dao对象,这都没有问题,但是,你在servlet中办理业务的时候你肯定有三个步骤:获取servcice,获取dao,然后把获取来的dao设置到获取来的servic额上面.你需要在业务代码中做这样的一个事情。这样,你的业务代码还是单纯的业务代码吗?
     你又陷入到这种困境中了:你开了一家公司,明明老张和老王是上下级关系,可是每一次,来人办业务,你都要重复的建立这种关系----------Spring的自动装配。
虽然,你没有重复创建对象了,但是你在重复创建这种关系。你肯定会说在监听器中就建立好关系呀,监听器代码中把全部的对象管理好之后,然后set所有的关系。但是这个假如你的公司很大有10000个对象各种关系错综复杂,你会set到死,你也很难用代码实现。如果你真的企图去实现这样的代码,你其实,就很明白你在干一件什么事情了那就是重复造轮子,造spring的轮子了

     spring是怎么做的?在一个类中用autowired注解,spring的ioc先把所有的对象管理起来,然后发现这些类中的autowired注解自动的给你执行装配,这就是web程序中,spring的监听器,干的事情启动监听器,获取配置文件,根据配置文件扫描指定的classpath下的类,实例化他,根据类中的注解信息,来执行装配,装配结束,监听方法完成,把IOC容器挂靠再ServletContext上面,这样,我们的业务代码中,再也看不到new对象了,因为提前构建起来了,再也看不到set属性了,因为自动装配了。

       java是面向对象的,而对象如何被管理?我们天天都在提,面向对象面向对象可是从来没有考虑过,一个java系统,他们的对象的管理,配置,协调方式 所谓的控制反转就是你不再需要主动去set属性,交给我就行了,我来帮你,这个控制权利,我来帮你做你根本不需要知道对象在哪里,你也不需要管他是什么类型,全部由我给你准备好。

        有一个概念叫做EJB,EJB是官方的javaEE应用容器框架,它和spring类似,提供对象的管理,依赖反转,但是他有一个问题:就是EJB有很强烈的限制,比如企业Bean,实体Bean,都要符合EJB规范的对象。他才可以进行部署和管理。而spring不同,spring是基于普通pojo的,任何对象,来者不拒。EJB提供了整个javaEE企业开发的通用框架,结构,所有的一切,都要按照他的标准来部署,来配置,来管理,比如一个公司框架,财务,销售,技术支持,售后 都给你规定死了,你必须要按照这个规范,来部署整个系统所需要的组件,对象。而spring,随意,你随便部署一个HelloWorld对象吧,没有人会管你。

     一个系统,由成千上万个对象,组件构成,而这一切,都是部署在系统对象管理平台上的 spring是一个轻量级的javaEE平台
他非常开放,非常好用,可以简单到只有一个HelloWorld对象,也可以是一个超大型的企业系统如果没有spring,没有EJB,你可能需要自己开发系统的对象和组件管理和配置平台,如果系统很大,你很难 几乎不可能,你肯定会用javaEE的这样的框架来帮你,无论是spring还是ejb

实际上,是一个平台,javaEE的构建平台,他就像是一个主板,我们在这个主板上面部署不同的组件,不同的组件之间还有关联关系.你见过主板吗?上面密密麻麻的部署了很多很多组件,这个主板就是spring平台. 企业级应用,就是基于这块板子来部署的.我们可以把EJB看作是规范,显卡接口,cpu接口 EJB很强的限制 你必须按照主板规范来部署.但是spring就是一个光板,你们现在知道,为什么总有人说,和spring整合这种说法了吧.其实不是和spring整合,而是我们需要再spring中来给他集成,集成到大家庭中.

      有人说:EJB像一种规范,Spring像一个平台。 其实不能这么说,EJB提供了标准组件、全套解决方案,你拿到EJB主板的时候,很多东西都已经内置了。而spring是光板所以称之为轻量级javaEE平台,轻量级也就意味着一些东西还得你自己来。持久化嘛,我需要一个sqlSessionFactory,部署进去安上去,等等,连接池,安进去。什么?还需要和redis服务,redis客户端部署进去,还需要和activemq集成,那么,把mq组件部署上面。这有些颠覆你们对java的认识,你们眼中的java程序应该是你们学习java,main方法那些程序逻辑,实际上,一个组件,一个服务,甚至是一个子系统 他们都是对象刚才已经提到了,为什么需要对象管理和配置了 你们如果只是写个main方法,跑一跑,结束 。这不叫企业级应用程序,好了,我刚才提到了spring管理平台,但是,我们的程序中,如何来使用spring管理的对象呢。它的本质还是管理对象,我们最终要拿到对象才是啊!我们在哪里拿到的对象啊? 好像我们从来没有想过这个问题,只知道@conponment 只知道@autowired 已经麻木了!

      以springmvc为例子 springmvc中的Controller里面被装配了service,service内部装配了dao。但是这个Controller是在哪里被获取,被取出来的?你好像没有在哪里个地方getBean获取这个Controller吧。就是说,无论spring怎么装配,怎么管理,我们最终都要找他拿最外层的那个入口对象她如果只是存起来,装配好,有什么用 必须要提供出来呀!所以,这就是springmvc的映射器mapping干的事情了 它可以找到Controller,找到了Controller,意味着找到了整个入口你们开发的Controller被添加了@Controller注解,被管理,被装配 最终被映射器发现。

     多提一嘴 是不是整个应用程序的所有的对象都应该被容器管理呢?显然不是,举例子:你开了一家房地产公司、经纪公司,你的员工,设备,电脑,合作合办都是提前部署好了,但是,不代表,你在经营的活动中就不会出现新生的临时性事物 比如,你的客户就是临时性的,来了一个客户,业务办理结束,客户对象就没了。你的经营活动中出现了新东西,临时性的,比如一笔业务过程中的一个订单,一笔交易,他们都是实效性很强的。这些东西叫做实体,而spring管理的,一般都是组件、系统组件说到这个问题,可能就会出现那些什么实体,vo,dto,服务对象,dao,等等 这些都是整个系统中出现的对象,但是她们有不同的角色,不同的定义嗯,基本上差不多了

spring就是java企业级目前事实上的标准,spring是所有框架中,最核心的,最重要的一个。但是它的存在感比较低,对很多人来说就是注解,就是写配置文件。很少有人真的去理解它!!!





                                                                                                                                                       -----谜之家大佬








猜你喜欢

转载自blog.csdn.net/PSY_God/article/details/80227701