版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Spring轻量级容器框架Spring简介Spring是一个控制反转〔Ioc〕和面向切面编程〔AOP〕的轻量级的容器,为软件开发提供全方位支持的应用程序框架。控制反转(InversionofControl,IoC)与依赖注入(DependencyInjection,DI)。由容器来管理对象之间的依赖关系〔而不是对象本身来管理〕,就叫“控制反转”或“依赖注入”.控制反转应用本身不负责依赖对象的创立和维护,而是由外部容器来负责。这样控制权就由应用转移到外部容器,控制权的转移就是所谓的反转。容器是符合某种标准能够提供一系列效劳的管理器,开发人员可以利用容器所提供的效劳来方便地实现某些特殊的功能。所谓的“重量级”容器是指那些完全遵守J2EE的标准,提供标准中所有的效劳。EJB就是典型的例子。“轻量级”容器的也是遵守J2EE的标准,但其中的效劳可以自由配置。Spring最常用的特性利用Spring来创立对象〔JavaBean工厂〕利用Spring构建业务逻辑层管理依赖关系适应需求变更利用Spring创立数据访问对象〔DAO〕利用Spring进行事务处理Spring的安装下载并解压将相应的jar包参加类路径spring.jar配置SpringApplicationContext.xmlIoC/DI控制反转(InversionofControl,IoC)与依赖注入(DependencyInjection,DI)。由容器来管理对象之间的依赖关系〔而不是对象本身来管理〕,就叫“控制反转”或“依赖注入”前面的例子,已清楚阐述IoC/DI出现的原因,以及IoC的根本原理:抽象不依赖于现实,而是现实依赖于抽象。Spring框架的根本思想就是IoC/DI,Spring就是一个IoC容器IoC与DI,说的是一回事,但DI这个名词更能表达这种设计模式的思想Spring架构依赖注入的类型构造器注入通过类的构造方法注入依赖关系使用<constructor-arg>
元素设值方法注入通过类的setter方法注入依赖关系使用<property>元素依赖注入的配置注入根本数据类型,字符串等。在<property>或<constructor-arg>元素中使用<value>在<property>或<constructor-arg>元素中加上value属性注入依赖对象在<property>或<constructor-arg>元素中使用<ref>在<property>或<constructor-arg>元素中加上ref属性注入null值如果使用<value></value>这种形式,Spring是作为空字符串来对待的。可以使用<null>表示null值内部Bean,在<property>或<constructor-arg>元素中使用<bean>元素再定义一个Bean内部Bean的scope、id、name属性会被忽略内部Bean总是prototype(原型)模式内部Bean不能在包含该内部Bean的Bean之外依赖注入的配置注入集合通过<list>、<set>、<map>、<props>配置与JavaCollection类型对应List、Set、Map、Properties<propertyname=“lists”>
<list><value></value><ref/></list></property><propertyname=“maps”>
<map><entry><key> <value></value> </key><value></value></entry></map></property><propertyname=“sets”>
<set><value></value><ref/></set></property><propertyname=“emails”>
<props><propkey=“support”></prop></props></property>Bean的依赖模式1用ref属性指定依赖。local模式
Bean与被参考引用的Bean在同一个XML文件中,而且被参考 应用的Bean是指定id属性。
Spring的XML解析器会在解析时匹配,如果没有匹配的元 素,XML解析器会产生一个错误。<propertyname="book"><reflocal="book1"/></property>
Bean的依赖模式2bean模式〔可找id,也可找name命名的别名〕<beanid="book1"name="book2"class="com.Book">Bean与被参考引用的Bean可以在不同的XML文件中。ApplicationContextcontext=newClassPathXmlApplicationContext(newString[]{"beans1.xml","beans2.xml"});bean-dao.xmlbean-po.xmlbean-service.xmlbean-….xmlBean的依赖模式3parent模式,表示被参考引用的Bean可以是当前
BeanFactory或ApplicationContext的父BeanFactory或ApplicationContext中的Bean。表示继承的父类
如果有很多继承同一个父类的BEAN
那么在配置文件中实例那些BEAN时候可以省略掉父类已经注入的属性
bean定义继承父bean定义,它可以覆盖父bean的一些值,或者它需要的值。
三种实例化Bean的方式使用类构造器实例化,也就是没有参数的构造函数来建立Bean的实例
<beanid="sample"class="com.fendou.service.impl.SampleImpl"/>使用静态工厂方法实例化publicPersonFactory{publicstaticPersongetPerson(){returnnewPerson(); }}<beanid="person2"class="com.spring.bean.PersonFactory"factory-method="getPerson"></bean>使用实例工厂方法实例化<beanid=“sampleFactory"class="com.fendou.service.impl.SampleFactory“><beanid="sample3"factory-bean=“sampleFactory”factory-method=“createSample”/>Bean的作用域Singleton。在Spring中取得的实例被默认为Singleton(单例)<beanid=“sample”class=“com.fendou.service.impl.SampleImpl“scope=“singleton”/><beanid=“sample”class=“com.fendou.service.impl.SampleImpl“singleton=“true”/>Prototype。在每次对该bean请求时创立出一个新的bean对象(原型)<beanid=“sample”class=“com.fendou.service.impl.SampleImpl“scope=“prototype”/>其他作用域:request、session、globalsession延迟初始化Bean默认的情况下在容器启动时会初始化Bean。但可以通过指定<bean>元素中的lazy-init属性来延迟初始化Bean,这样将会在第一次获取Bean的时候初始化Bean
<beanid="sample"class="com.fendou.service.impl.SampleImpl“lazy-init=“true”/>如果想对所有的Bean都延迟初始化,可以修改<beans>元素
<beansdefault-lazy-init=“true”>Bean的生命周期Bean的生命周期包括:Bean的定义、Bean的初始化、Bean的使用、Bean的销毁。Bean的初始化可以通过指定init-method属性来完成
<beanid="sample"class="com.fendou.service.impl.SampleImpl“ init-method=“init”/>
或者通过实现接口,实现afterPropertiesSet()方法来完成Bean的销毁可以通过指定destory-method属性来完成
<beanid="sample"class="com.fendou.service.impl.SampleImpl“destory-method=“clearup”/>
或者通过实现接口,实现destory()方法来完成Bean的自动装配模式Spring提供了5种自动装配的模式,从而减少一些属性的设置。在<bean>元素中设置autowire属性byName模式,通过Bean的属性名字进行自动装配byType模式,通过在配置文件查找一个属性类型一样的Bean来进行自动装配constructor模式,是指根据构造函数的参数尽心自动装配autodetect模式,通过对Bean检查类的内部来选择是constructor还是byType模式no模式,不使用自动装配在企业应用开发过程中,是不主张使用自动装配模式的Bean的依赖检查Spring允许Bean在初始化之前强制执行其他Bean的初始化。通过的<bean>元素中指定depends-on属性设置通过在<bean>元素中指定dependency-check属性来检查Bean的每个属性是否设定完成。simple模式,对根本类型、字符串、集合进行依赖检查object模式,对依赖的对象进行依赖检查all模式,对全部属性进行依赖检查none模式,不进行依赖检查基于注解的依赖注入基于注解〔Annotation〕的配置有越来越流行的趋势,Spring2.5顺应这种趋势,提供了完全基于注释配置Bean、装配Bean的功能,学员可以使用基于注解的SpringIoC替换原来基于XML的配置。注解配置相对于XML配置具有很多的优势:它可以充分利用Java的反射机制获取类结构信息,这些信息可以有效减少配置的工作。注释和Java代码位于一个文件中,而XML配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和Java代码放在一起,有助于增强程序的内聚性。而采用独立的XML配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。因此在很多情况下,注解配置比XML配置更受欢送,注解配置有进一步流行的趋势。Spring2.5的一大增强就是引入了很多注释类,现在我们已经可以使用注解配置完成大局部XML配置的功能。基于注解的依赖注入spring注解的使用1、要使用注解来代替xml的配置,要引入如下jar包:%spring_home%\lib\j2ee\common-annotations.jar。而且在applicationContext.xml中要参加<context:annotation-config/>的命名空间。2、引入spring头文件3、写@开头注解@Resource注入接口配置文件修改<beansxmlns=":///schema/beans"xmlns:xsi=":///2001/XMLSchema-instance"xmlns:context=":///schema/context"xsi:schemaLocation=
:///schema/context/spring-context-2.5.xsd"><context:annotation-config/></beans>基于注解的依赖注入@Resource注解以前我们使通过配置xml文件方式来表示Bean之间的依赖关系,而现在我们可以通过@Resource方式来表示Bean之间的依赖关系packagecom.fendou;importjavax.annotation.Resource;publicclassUser{//通过@Resource注解把配置文件中id为user1的bean注入给属性user1
@Resource(name="user1")privateUser1user1;@Resource(name="user2")privateUser2user;//省略了getter和setter方法}基于注解的依赖注入@PostConstruct和@PreDestroy注解Spring容器中的Bean是有生命周期的,Spring允许在Bean在初始化完成后以及Bean销毁前执行特定的操作,您既可以通过实现InitializingBean/DisposableBean接口来定制初始化之后/销毁之前的操作方法,也可以通过<bean>元素的init-method/destroy-method属性指定初始化之后/销毁之前调用的操作方法。关于Spring的生命周期已经在前面的章节详细讲解过了,现在我们用@PostConstruct和@PreDestroy这两个注释从新测试spring的生命周期。标注了@PostConstruct的方法将在类实例化后调用,而标注了@PreDestroy的方法将在类销毁之前调用。请看User.java类packagecom.fendou;importjavax.annotation.PostConstruct;importjavax.annotation.PreDestroy;publicclassUser{@PostConstructpublicvoidinit(){System.out.println("init");}@PreDestroypublicvoiddestory(){System.out.println("destory");}}下面是spring的配置<context:annotation-config/><beanid="user"class="com.fendou.User"></bean>基于注解的依赖注入@Component注解虽然我们可以通过@Resource在Bean类中使用自动注入功能,但是Bean还是在XML文件中通过<bean>进行定义,也就是说,在XML配置文件中定义Bean,通过@Resource为Bean的成员变量、方法入参或构造函数入参提供自动注入的功能。能否也通过注解定义Bean,从XML配置文件中完全移除Bean定义的配置呢?答案是肯定的,我们通过Spring2.5提供的@Component注释就可以到达这个目标了。下面,我们完全使用注释定义Bean并完成Bean之间装配:使用@Component注解的User1,仅需要在类定义处,使用@Component注解就可以将一个类定义了Spring容器中的Bean。方法:1、参加spring配置文件中参加
<context:component-scanbase-package="com.spring.bean"></context:component-scan><beansxmlns=":///schema/beans"xmlns:xsi=":///2001/XMLSchema-instance"xmlns:context=":///schema/context"xsi:schemaLocation="><context:component-scanbase-package="com.spring.bean"></context:component-scan>
用@Component方法注入到spring中.@ComponentpublicclassUser1{ publicvoidprint(){System.out.println("我是User1");}}基于注解的依赖注入使用@Component注解的User2@ComponentpublicclassUser2{publicvoidprint(){System.out.println("我是User2");}}使用@Component注解的Userpackagecom.fendou;importjavax.annotation.Resource;importorg.springframework.stereotype.Component;@Component("user")publicclassUser{@Resource(name="user1")privateUser1user1;@Resource(name="user2")privateUser2user2;//省略了getter和setter方法 }基于注解的依赖注入@Scope注解默认情况下通过@Component定义的Bean都是singleton的,如果需要使用其它作用范围的Bean,可以通过@Scope注释来到达目标,如以下代码所示:packagecom.fendou;importorg.springframework.context.annotation.Scope;importorg.springframework.stereotype.Component;@Component@Scope("prototype")publicclassUser1{publicvoidprint(){ System.out.println("我是User1");}}其他注解@Repository 持久层@Service 业务层@Controller 控制层〔Web层〕@Component对那些比较中立的类进行注解。
这3个注解和@Component是等效的和@Component相比没有什么新意,但Spring将在以后的版本中为它们添加特殊的功能AOP面向切面(方面)编程〔AspectOrientedProgramming,AOP)在实际应用中,常常会写一些与具体业务无关的代码,例如日志、权限、异常处理、事务处理等。在编写的过程中,将这样的代码编写到一起,所以处处都有重复的代码。使用AOP,就是将这种和业务逻辑关系不大的代码别离出来,到达重用的目的。AOP是一种思想,和具体的实现技术无关。任何一种符合AOP思想的技术实现,都可以看作AOP的实现。Spring的AOP是建立在Java的动态代理机制之上的。Java的反射机制什么是动态语言?根本的定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection〔反射〕Java的反射机制:Java程序可以加载一个运行时才得知名称的class,得悉其完整构造,并生成其对象实体、或对其fields设值、或调用其methods。这种机制也可以称为introspection〔内省〕通过和包中的Method、Field、Constructor等实现。Java的动态代理普通代理模式:生成一个和类相同接口的代理类,用户通过使用代理类来封装某个实现类。
Java的动态代理:动态代理中的代理类是由java.lang.reflect.Proxy类在运行期时根据接口定义,采用Java反射机制动态生成的。结合接口,加强现有类的方法实现。使用CGLIB代理AOP的概念连接点(JoinPoint),指程序运行中的某个阶段点,如某个方法的调用,异常的抛出等。切入点(Pointcut)是连接点的集合,它是程序中需要注入Advice的位置的集合,指明Advice要在什么样的条件下才能触发。通知(Advice),指某个连接点所采用的处理逻辑,前例中输出日志的代码就是一个通知。Advisor,是切入点和通知之间的配置器。SpringAOP首先我们要参加如下jar文件%spring_home%\lib\aspectj\aspectjrt.jar%spring_home%\lib\aspectj\aspectjweaver.jarSpring配置文件的头要有如下内容xmlns:aop=":///schema/aop"一个例子:我们用spring实现事务,事务不是硬编码,而是 通过springaop完成SpringAOPBookFacade.java代码如下:packagecom.fendou;publicclassBookFacadeImplimplementsBookFacade{ publicvoidaddBook(){ System.out.println("增加图书实际的方法"); }}BookFacadeImpl.java代码如下:packagecom.fendou;publicinterfaceBookFacade{ publicvoidaddBook();}SpringAOP现在我们定义一个普通的类,里面有个方法用来开启事务,代码如下:packagecom.fendou;publicclassTransaction{publicvoidbeginTransaction(){ System.out.println("开启事务");}}Spring配置文件如下<beanid="bookFacade"class="com.fendou.BookFacadeImpl"></bean><beanid="transaction"class="com.fendou.Transaction"></bean>
<aop:config> <!--切入点--> <aop:pointcutid="trans" <!--切入点表达式--> expression="execution(*com.fendou.BookFacade.*(..))"/> <!--切面--> <aop:aspectid="myAspect"ref="transaction"> <!--通知--> <aop:beforepointcut-ref="trans"method="beginTransaction"/> </aop:aspect></aop:config>SpringAOP<beanid="bookFacade"class="com.fendou.BookFacadeImpl"></bean><beanid="transaction"class="com.fendou.Transaction"></bean>
<aop:config> <!--切入点--> <aop:pointcutid="trans" <!--切入点表达式--> expression="execution(*com.fendou.BookFacade.*(..))"/> <!--切面--> <aop:aspectid="myAspect"ref="transaction"> <!--通知--> <aop:beforepointcut-ref="trans"method="beginTransaction"/> </aop:aspect></aop:config>Spring配置文件如下SpringAOP对一些切入点的说明任意公共方法:execution(public**(..))任意一个名字以set开始的方法:execution(*set*(..))AccountService接口定义的任意方法:execution(*com.xyz.service.AccountService.*(..))在service包中定义的任意方法:execution(*com.xyz.service.*.*(..))在service包或其子包中定义的任意方法:execution(*com.xyz.service..*.*(..))
SpringAOP对于通知的一些说明@Before前置通知@AfterReturning后置通知@AfterThrowing异常通知:在方法抛出异常后执行@After最终通知:不管一个方法是如何结束的,最终通知都运行@Around环绕通知(做权限使用)通知的第一个参数必须是ProceedingJoinPoint类型。在通知体内调用它的proceed()方法会导致后台连接点方法的执行
基于@AspectJ的AOPAspectJ是AOP的一种实现,spring集成了它还是刚刚的例子BookFacade.java和BookFacadeImpl .java的代码不变Transaction.java代码有改动如下:
//通过注解定义切面@AspectpublicclassTransaction{//定义切入点及其表达式@Pointcut("execution(*com.fendou.BookFacade.*(..))")
publicvoidpointCutXxx(){};
//定义通知类型@Before("pointCutXxx()")publicvoidbeginTransaction(){ System.out.println("开启事务");}}Spring与Hibernate的集成参加hibernate相关内容Hibernate的包实体类与*.hbm.xml文件的建立参加spring相关内容引入spring的包引入spring的配置文件application.xmlSpring与Hibernate的集成让spring管理hibernate的sessionFactory<!–注入sessionFactory--><beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><propertyname="configLocation"><value>classpath:hibernate.cfg.xml</value></property></bean>配置事务管理大多数的应用程序,事务管理被分配到业务逻辑方法上,即每个业务逻辑方法是一个事务在Spring中,所有的业务逻辑对象,均是普通的POJOSpring最强大的功能在于,它可以在普通的POJO上面实现声明式的事务管理〔它使用AOP来完成这样的任务〕步骤如下:定义一个事务管理器配置事务的传播特性
Spring与Hibernate的集成定义一个事务管理器Spring与Hibernate的集成<!--配置事务管理器--><beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><propertyname="sessionFactory"><reflocal="sessionFactory"/></property></bean>配置事务的传播特性Spring与Hibernate的集成<!--配置事务特性-->
<tx:adviceid="txAdvice"transaction-manager="transactionManager"><tx:attributes> <!--对get/find/search开头的方法要求只读事务--> <tx:methodname="get*"propagation="SUPPORTS"read-only="true"/> <tx:methodname="find*"propagation="SUPPORTS"read-only="true"/> <tx:methodname="search*"propagation="SUPPORTS"read-only="true"/> <!--对其它方法要求事务--> <tx:methodname="*"propagation="REQUIRED"/></tx:attributes></tx:advice><!--配置那些类的方法进行事务管理--><aop:config>
<aop:pointcutid="allManagerMethod"expression="execution(*com.fendou.manager.*.*(..))"/>
<aop:advisoradvice-ref="txAdvice"pointcut-ref="allManagerMethod"/></aop:config>Spring的事务级别Spring提供7种事务级别REQUIRED,如果当前没有事务,就新建一个事务,如果已经存在一个事务中,参加到这个事务中。这是最常见的选择。SUPPORTS,支持当前事务,如果当前没有事务,就以非事务方式执行。MANDATORY,使用当前的事务,如果当前没有事务,就抛出异常。REQUIRES_NEW,新建事务,如果当前存在事务,把当前事务挂起。NOT_SUPPORTED,以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。PROPAGATION_NEVER,以非事务方式执行,如果当前存在事务,那么抛出异常。PROPAGATION_NESTED,如果当前存在事务,那么在嵌套事务内执行。如果当前没有事务,那么执行与PROPAGATION_REQUIRED类似的操作。创立可以支持Hibernate的DAO对象HibernateDaoSupport这是Spring提供的集成Hibernate的基类,所有用Hibernate实现的DAO,均需要继承它从这个类中,可以获取Hibernate的各种核心接口,如Session、SessionFactory等这个类的两个重要方法getSession()和getSessionFactory()HibernateTemplateHibernateTemplate是Spring封装的Hibernate操作接口,类似于Session接口可以调用HibernateDaoSupport提供的getHibernateTemplate()方法获取HibernateTemplate对象Template模式:在父类定义一个操作中算法的骨架或操作顺序,而将一些步骤的具体实现延迟到子类中。DAO的配置Dao的配置例如必须注入sessionFactory或dataSource的定义<beanid=“staffDao”class=“com.fendou.staff.dao.StaffDaoImpl"><propertyname="sessionFactory"><refbean=“sessionFactory”/></property></bean><beanid=“staffDaoJDBC”class=“com.fendou.staff.dao.StaffDaoJDBCImpl"><propertyname=“dataSource"><refbean=“dataSource”/></property></bean>配置ServiceService配置例如<beanid=“staffHelper”class=“com.fendou.staff.service.StaffHelperImpl"><propertyname=“staffDao”ref=“staffDao”/><propertyname=“staffDaoJDBC”ref=“staffDaoJDBC”/></bean>Spring与struts的集成参加struts相关内容struts的包struts-config.xml参加spring相关内容引入spring的包引入spring的配置文件application.xmlSpring与struts的集成让系统启动的时候加载ApplicationContext.xml(在web.xml中增加如下内容)<context-param><param-name>contextConfigLocation</param-name><param-value> /WEB-INF/classes/applicationContext-*.xml, classpath*:applicationContext-*.xml</param-value></context-param>
<listener><listener-class></listener-cla
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度厂房拆迁补偿与社区和谐共建协议书范本4篇
- 2025年度建筑垃圾清运及拆除合同模板4篇
- 个人汽车抵押贷款合同范本2024版B版
- 2025年度柴油发电机环保排放标准达标改造合同4篇
- 2024石材加工厂设备安装与调试的合同协议
- 2025年度旅游目的地策划合同范本(十)4篇
- 2025年度互联网平台产品试用合作框架合同4篇
- 2025年度科技企业孵化器场地无偿借用协议3篇
- 二零二五年度文化产业园场地租赁与文化项目合作合同6篇
- 专业贷款协议范本2024年版一
- 2024-2025学年八年级上学期1月期末物理试题(含答案)
- 2025年国新国际投资有限公司招聘笔试参考题库含答案解析
- 制造车间用洗地机安全操作规程
- 2025河南省建筑安全员-A证考试题库及答案
- 商场电气设备维护劳务合同
- 油气田智能优化设计-洞察分析
- 陕西2020-2024年中考英语五年真题汇编学生版-专题09 阅读七选五
- 砖混结构基础加固技术方案
- 助产专业的职业生涯规划
- 2023年国家公务员录用考试《行测》真题(行政执法)及答案解析
- 新《国有企业管理人员处分条例》知识竞赛考试题库500题(含答案)
评论
0/150
提交评论