——疯狂大白菜_1/34第一课第一课第一课第一课spring是什么是什么是什么是什么Spring是一个开源的控制反转(InversionofControl,IOC)和面向切面(AOP)的容器框架,它主要目的是简化企业开发。使用控制反转之前我们的开发模式使用控制反转之前我们的开发模式使用控制反转之前我们的开发模式使用控制反转之前我们的开发模式publicclassPersonServiceBean{privatePersonDaopersonDao=newPersonBeanDao();publicvoidsave(Personperson){personDao.save(person);}}其中,PersonBeanDao是在应用(PersonServiceBean)内部创建和维护的。而所谓的“控制反转”是指应用本身不负责依赖对象的创建和维护,依赖对象的创建和维护是有外部容器负责的。这样控制权就有应用转移到了外部容器,控制权的转移就是所谓的“反转”。依赖注入依赖注入依赖注入依赖注入((((DependecyInjection))))当我们把依赖对象交给外部容器负责创建,那面PersonServiceBean类可以改成如下:publicclassPersonServiceBean{privatePersonDaopersonDao;//通过构造器参数,让容器把创建好的依赖对象注入进PersonServiceBean,当然也可以使用setter()方法注入publicPersonServiceBean(PersonDaopersonDao){this.personDao=personDao;}publicvoidsave(Personperson){personDao.save(person);}}所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。为何要用为何要用为何要用为何要用Spring至少在我看来,在项目中引入spring立即可以带来下面的好处:降低组件之间的耦合度,实现软件各层之间的解耦。可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不需要手工控制事务,也不需要控制复杂的事务传播。——疯狂大白菜_2/34容器提供单例模式支持,开发人员不再需要自己编写实现代码。容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。容器提供众多的辅助类,使用这些类可以加快应用的开发,如:jdbcTemplate、HibernateTemplate。Spring对于主流的应用框架提供了支持,如:集成Hibernate、JPA、Struts等,这样便于应用的开发。使用使用使用使用Spring的好处的好处的好处的好处当使用spring时,我们可以使用容器提供的众多服务使用Spring,我们就不再需要手工控制事务Hibernate事务控制publicvoidsave(){Sessionsession=sessionFactory.getCurrentSession();session.beginTransaction();Infoinfo=newInfo(一起探索);session.save(info);session.getTransaction().commit();}JDBC事务控制Connectionconn=null;try{.....conn.setAutoCommit(false);容器事务管理服务JMS服务Springcore核心服务持久化服务其它Java简单对象——疯狂大白菜_3/34Statementstmt=conn.createStatement();stmt.executeUpdate(updatepersonwherename='探索');conn.commit();.....}catch(Exceptione){conn.rollback();}finally{conn.close();}另外,如果使用spring,我们也不需要处理复杂的事务传播行为publicvoidpayment(){Bean1.update();//更新金额Bean2.save();//记录操作日志}如果我们不使用Spring,针对下面这两种业务需求,我们该如何做?第一种可能的业务需求:要求Bean1.update()和Bean2.save()在同一个事务中执行。第二种可能的业务需求:要求不管Bean1.update()的事务是否成功,都需要记录操作日志。publicclassBean1{publicvoidupdate(){//注意:下面省略了一些代码Connectionconn=null;conn.setAutoCommit(false);Statement.executUpdate(updateaccountsetamount=?whereid=?);}}publicclassBean2{publicvoidsave(){//注意:下面省略了一些代码Connectionconn=null;conn.setAutoCommit(false);Statement.executUpdate(insertintolog(info)values(?));}}第一种,必须改动源代码,因为不为同一个Connection!所以事务不可能被控制,应该将Connection做为一个对象传入到两个方法,在外部打开事务,才能确保两个方法在同一个事务里面完成。如果使用如果使用如果使用如果使用Spring可以使用注释方式在可以使用注释方式在可以使用注释方式在可以使用注释方式在payment()方法前加上方法前加上方法前加上方法前加上@Transactional(propagation=Propagation.Required)就可以保证方法内的所有都在一个事务里面控制!@Transactional(propagation=Propagation.Required)publicvoidpayment(){Bean1.update();//更新金额——疯狂大白菜_4/34Bean2.save();//记录操作日志}publicclassBean1{@Transactional(propagation=Propagation.Required)publicvoidupdate(){Statement.executUpdate(updateaccountsetamount=?whereid=?);}}publicclassBean2{@Transactional(propagation=Propagation.Required)publicvoidsave(){Statement.executUpdate(insertintolog(info)values(?));}}第二种情况:将第二个方法的事务传播属性改为@Transactional(propagation=Propagation.RequiresNew)即可,这样不管方法一是否成功,方法二都会执行,应为二使用自己的事务。@Transactional(propagation=Propagation.Required)publicvoidpayment(){Bean1.update();//更新金额Bean2.save();//记录操作日志}publicclassBean1{@Transactional(propagation=Propagation.Required)publicvoidupdate(){Statement.executUpdate(updateaccountsetamount=?whereid=?);}}publicclassBean2{@Transactional(propagation=Propagation.RequiresNew)publicvoidsave(){Statement.executUpdate(insertintolog(info)values(?));}}【PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式行。PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就——疯狂大白菜_5/34把当前事务挂起。PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。】重量级与轻量级概念的划分重量级与轻量级概念的划分重量级与轻量级概念的划分重量级与轻量级概念的划分框架属于重量级还是轻量级的标准或者依据:使用多少服务,越多必然会影响到应用的发布时间或者是运行性能。对于Spring容器,它提供了很多服务,但是这些服务并不是默认为应用打开的,应用需要某种服务,还需要知名使用该服务,如果应用使用的服务很少,如:只是有那个spring核心服务,那么我们可以认为此时应用属于轻量级的,如果应用使用了spring提供的大部分服务,这时应用就是属于重量级。目前ejb容器就应为它默认为应用提供了ejb规范中所有的功能,所以它属于重量级。使用Spring需要的jar到下载spring,让后进行解压缩,在解压缩目录中找到下面jar文件,拷贝到类路径下dist\spring.jarlib\jakart-commons\commons-logging.jar如果使用切面编程(AOP),还需要下列jar文件lib/aspectj/aspectjweaver.jar和aspectjrt.jarlib/cglib/cglib-nodep-2.1_3.jar如果使用了JSR-250中的注释,如@Resource/@PostConstruct/@ProDestory,还需要下列jarlib\j2ee\common-annotations.jarspring的配置文件模板该配置模板可以从spring的参考手册或spring的例子中得到。配置文件的取名可以任意,文件可以保存在任何目录下,但考虑到通用性,一般放在类路径下。\spring-framework-2.5.6\docs\reference\html_single实例化spring容器实例化spring容器常用的两种方式:方法一:在类路径下寻找配置文件来实例化容器ApplicationContextctx=newClassPathXmlApplicationContext(newString[]{“beans.xml”});方法二:在文件系统路径下寻找配置文件来实例化容器——疯狂大白菜_6/34ApplicatonContextctx=newFileSystemXmlApplicatonContext(newString[]{“beans.xml”});Spring的配置文件可以指定多个,可以通过string数组传入。通常通常通常通常((((不管在开发还是测试以及生成过程中不管在开