Spring学习
Spring是什么?
Spring是一个开源的,控制反转(Inversion of Control)和面向切面的容器框架
IOC:应用程序本身不负责依赖对象的创建和维护,对象的依赖和维护交给外部容器负责,这样控制权就由应用程转移到了外部容器,控制权的转移就是所谓的反转。
依赖注入(Dependency Injection):在运行时由外部容器将依赖对象注入到组件中。
为什么使用Spring?
1、降低组件之间的耦合度,实现各层之间的解耦
2、可以使用容器提供的众多服务,将业务逻辑和系统服务分开,如:事务管理,日志管理,持久化等服务
3、提供了单例模式支持,开发人员不需要自己编写实现代码
4、提供了AOP技术,实现如:权限拦截,运行监控等功能
5、对主流的应用框架提供集成支持,如:可以集成Struts,JPA,Hibernate
Spring的7个模块?
spring核心容器(Core)
是spring的核心模块,spring的所有功能都依赖于该类库,Core主要实现IOC功能,spring 的其他功能都是借助IOC实现的
spring上下文(Application Context)
提供框架式的Bean访问方式,其他程序可以通过Context访问Spring的bean资源,相当于资源注入
springAop(Aspect-Oriented Programming)
是spring的AOP库,提供了AOP(拦截器)机制,并提供常用的拦截器,供用户自定义和配置
springDAO(Data Access Object)
Spring提供对JDBC的支持,对JDBC进行封装,允许在JDBC上使用对象封装,允许JDBC使用Spring资源,并能统一管理JDBC事务,并不对JDBC进行实现
springORM(Object Relational Mapping)
提供常用的ORM框架的管理和辅助支持,Spring支持常用的hibernate,ibtas,jdao等框架的支持,Spring本身并不对ORM进行实现,仅对常见的ORM框架进行封装,并对其进行管理。
springWeb支持Struts集成
提供对常见框架如struts1,struts2(WEBWORK),jsf的支持,Spring能够管理这些框架,将spring的资源注入,也能在这些框架的前后插入拦截器
spingMVC自带MVC框架
此模块为spring本身提供了一个轻量的MVC框架,可以使用struts也可以使用自己的,相对于struts自己的MVC框架更简洁
spring实现的2种设计模式?
单态模式:接受容器管理的bean,默认采用单态模式管理
工厂模式:spring就是实例化和管理全部bean的工厂,spring的上下文就是工厂,也被设计成单态的
工厂模式可将java对象的调用者从被调用着的实现逻辑中分离出来,调用者只需关系被调用者必须满足的规则,而不必关系实例的具体实现过程,这是面向接口编程的优势,提高解耦,避免所有的类以硬编码方式耦合在一起。
如果所有的类直接耦合,极易形成"骨牌效应",假如B 类调用了A 类,一旦A 类需要修改,则B 类也需要修改;假如C 类调用了B 类,则C 类也需要修改......依次类推,从而导致整个系统都需要改写。造成"牵一发而动全身",而系统重构的代价是相当高的。
Spring 倡导”面向接口编程“,可以避免上述的问题,使设计良好的架构可保证系统重构的工作被封闭在重构的层内,绝不会影响其他层。
spring容器是实例化和管理全部bean的工厂,spring默认将所有的bean设置成单态模式,无须自己完成单态模式,即堆所有相同的id的bean请求都将返回同一个共享实例,因此,单态模式可大大降低java对象在创建和销毁是的系统开销
单态模式限制了类实例的创建,但采用这种模式设计的类,可以保证仅有一个实例,并可提供访问该实例的全局访问点。J2EE应用的大量组件,都需要保证一个类只有一个实例。比如数据库引擎访问点只能有一个。
更多的时候,为了提高性能,程序应尽量减少Java 对象的创建和销毁时的开销。使用单态模式可避免Java 类被多次实例化,让相同类的全部实例共享同一内存区。
为了防止单态模式的类被多次实例化,应将类的构造器设成私有,这样就保证了只能通过静态方法获得类实例。而该静态方法则保证每次返回的实例
都是同一个,这就需将该类的实例设置成类属性,由于该属性需要被静态方法访问,因此该属性应设成静态属性。
http://blog.csdn.net/titilover/article/details/6729058
spring实现依赖注入有三种方式?
依赖注入,设置点注入,构造点注入
IOC容器优缺点?
优点:实现对象的热插拔。
缺点:步骤复杂、利用反射使效率损耗、缺少IDE重构支持。
spring容器:BeanFactory和ApplicationContext
之间是父子的关系
Spring实例化bean的三种方式 1:默认使用类加载器 2:使用静态工厂方法实例化bean对象
<bean id="名称" class="工厂类" factory-method="工厂类中创建bean实例的方法"/>
3:使用实例工厂方法实例化bena对象 <bean id="实例工厂名称" class="工厂类的路径"/>
<bean id="名称" factory-bean="实例工厂名称" method="实例工厂里边的创建bena对象的方法"/>
Spring管理的bean的作用域 Spring生成的bean默认为单实例。singleton。
如果需要每次调用Spring的getBean方法就创建一个 bean的实例,可指定bean的属性scope="prototype"
还有:request、session、global session 这3个一般基于web的spring ApplicationContext情形下有效。
Spring的生命周期 bean的实例化:
1:当作用域范围为singleton时,在初始化Spring容器的时候实例化bean实例。
---1:如果lazy-init的值为true,则为延迟bean的实例化,即在Spring容器启动时不实例化bean的对象
2:当作用域范围为prototype时,在调用Spring的getBean的方法时实例化bean对象
注入依赖对象可以采用手工装配或者自动装配,在实际应用中建议采用手工装配。因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。
bean的属性
id 命名bean
class 实例化的类
factory-method 指定工厂方法
factory-bean 指定工厂类
scope 指定bean的作用域
depends-on 指定依赖bean
lazy-init 延迟初始化bean
init-method 初始化回调
destory-method 析构回调
parent 继承bean
bean的子元素
<property>子元素
直接value属性、使用子<value>、使用<ref>子元素指向另一个bean
此外property还可以包含集合:<list> <set> <map> <props>他们分别对应List Set Map Properties的值
<constructor-arg>子元素
用type指定参数类型、value指定输入参数的值
用ref属性指定其他的bean
使用<ref>子元素指向另一个bean
springAOP
AOP 是一个概念,一个规范,本身并没有设定具体语言的实现,这实际上提供了非常广阔的发展的空间。AspectJ是AOP的一个很悠久的实现,它能够和 Java 配合起来使用。
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
AspectJ 中几个必须要了解的概念:
Aspect: Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
Pointcut(切入点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
Advice(通知):Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
注:如果没有实现接口,需要引入cglib