初识spring

都说spring是轻量级的,现在的市场份额很大,是如何如何的好,我也忍不住系统的来了解一下spring,嘿嘿。。。。
一:spring的整体结构
   spring所有功能的支撑主要是建立在IOC容器之上,所以控制反转和依赖注入是spring技术的核心之所在,而在这基础上实现了DAO,ORM,JEE,WEB等的集成,而在DAO和ORM上有实现了(不知道这样说准确不)AOP这门面向切面的编程,在这里大家应该都很清楚,DAO主要包括了Spring JDBC以及事务管理和控制;ORM方面主要集成了Hibernate,ibatis,JPA等技术,JEE主要是集成了企业开发常用的或者比较复杂的一些功能,如:消息的传播模型(JMS),远程控制(Remoting),邮件功能(Email),还有JMX,JCA等;而WEB这一块主要是实现了Spring Web MVC和Spring portlet MVC还有就是其他的一些附属的功能,如:上传,下载,报表,导出,Velocity,jsps,framMaker,JsF,WebWork,PDF等等技术。从上面的介绍中可以得出结论就是spring主要是为了解决我们业务问题(Servive)而和其他的层次可以很好结成的一个容器。
二:控制反转
1:控制反转(IOC) 业界都叫控制反转,就是所把实例化bean的控制权交给了容器,而不是自己本身,这里就是说以前传统的办法是谁要用谁创建,现在是容器统一创建,谁想要,谁到容器里去取,这里的基础概念就是beanFactory,他提供了对Factory模式的经典实现来消除对程序性单例模式的需要,并真正允许从程序逻辑中分类出依赖关系和配置。而可以通过bean的配置来实现bean的范围是单例的还是不是单例的。而单例和非单例bean他们的实例化时间和过程也是不一样的,单例(singleton)是在实例化容器的时候就创建(应为他们在所有时间都是一同个),而非单例(prototype)是在获得bean的情况下才创建的,应为每取得一个实例都是不同的.除了以上两种,还有request,session,GlobalSession等范围。
2:依赖注入(DI) 依赖注入的基本原理是对象之间的依赖关系(对象里面引用对象)只会通过以下几种方式来实现:构造器的参数,工厂方法的参数,或给由构造函数或者工厂方法的创建对象设置属性。说白了就是在实例化bean的时候利用反射技术通过对bean里面的其他的bean的get方法或者构造函数对他们建立关系。
3:定制bean的特征,这包括了生命周期的回调和了解自己两个层面的理论,其中的生命周期回调就是在设置bean的所有属性之前完成一些初始化的工作,而析构回调时在设置bean的所有属性之后实现对bean的后续的工作,初始化工作可以通过实现InitializingBean接口或者在bean的配置文件中添加Init-method="init"来对初始化方法的指定,析构也是可以通过实现DisposableBean接口或者在bean的配置文件中添加Default-destroy-method="disposable"来实现对后续方法的制定.
4:bean定义的继承,是指子类bean可以通过parent=""属性来制定父类,而在这时子类可以应用父类的class和init和destroy方法,也可以自己用属性指定而覆盖父类的方法。
5:容器扩展点
A:用BeanPostProcess定制bean:如果想在Spring容器完成对bean的实例化,配置和其他的初始化后执行一些自定义的逻辑,就可以插入一个或者多个BeanPostProcess实现,BeanPostProcess可以对bean(或对象)的多个实例进行操作,也就是说,Spring IOC容器会为你实例化bean,然后BeanPostProcess去处理它。一些Spring AOP的底层处理也是通过实现bean后置处理来执行代理包装逻辑。由于BeanPostProcess得实现机制,所以BeanPostProcess或bean的实现不能被自动代理(所以不会被aspect植入)。
B:用BeanFactoryPostProcess定制配置元数据,其中比较典型的是PropertyPlaceHolderConfiguer,他是bean工厂的后置处理器的实现,他把bean里面的属性值单独放到一个java的properties里面,典型的就是配置数据元是的那些连接数据库的属性值。
二:面向切面(AOP)
AOP技术作为Spring的重要组成部分,但是他和IOC之间没有任何的依赖关系,他作为IOC的一个补充,提供了一个强大的中间件解决方案。
  优点:1:提供声明式企业模式,替代了EJB的声明式服务,最重要的声明性事务管理。
        2:允许用户自定义切面,用AOP完善OOP的使用。
  概念:1:切面,连接点,通知,切入点 2:引入,目标对象,AOP代理,织入
        3:通知类型:前置通知,后置通知,异常通知,环绕通知,最终通知
  底层实现:Spring缺省使用j2se的动态代理实现AOP的代理,遮掩任何接口和接口集都可以被代理,其实spring也可以用CGLIB实现代理的,对于需要代理类而不是代理接口的情况下,用CGLIB实现AOP代理是完全必要的。如果一个业务对象没有实现一个接口就默认使用CGLIB实现代理
  @AspectJ的支持:通过在配置文件中加入<aop aspectj-autoproxy>并加入相应的两个jar文件aspectjweaver.jar,aspectjrt.jar然后就可以开始面向切面的开发了:
1:声明切面,就是用@Aspect声明的类,在Spring AOP中声明为切面的类不可能再被其他的切面通知,并且从自动代理中排除掉。
2:声明切入点:可以理解为是spring bean上方法的执行的匹配,切入点表达式通常用@pointcut来标注相应的方法(返回值为了空的方法)
3:申明通知:通知时跟一个切入点表达式连接起来的,并且在切入点方法执行之前或者之后或者前后执行。
4:引入:引入(在AspectJ中被称为inter-type申明)使得一个切面可以定义被通知对象给定的接口,并且可以为那些对象提供的实现。
当强制使用CGLIB时候注意一下问题:1:无法通知(advise)Final方法,因为他们不能被复写。2:你需要将CGLIB2二进制发行包放在classpath下,与之相较JDK本身就提供了动态代理,当需要CGLIB而在classpath下又没有找到相应类库的话,spring会自动提醒3:代理对象的构造器会被调用两次,通常情况下,调用代理类型的构造器两次不是问题,因为除了会发生之排外没有任何真正的逻辑被实现。
5:用编程方式创建@AspectJ的代理
6:在spring应用中使用AspectJ
a)使用AspectJ进行domain object的依赖注入:spring可以对application context中的bean进行配置和实例化外,同样可以通过bean factory对已近存在并且已近定义成bean的对象应用于所包含的配置信息。遮阳的主旨是为脱离容器而创建的对象进行依赖注入。在这里inessence是比较关键的词语,就是说在对象在构造器块中依赖将不可用,如果希望在构造器块之前被注入,则需要使用接口声明上定义@configurable(preconfiguable=true)
四:中间层数据访问
1:事务管理
a)使用资源同步的食物
b)声明式事务
c)编程式事务
2:DAO的支持
3:JDBC数据访问
4:O-R的支持
五:Spring MVC
六:Spring的整合
1:远程调用 2:消息模型JMS 3:定时任务 4:邮件服务 5:webservice

猜你喜欢

转载自wujianjun12315.iteye.com/blog/1086226