Spring知识宝库

来源:互联网 发布:人大 网络教育二学位 编辑:程序博客网 时间:2024/05/20 18:15

Spring知识宝库

 

spring

版本说明

spring 3.2.1为例

特征、目的

特征:

1.面向抽象数据类型(java中叫接口)编程;

2.实现类的选择由配置文件来指定。(当然,这个过程还要为实现类的属性指定注入)

 

目的:

1.松耦合(这是上述两个特征导致的最大好处):客户面向接口,而接口的实现类是用配置文件指定的,运行时实现类也由spring加载。从而客户与实现类彻底解耦。

2.程序简单:spring的工厂做了大量的构建对象的工作

3.改造简单:这是因为使用了配置文件,改造项目有时只需改造配置文件

项目配置步骤

以下以纯手工方式描述(可脱离MyEclipseEclipseIDE)。本格子仅谈到了要实现IoC和依赖注入所需要做的,至于面向方面编程AOP则需看后面介绍。

 

一.引入必备jar包(如果用MyEclipse,它可以一次性引入)

1spring的必备jar包,可以将libs目录下的jar包全引入。下载地址http://www.springsource.org/

2commons-logging-1.1.1.jar,常用的日志工具包,其实可以在struts的目录中找到。

 

二.编写业务接口interface

 

三.编写业务实现类

 

四.对象配置。即将id与业务实现类相关联。

一般是在applicationContext.xml(文件名不限于此)中配置业务实现类。(“注入”也是在该文件配置的)

 

注:

除了用XML文件这种方式,还有java属性文件、直接使用API的方式。

    如果要使用多个配置文件,解决方案有(1)在将来实例化bean工厂时使用文件名字符串数组;(2)在某个配置文件中用<import>将其他所有配置文件导入。

    一个业务实现类bean可以对应多个id名,即别名。也可用<alias>标签来声明别名。

 

五.编写客户端程序进行测试。步骤可细分如下。

 

1.实例化容器工厂BeanFactory,有三种方式:

(1)使用系统路径的方式。涉及FileSystemResource

(2)使用ClassPath查找的方式。涉及ClassPathResource

(3)使用上下文实例化。涉及ApplicationContextClassPathXMLApplicationContext类。

其中ApplicationContextBeanFactory的子接口。

 

2.调用容器工厂BeanFactory对象的getbean()得到业务实现类实例。

spring内部会使用反射等机制创建实例,过程复杂,不过我们可以不关心。

 

3.客户端根据具体需要,调用业务实现类实例的方法。(不过这时客户端已是面向抽象即接口了)

 

注:BeanFactory是工厂,并且是抽象工厂,这种设计属于抽象工厂模式。

依赖注入

(控制反转IoC

注入方式

1.Setter注入:用<property>

2.构造方法注入:用<constructor-arg>。有两种方案

方案一:按构造方法的参数顺序注入;使用<constructor-arg index="序号">

方案二:按构造方法的参数类型注入;使用< constructor-arg type="类型全路径">

注入属性的种类

注入基本数据类型或String

若选Setter注入则用<property>及其下的<value>

若选构造方法注入则用<constructor-arg>及其下的<value>

注入其它bean

若选Setter注入则用<property>及其下用<ref>

若选构造方法注入则用<constructor-arg>及其下用<ref>

 

但又分三种方式

1.<ref bean="id">:可注入任何bean

2. <ref local=" id">:只可注入本配置文件中的bean

3. <ref parent=" id"">:略

注入内部bean:不建议使用这种方式。

这是一种特殊的指定,即在<property><constructor-arg>下用

<bean class="类型全路径">

来直接指定属性的实现类。由于没有给实现类赋id值,代码丧失了扩展性。

自动装配来注入其他bean:不建议使用这种方式。bean之间关系不清晰。

具体设置是在<bean>标签的autowire属性指定,可选nobyNamebyTypeconstructorautodetect

注入集合

即在<property><constructor-arg>下用<list><set><map>。其中可使用到<value><ref-bean><entry key="键名">map独有的)。

<list><set><map>刚好对应了java的三大集合接口ListSetMap

java引入泛型后,这部分有所改进,详见相关资料。

注入Properties

即在<property><constructor-arg>下用

<props>及其下的多个<prop key=”键名”>字符串</prop>

