一、Spring的作用 1.1 Spring的 IOC(struts) 控制反转: 应用本身不负责依赖对象的创建及维护,它是由外部容器负责的;这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的反转。 (1) SSH框架的流程为JSP-->Struts-->Service-->Hibernate。 (2) Struts是用来做应用层的,它负责调用控制业务逻辑Service层,从而控制了Service的生命周期,这样层与层之间的依赖和强,属于耦合。 (3) Spring的IoC通过控制Service的生命周期(原先由Struts控制)而达到Action(Struts) 和Service层的解耦,使程序运行起来效率更高,维护起来也方便。1.2 Spring的事务(JDBC &Hibernate) (1) JDBC中异常处理都是通过Try/Catch 来完成 (2) Hibernate中通过SessionFactory创建和维护Session来完成,在hibernate.cfg.xml中对SessionaFactory进行设定,每次对数据操作都要先获得Session实例来启动事务/提交/回滚事务还有繁琐的Try/Catch操作。 (3) Spring容器集成了JDBC Template,和Hibernate Template,它封装了所有对事务处理的功能,避免了包括异常时事务回滚,操作成功时数据提交等复杂业务功能。(4) Spring通过基于Proxy方式,基于AOP方式,基于注解方式来控制transaction 1.3 Spring的AOP (1) 在不修改源代码的情况下给某个或者一组操作添加额外的功能。像日志记录,事务处理,权限控制等功能,都可以用AOP来“优雅”地实现,使这些额外功能和真正的业务逻辑分离开来,软件的结构将更加清晰。 (2) Spring AOP是Proxy代理,是运行时绑定的。----轻量级JavaEE企业应用实战p682单个代理的配置,缺点在于每个bean都需要配置,容易使xml庞大化,原bean不具有事务性,Proxy代理bean具有事务性<!-- 定义RoleRelationshipDAOProxy代理对象 --> <bean id="roleAndRelationshipServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="target"> <ref bean="roleAndRelationshipService" /> </property> <property name="transactionAttributes"> <props> <!-- 这里的方法签名可以精确到方法全配置上 --> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
AOP切入,spring自动生成代理,且每个目标bean都具有事务性<!-- 头部加入 --> xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd" <!-- AOP配置的元素 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name ="get*" read-only="true"/> <tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="myPointcut" expression="execution(* com.ibeifeng.service.*Impl.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/> </aop:config>1.4 其他,有待补充 1) 消息服务 2) JMS服务二、Spring相关知识: 2.1 Spring依赖jar包2.2 三种bean的配置方式dist\spring.jar lib\jakata-commons\commons-loggin.jar 如果使用了切面编程还需下列jar文件 lib\aspectj\aspectjweaver.jar和aspectjrt.jar lib\cglib\cglib-nodep-2.1.3.jar 如果使用了jsr-250中的注解还需要下列jar文件 lib\j2ee\common-annotations.jar2.3 bean的作用域singleton: 返回bean的同一个实例,也是默认的作用域,无状态bean使用此作用域prototype: 每次请求都会创建一个具有用户特征的实例,有状态bean使用此作用域request、session、globalsession这三个作用域主要用在web应用 2.4 bean的生命周期(1) 当scope=singleton,即默认情况会在装载配置文件时实例化。如果希望在调用getBean时才初始化可以使用lazy-init="true" 补充如果希望希望该配置文件中的所有bean都延迟初始化则应在beans根结点中使用lazy-init="true"。(2)当scope=prototype时在调用getBean()方法时才会初始化(3) 生命周期:构造器、init方法、获取bean后的操作、destroy方法(ctx.close、注意如果bean的scope设为prototype时,当ctx.close时,destroy方法不会被调用) 2.5 属性注入方式(1)简单属性(如String)(1) 类直接生成方式 <beanid="factory" class="com.asm.dao.impl.UserDaoImplFactory2"/> (2) bean静态工厂 <bean id="userDaoImpl2" class="com.asm.dao.impl.UserDaoImplFactory" factory-method="getUserDaoImpl"/> (3) bean实例工厂 <beanid="userDaoImpl3" factory-bean="factory"factory-method="getUserDaoImpl"/>注意:在相应的字段上一定要有setter方法,才能注入(5)属性注入构造器<bean id="userServiceBean"class="com.asm.service.UserServiceBean"> <property name="id"value="10"></property> <property name="username" value="张某某"></property> </bean> (2) 对象属性-外部bean <propertyname="userDao" ref="userDaoImpl"/> (3)对象属性-内部bean <propertyname="userDao"> <bean id="temp"class="com.asm.dao.impl.UserDaoImpl"/> </property> (4)集合属性(list,map,set) <propertyname="list"> <list> <value>List值一</value> <value>List值二</value> <value>List值三</value> </list> </property>2.6 Resource注解实例<beanid="userServiceBean2"class="com.asm.service.UserServiceBean"> <constructor-arg index="0" value="李某某"/> <constructor-arg index="1"ref="userDaoImpl"/> <constructor-arg index="2"> <list> <value>List值一</value> <value>List值二</value> <value>List值三</value> </list> </constructor-arg> </bean>简要说明:Resouce注解可以在字段上标记,也可以在对应的setter方法上标记。此注解可以不使用name属性,它会自动去查找匹配的类型,先以字段名称为name的值查找,如找不到会再根据依赖对象的类型查找。但只要使用了name属性就应确保name的值在xml中有相应的bean Id对应。 2.7 Autowired注解实例@Autowired(required=false)@Qualifier("userDaoImplXXX")说明Autowired默认是按照类型来查找对应的bean实例注入如果想注入指定名称的bean实例可以使用Qualifier注解来指定名字。Required属性设为true时如果不能成功注入则会报告异常如果为设为false而不能成功注入则会将userDao3设为null。同样地,它也适用于setter方法。它属于spring特有的注解,Autowired默认按类型装配。packagecom.asm.service;public class UserServiceBean { @Resource(name ="userDaoImpl") private UserDao userDao; private UserDaouserDao2; @Resource public voidsetUserDao2(UserDao userDao2) {this.userDao2 = userDao2;} 然后在bean.xml中的配置如下 <beanid="userDaoImpl" class="com.asm.dao.impl.UserDaoImpl"/><bean id="userServiceBean"class="com.asm.service.UserServiceBean" />三、SSH集成实例 3.1 所需jar包 3.1.1 Hibernate3.3所用到的jar包3.1.2 Spring2.5安装包所用的jar包antlr-2.7.6.jar 开源语法分析生成器(lib\required) commons-collections-3.1.jar Commons集合类库与连接池有关(lib\required) dom4j-1.6.1.jar Xml解析类库(lib\required) javassist-3.9.0.GA.jar 分析、编辑和创建java字节码类库(lib\required) jta-1.1.jar 事务处理api (lib\required) slf4j-api-1.5.8.jar 日志处理 (lib\required) à 用log4j实现 hibernate3.jar 核心 ehcache-1.2.3.jar 二级缓存(lib\optional\ehcache)3.1.3 struts1.10所用到的jar包导入lib目录下的所有jar包(但为了避免jar包冲突,不要导入antlr.jar,hibernate已经导入) 3.2 经验:(1) Hibernate的开发jar包主要集中在required目录和核心jar包。(2) 日志包问题,hibernate使用了slf4j来记录日志,但是slf4j只是一个日志记录标准,可以使用它本身的实现,如slf4j-simple-1.5.8.jar或者log4j的slf4j-log4j12-1.5.8.jar来进行适配。在这里为了和spring的日志记录结合,可以用log4j日志,在spring的lib子目录中找到。(3) Spring框架中还增加了dbcp连接池相关的包(Hibernate已导入的dbcp、pool、collections)。(4) 为了与struts相结合还增加了一个spring-webmvc-struts.jar包。(5) Spring的作用是来集成其它的框架,所以对于许多集成所要用到的jar包。在查看jar包是否冲突时,其它框架只需导入它们自己所需的基本包,而对于集成所用的包都可以从spring提供的lib中查询。dist\spring.jar lib\aspectj\aspectjweaver.jar、aspectjrt.jar lib\cglib\cgligb-nodep-2.1_3.jar lib\j2ee\common-annotations.jar lib\jakarta-commons\commons-logging.jar、commons-dbcp.jar、commons-pool.jar dist\modules\spring-webmvc-struts.jar lib\log4j\log4j-1.2.15.jar 供spring与hibernate使用的日志记录jar包lib\slf4j\slf4j-log4j12-1.5.0.jar 日志转换jar包实现把log4j.jar包适配到slf4j标准
Spring学习小结
最新推荐文章于 2025-12-09 23:05:41 发布
831

被折叠的 条评论
为什么被折叠?



