Spring知识宝库
spring | |||
版本说明 | 以spring 3.2.1为例 | ||
特征、目的 | 特征: 1.面向抽象数据类型(java中叫接口)编程; 2.实现类的选择由配置文件来指定。(当然,这个过程还要为实现类的属性指定注入)
目的: 1.松耦合(这是上述两个特征导致的最大好处):客户面向接口,而接口的实现类是用配置文件指定的,运行时实现类也由spring加载。从而客户与实现类彻底解耦。 2.程序简单:spring的工厂做了大量的构建对象的工作 3.改造简单:这是因为使用了配置文件,改造项目有时只需改造配置文件 | ||
项目配置步骤 | 以下以纯手工方式描述(可脱离MyEclipse、Eclipse等IDE)。本格子仅谈到了要实现IoC和依赖注入所需要做的,至于面向方面编程AOP则需看后面介绍。
一.引入必备jar包(如果用MyEclipse,它可以一次性引入) (1)spring的必备jar包,可以将libs目录下的jar包全引入。下载地址http://www.springsource.org/。 (2)commons-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)使用上下文实例化。涉及ApplicationContext和ClassPathXMLApplicationContext类。 其中ApplicationContext是BeanFactory的子接口。
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属性指定,可选no、byName、byType、constructor、autodetect。 | |||
注入集合 | 即在<property>或<constructor-arg>下用<list>、<set>、<map>。其中可使用到<value>、<ref-bean>、<entry key="键名">(map独有的)。 <list>、<set>、<map>刚好对应了java的三大集合接口List、Set、Map; 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.jar和aspectjweaver.jar。spring3之后的自身lib中已不提供这两个包,需要在aspectj的官网http://www.eclipse.org/aspectj/下载,下载后将lib目录中的aspectjrt.jar和aspectjweaver.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(最常用)、within、this、target、args,但spring不一定都支持; 合并切入点:利用&&、!、||逻辑运算符 切入点表达式:即@Pointcut在语法,不同的切入点指定者有各自的语法。 通知表达式:不同的通知有各自的语法。有的通知还能得到返回值和异常对象; | |||
开发方式二: 配置方式 (适用于java5以前) | 在spring的配置文件applicationContext.xml中的<aop:config>标签中进行; 1.声明切面:<aop:aspect> 2.声明切入点:<aop:pointcut> 若在<aop:config>下时则为全局切入点,可被多个切面和通知共享; 若在<aop:aspect>下时则为局部切入点,只被该切面所用; 3.声明通知;<aop:通知名 pointcut-ref="切入点名" method="方法名"> 其中,通知名指Before、AfterReturning、AfterThrowing、After、Around之一。 | ||
注意事项 | 一、“通知方法”的执行顺序 1.处于同一个切面中的通知根据声明顺序来确定执行顺序; 2.处在不同切面的通知方法的执行顺序需要程序员实现org.springframework.core.Ordered接口来获取和设置通知方法的优先级。 3. 在优先级方面,前置通知的执行顺序与(返回后通知、出现异常后通知、后通知、环绕通知)的执行顺序是不同的。 |