1,IOC(DI)
我们可以把IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言的反射编程,根据配置文件中给出的类名生成相应的对象并将其属性注入。从实现来 看,IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。
注入方式:setter方法和构造器注入。
Beanfactory:读取配置文件,管理bean加载,实例化,维护bean之间的依赖关系;
ApplicationContext:他是Beanfactory的扩展接口。
BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例 化,这样,我们就不能发现一些存在的Spring的配置问题。而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的 Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误。
2,AOP
原理及为代理模式,实际所用的就是jdk中的java.lang.reflect包中的动态代理,由IOC容器来产生。所应用场合为管理hibernate时的事务管理.声明式事务管理的配置。
-
切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。
-
连接点(Joinpoint): 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个 org.aspectj.lang.JoinPoint 类型的参数可以使通知(Advice)的主体部分获得连接点信息。
-
通知(Advice): 在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。
-
切入点(Pointcut): 匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
-
引入(Introduction): (也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。 例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
-
目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。
-
AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。
-
织入(Weaving): 把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入。
1):before advice 在方法执行前执行。
2):after returning advice 在方法执行后返回一个结果后执行。
3):after throwing advice 在方法执行过程中抛出异常的时候执行。
4):Around advice 在方法执行前后和抛出异常时执行,相当于综合了以上三种通知。
1)单例情况下线程不安全,但spring可以负责对bean的回收和资源释放。
2)原型情况下线程安全,但spring创建好之后就不再过问,bean的清除需要靠客户端完成。
4,在ContextLoaderListener在web.xml中配置,该类会在容器启动时初始化并默认加载web-inf下的配置bean的xml文件。
5,自动装配:为了省略每个bean中的参数,可以在配置文件中配置 default-autowire="byName"或者 default-autowire="byType"进行bean参数的自动装载。
6,OpenSessionInView
在hibernate中使用load进行延迟加载时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时session已关闭,所以就会出现异常。 比较典型的是在MVC模式中,我们在M层调用持久层获 取数据时(持久层用的是load方法加载数据),当这一调用结束时,session随之关闭,而我们希望在V层使用这些数据,这时才会迫使load加载数据,我们就希望这时的session是open着得,这就是所谓的Open Session In view 。 我们可以filter来达到此目的。
OpenSessionInViewFilter是 Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个 Session,直到这个请求结束,具体是通过一个Filter来实现的。在web.xml中配置。
7.SSH架构
Struts负责MVC的分离,Struts标签配合jsp承担表现层工作,action承担输入数据验证工作,控制器负责业务跳转。Hibernate对JDBC做了轻量级封装,负责原型model到数据库的ORM映射。Spring对整个框架前后串联,IOC负责统一创建model、action、session,AOP接管事务管理。