sping学习
spring的依赖注入机制,可以在运行期为组件配置所需资源,而无需再编写组件代码时就加以指定,所以降低了组件之间的耦合。比如spring配置文件中声明不同的bean实例,实例对应的类都是继承于同一个抽象类,可以再配置文件中直接指定不同继承类的传递参数。甚至,可以把要运行时调用的bean实例名字和参数写在properties配置文件中,动态去读取。依赖注入也更多的表现在bean实例之间的相互引用,作为属性把一个bean实例注入到另外一个bean实例里。
spring的依赖注入和控制翻转来描述spring是比较生涩的,我认为spring使用了很多设计模式来实现的,也涉及了众多的技术范畴,比如mvc,orm以及remote interface等。spring是一个非强制性的框架,里面有许多独立的组件可以选择。
Spring Bean的封装机制:
org.springframework.beans包中包括了核心组件的实现类,核心中的核心为BeanWrapper和
BeanFactory类,这两个类是关键所在。
关于Bean Wrapper:
org.springframework.beans
包遵循Sun发布的JavaBean标准。JavaBean是一个简单的含有一个默认无参数构造函数的Java类, 这个类中的属性遵循一定的命名规范,且具有setter和getter方法。例如,某个类拥有一个叫做bingoMadness
的属性,并同时具有与该属性对应的setter方法:setBingoMadness(..)
和getter方法:getBingoMadness()
。 如果你需要了解JavaBean规范的详细信息可以访问Sun的网站 (java.sun.com/products/javabeans)。
这个包中的一个非常重要的概念就是BeanWrapper
接口以及它对应的实现(BeanWrapperImpl
)。根据JavaDoc中的说明,BeanWrapper
提供了设置和获取属性值(单个的或者是批量的),获取属性描述信息、查询只读或者可写属性等功能。不仅如此,BeanWrapper
还支持嵌套属性,你可以不受嵌套深度限制对子属性的值进行设置。所以,BeanWrapper
无需任何辅助代码就可以支持标准JavaBean的PropertyChangeListeners
和VetoableChangeListeners
。除此之外,BeanWrapper
还提供了设置索引属性的支持。通常情况下,我们不在应用程序中直接使用BeanWrapper
而是使用DataBinder
和BeanFactory
。
BeanWrapper
这个名字本身就暗示了它的功能:封装了一个bean的行为,诸如设置和获取属性值等。
所以说:beanWrapper,实际就是反射生成类实例,并注入property,而且支持嵌套注入。
看看如何通过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的实现类和属性值,通过在配置文件加以设定,就可以在运行期动态创建对象并设定其属性(依赖关系) 。
Bean Factory:
Bean Factory,顾名思义,负责创建并维护Bean实例。
1.Bean属性及依赖关系(对其他bean的引用)
2.Bean的创建模式(是否Singleton模式等等)
3.Bean的初始化和销毁
4.Bean的依赖关系
我们获得bean实例,由BeanFactory进行加载,并根据配置文件进行初始化和属性设定。对于一个Bean实例,其中属性值代表的意义如下:
总结,BeanWrapper实现了针对单个Bean的属性设定操作,而BeanFactory则是针对多个Bean的管理容器,根据给定的配置文件,BeanFactory从中读取类名,属性名/值,然后通过Reflection机制进行Bean加载和属性设定。
ApplicationContext:
ApplicationContext覆盖了BeanFactory的所有功能,并提供了更多的特性如下:
1.国际化语言支持
2.资源访问
支持对文件和URL的访问,比如ctx.getResource("classpath:xx.propeties");
3.事件传播
事件传播特性为系统中状态改变时的检测提供了良好的检测。
ApplicationContext基于Observer模式(java.util包中有对应实现),提供了针对Bean时间的传播功能。通过
Application.publishEvent方法,可以将定义的时间event通知系统内所有的ApplicationListener。
4.多实例加载
可以在同一个应用中加载多个Context实例。
Spring mvc 图示:
Spring mvc和页面框架配合使用:
1.xstl框架 2.freemarker框架 3.Velocity框架等
Spring的事务管理略
Spring的前端validate等略
Spring的Aop略