Spring学习小结

一、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包
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.jar
2.2 三种bean的配置方式
(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"/>
2.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)
<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>
注意:在相应的字段上一定要有setter方法,才能注入(5)属性注入构造器
<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>
 2.6  Resource注解实例
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" />
简要说明: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默认按类型装配。
三、SSH集成实例
3.1  所需jar包
3.1.1 Hibernate3.3所用到的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.2 Spring2.5安装包所用的jar包
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标准
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中查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值