空字符串和null

注入空字符串:用<value></value>

注入null:用<null/>

注入的简写形式

String为例:

<property name="属性名">

<value>字符串</value>

</property>

可简写为<property name="属性名" value="字符串"/>

不完全依赖

<bean>标签中用depends-on="多个id"来指定需要在当前bean实例化之前就必须实例化的其它多个bean

bean的作用域

用于普通项目的作用域

一、singleton

单一实例bean。(不同于设计模式中的单例模式)

一个容器中,对某个id值,只会创建一个bean实例,放在缓存中。

但不同的容器中的bean是不同的。

这是默认的方式。也可用scope="singleton"singleton=" true"来显示指明。

 

二、prototype

每次被请求或引用,都会创建一个bean实例。

scope="prototype"singleton="false"来显示指明。

用于web项目的作用域

三、request:每次请求都会对应一个bean实例,请求结束时,bean实例被销毁。

指定形式:scope="request"

 

四、session:每个会话对应一个bean实例。不同用户(持有不同的会话)当然也就只能访问到自己对应的bean实例。当会话结束(消灭),其相应bean实例则被销毁。

指定形式:scope="session"

 

五、globalsession:全局生命周期bean。开发中非常少用。

指定形式:scope="globalSession"

 

使用这三种作用域的前提条件是

1.容器工厂的构建需使用XmlWebApplicationContext来查找spring配置文件

2.web.xml中需要加入:(不同的spring版本有区别)

<listener>

<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>

</listener>

自定义作用域

较复杂,用得少,略

面向切面编程AOP

概念解释

1.切面:如果某一方面的要涉及一系列操作,就把这些操作放在一个类中,称为切面类;

2.切入点:指明了系统中将被上述那一系列操作所影响的方法;

3.通知:指明每个操作如何去、怎么样影响切入点

切面编程的配置前提

一、在配置文件applicationContext.xml中的根节点<beans>的属性中将

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

改为

       xmlns:aop="http://www.springframework.org/schema/aop"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

                                  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

其中,蓝色加粗字是增加的部分

开发方式一:

注解方式

(适用于java5以后)

步骤:

(1)aspectj需要aspectjrt.jaraspectjweaver.jarspring3之后的自身lib中已不提供这两个包,需要在aspectj的官网http://www.eclipse.org/aspectj/下载,下载后将lib目录中的aspectjrt.jaraspectjweaver.jar引入;(若需其它功能可能还需引入另外几个包)

(2)下载aopalliance.jar包,引入。

(3)在配置文件applicationContext.xml中的根节点<beans>中的第一个<bean>之前加入:

<aop:aspectj-autoproxy/>

字面意思是“自动开启aspectj-autoproxy代理功能”。

1.声明切面:用@Aspect声明切面类;

2.声明切入点:用@Pointcut声明切入点;

3.声明通知:包括前置通知、返回后通知、出现异常后通知、后通知、环绕通知。这些分别对应@Before@AfterReturning@AfterThrowing@After@Around

其它说明:

切入点指定者:有excute(最常用)、withinthistargetargs,但spring不一定都支持;

合并切入点:利用&&!||逻辑运算符

切入点表达式:即@Pointcut在语法,不同的切入点指定者有各自的语法。

通知表达式:不同的通知有各自的语法。有的通知还能得到返回值和异常对象;

开发方式二:

配置方式

(适用于java5以前)

spring的配置文件applicationContext.xml中的<aop:config>标签中进行;

1.声明切面:<aop:aspect>

2.声明切入点:<aop:pointcut>

          若在<aop:config>下时则为全局切入点,可被多个切面和通知共享;

若在<aop:aspect>下时则为局部切入点,只被该切面所用;

3.声明通知;<aop:通知名 pointcut-ref="切入点名" method="方法名">

    其中,通知名指BeforeAfterReturningAfterThrowingAfterAround之一。

注意事项

一、“通知方法”的执行顺序

1.处于同一个切面中的通知根据声明顺序来确定执行顺序;

2.处在不同切面的通知方法的执行顺序需要程序员实现org.springframework.core.Ordered接口来获取和设置通知方法的优先级。

3. 在优先级方面,前置通知的执行顺序与(返回后通知、出现异常后通知、后通知、环绕通知)的执行顺序是不同的。