当前位置: 首页 > 图文教程 > Java技术 > Web框架 > Web框架:浅谈Spring Bean封装机制

Web框架
Web框架:Struts标记库定制JSP标记
Web框架:简述Ajax技术的那些框架
Web框架:利用列表数据提高开发效率
Web框架:Struts2中声明式异常处理
Web框架:小议Spring的异常处理那点事
Web框架:详谈AOP概念
Web框架:小编浅谈Struts2的Ajax支持
Web框架:Ajax提供的div标签
Web框架:程序员之家七月份Web框架总结
Web框架:浅谈Spring Bean封装机制
Web框架:小编浅谈Struts配置文件
Web框架:小编谈Spring中的AOP 应用
Web框架:Spring的闪亮之处:事务管理
Web框架:浅谈iBATIS的动态映射
Web框架:Hibernate中五个接口那些事
Web框架:Hibernate的ORM与Hibernate的优点
Web框架:Struts2的OGNL
Web框架:Struts中的ActionForm 作为防火墙
Web框架:小编浅谈Struts2中使用JSON插件实现Ajax
Web框架:Aegis绑定那些事

Web框架:浅谈Spring Bean封装机制


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 427 ::
收藏到网摘: n/a

Spring 从核心而言,是一个DI 容器,其设计哲学是提供一种无侵入式的高扩展性框架。即无需代

码中涉及Spring专有类,即可将其纳入Spring容器进行管理。

作为对比,EJB则是一种高度侵入性的框架规范,它制定了众多的接口和编码规范,要求实现者必须

遵从。侵入性的后果就是,一旦系统基于侵入性框架设计开发,那么之后任何脱离这个框架的企图都将付

出极大的代价。

为了避免这种情况,实现无侵入性的目标。Spring 大量引入了Java Reflection机制,通过动态

调用的方式避免硬编码方式的约束,并在此基础上建立了其核心组件BeanFactory,以此作为其依赖注入

机制的实现基础。

org.springframework.beans包中包括了这些核心组件的实现类,核心中的核心为BeanWrapper

BeanFactory类。这两个类从技术角度而言并不复杂,但对于Spring 框架而言,却是关键所在,如果有时间,建议对其源码进行研读,必有所获。

 

所谓依赖注入,即在运行期由容器将依赖关系注入到组件之中。

讲的通俗点,就是在运行期,由Spring根据配置文件,将其他对象的引用通过组件的提供的setter方法进

行设定。

我们知道,如果动态设置一个对象属性,可以借助JavaReflection机制完成:

Class cls = Class.forName("net.xiaxin.beans.User");

Method mtd = cls.getMethod("setName",new Class[]{String.class});

Object obj = (Object)cls.newInstance();

mtd.invoke(obj,new Object[]{"Erica"});

return obj;

上面我们通过动态加载了User类,并通过Reflection调用了User.setName方法设置其name属性。

出于简洁,我们将类名和方法名都以常量的方式硬编码。假设这些常量都是通过配置文件读入,那我们就实现了一个最简单的BeanWrapper。这个BeanWrapper的功能很简单,提供一个设置JavaBean属性的通用方法(Apache BeanUtils 类库中提供了大量针对Bean的辅助工具,如果有兴趣可以下载一份源码加以研读)。

Spring BeanWrapper基于同样的原理,提供了一个更加完善的实现。

看看如何通过Spring BeanWrapper操作一个JavaBean

Object obj = Class.forName("net.xiaxin.beans.User").newInstance();

BeanWrapper bw = new BeanWrapperImpl(obj);

bw.setPropertyValue("name", "Erica");

System.out.println("User name=>"+bw.getPropertyValue("name"));

对比之前的代码,相信大家已经知道BeanWrapper的实现原理。

诚然,通过这样的方式设定Java Bean属性实在繁琐,但它却提供了一个通用的属性设定机制,而这

样的机制,也正是Spring依赖注入机制所依赖的基础。

通过BeanWrapper,我们可以无需在编码时就指定JavaBean的实现类和属性值,通过在配置文件

加以设定,就可以在运行期动态创建对象并设定其属性(依赖关系)。

上面的代码中,我们仅仅指定了需要设置的属性名“name”,运行期,BeanWrapper将根据Java

Bean规范,动态调用对象的“setName”方法进行属性设定。属性名可包含层次,如对于属性名

 address.zipcode”,BeanWrapper会调用“getAddress().setZipcode”方法。