Spring知识宝库
来源:互联网 发布:人大 网络教育二学位 编辑:程序博客网 时间:2024/05/20 18:15
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. 在优先级方面,前置通知的执行顺序与(返回后通知、出现异常后通知、后通知、环绕通知)的执行顺序是不同的。
- Spring知识宝库
- linux知识宝库
- java知识宝库
- jQuery知识宝库
- Struts2知识宝库
- Hibernate知识宝库
- yii知识宝库
- 疯狂Java学习笔记(46)------------知识学习宝库!
- Java学习笔记(46)------------知识学习宝库!
- [推荐]中国网管的知识宝库-网管之家
- [推荐]中国网管的知识宝库-网管之家
- baidu宝库
- 资源宝库
- spring知识
- spring知识
- Spring 框架知识知识总结
- [转] 无忧JS宝库
- 程序员网站资源宝库
- 域名与域名解析-DNS原理
- Hibernate知识宝库
- childNote and children
- ibatIS中返回结果map 并使用list获取
- 浅谈HTTPS传输协议原理
- Spring知识宝库
- java.lang.InstantiationException:(实例化异常)
- 线程的最佳实践二:不使用stop方法停止线程
- typeid操作符
- SetTimer 函数在控制台应用程序中的应用 (在控制台应用程序中使用定时器)
- HDOJ 4529 - N骑士问题 状态压缩DP
- dom4j基本使用
- 去掉CFormView的滚动条
- Android:Parcelable和Serializable的区别