Java容器理解

(一)什么是容器

1.       容器的概念

    容器可以管理对象的生命周期、对象与对象之间的依赖关系,可以使用一个配置文件(通常是XML),在上面定义好对象的名称、如何产生(Prototype方式或Singleton方式)、哪个对象产生之后必须设定成为某个对象的属性等,在启动容器之后,所有的对象都可以直接取用,不用编写任何一行程序代码来产生对象,或是建立对象与对象之间的依赖关系。

    容器是一个Java所编写的程序,原先必须自行编写程序以管理对象关系,现在容器都会自动帮您作好。常用的容器有:WebSphere,WebLogic,Resin,TomcatSpringhibernateJBoss

    广义上也包含Java内置容器类,JaVA容器类包含ListArrayListVectormapHashTableHashMapHashset

    这里我们讨论的是前者,下面重点介绍Spring,以加深对容器的理解

(二)Spring

1.        Spring基本概念

1.1.       Spring简介

    Spring是一个开源框架,Spring 是于2003 年兴起的一个轻量级的Java 开发框架,由RodJohnson 在其著作Expert One-On-OneJ2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益

1.2.       Spring技术的核心

    Spring技术实现的两个核心技术:反射和动态代理

  • 反射:可以说反射是java优越性的根本,原本只能用new关键字生成对象,使用反射后程序可以动态的生成对象,修改对象,调用对象的方法,访问对象的属性……其实这点在JavaScript中也类似。
  •  动态代理:动态代理是一种设计模式,和反射机制结合可以有效的使接口使用者和实现者最大程度的解耦,调用者可以轻松的、透明的调用接口。

1.3.       Spring的两个核心思想IOC和AOP

 

1、 控制反转(Inversionof Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转还有一个名字叫做依赖注入(DependencyInjection)。简称DI。看下面简单的例子

publicinterface Bottle {

       String getContent();

    }

    publicclass Person{

       private Stringname;

        private Bottlebottle;

       public Person(String name){

           this.name=name;

        }

       publicvoid drink(){

           if(bottle!=null){

              System.out.println("I am "+name+",and drinking:"+bottle.getContent());

           }

       }

       publicvoid setBottle(Bottle bottle){

           this.bottle=bottle;

       }

    }

    publicstatic void main(String[] args){

       Person zhangsan=new Person("zhangsan");

       Bottle bottle=newXXXBottle("beer");

       //Bottle bottle=BottleFactory.factoryBottle("beer");

       zhangsan.setBottle(bottle);

       zhangsan.drink();

    }

 

<?xml version="1.0" encoding="UTF-8"?>

<beans

   xmlns="http://www.springframework.org/schema/beans"04.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"05.    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="beerImpl" class="org.martin.BeerBottle" />

    <bean id="zhangsan" class="org.martin.Person" >

        <property name="bottle" ref="beerImpl"/>

    </bean>

</beans>

publicstaticvoid main(String[] args) {

       BeanFactory factory =newClassPathXmlApplicationContext("applicationContext.xml");

       Personzhangsan = (Person) factory.getBean("zhangsan");

       zhangsan.drink();

    }

 

2、 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。先看《Sping InAction》中最典型的例子:

    有个问题,就是每个骑士在继续探险之前,必须停下来吩咐吟游诗人谱一首曲子(见图1.9)。在探险之后,骑士必需记得告诉歌手继续歌颂他的探险。必需记得要停下来并告诉歌手做什么,这当然会耽误骑士的探险。

    理想状态下,歌手应该不等通知就谱写曲子。骑士不应该知道(甚至不关心)他的行动被记录到歌曲中了。毕竟,你不能因为一个懒惰的歌手而耽误了探险。

    简单地说,吟游诗人提供的服务超出了骑士的责任。也就是说,吟游诗人的工作(写歌)与骑士的职责(探险)交叉在一起了。所以,把吟游诗人实现成切面,并把他的写歌服务提供给骑士是合理的。然后,吟游诗人的服务包含了骑士的功能。骑士甚至都无需知道吟游诗人在旁边。


    利用SpringAOP技术后:


2.       进一步感受Spring

    项目培训中有个Spring的实战例子,主要是如何使用Sping来管理对象以及使用Spring前后对比(在此略)。

3.       再谈IOC和AOP

IOC:IOC技术在JavaEE中目前已经普遍使用,最大的好处就是减小耦合,并且对象的组装、生命周期的控制完全交给Spring容器。你现在是否只要关心你的业务逻辑了?

AOP:上面例子中的吟诗和日志、安全、持久化的工作是否一致?Web中的拦截器也是这个道理?那么下面的图是否说明了问题?

(三)再谈容器

1.       Tmcat、Hibernate、JBoss等容器又是怎么回事?

2.       如何实现容器?

是否觉得一个HashMap也是一个最简单的容器?

Spring容器实现是否这样的思路?

  • 初始化
  • 根据上下文信息搜索加载信息(xml或者注解)
  • 加载bean

Tomcat,Hibernate,JBoss呢?

3.       OpenDaylight中的容器

结合OpenDaylight中的Containermanager来看,ODL中的Container是用来划分管理域,默认是一个default。

OSGi本身就是一个大容器

那么Container和Componet的关系呢?Container和Cluster关系?

见《OpenDaylight实战手记》源代码研读部分


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值