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

原文地址:https://www.cnblogs.com/yw-ah/p/5801483.html