Spring框架的主要功能:

1, Spring对项目中所有bean的管理

2, Spring 的事务的管理

3,Spring 提供的工具类


一 , 对项目中所有bean的管理


一,XML配置:

1,注册bean

 直接注册bean,统一通过工厂bean产生,
2,注入bean

参数注入,属性注入,auto注册(协助),用p命名空间注入等

4,spring的事件处理
实现ApplicationListener接口的注册的bean可以自行处理事件。
如 ContextRefreshedEvent(刷新加载)等等

5,其它。不常用
还有如scope(Singleton(默认),Prototype,其它web的), alias bean别名,depends-on强制初始化,lazy-init延迟加载(即第一次加载文件不先加载该bean), Lookup方法注入(主要是针对单例)


二 注解:

1,注册bean
@Component,@Repository,@Service,@Controller 顾名思义按SPRING MVC理解 中立bean,service bean,controller bean,都可以注册bean,无区别

2,注入

@Autowired,@Resource,意义都一样 ,都是byType注入bean,如果需要byName 和  @Qualifier("beanName")连用

3,bean的生命周期,scope定义

@PostConstruct 与 @PreDestroy 一个初始化,一个销毁

@Scope("prototype") 里面是Scope范围

4,配置:

注解命名空间
加入:
xmlns:context="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd

<context:annotation-config/>  这样简化注册了所有注解需要的bean
<context:component-scan base-package="org.springTest.*"/>  里面要注册的包

用注解还是可以省略很多代码,特别是不会打扰写代码时的思路,搞的一会XML一会JAVA的... ...管理起来也方便


二 ,Spring 的事务的管理


① ,Spring事务的配置

1,配置dataSource


通过JNDI


<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">

<property name="jndiName"><value>java:comp/env/jdbc/cxps</value></property>

<property name="resourceRef" value="true"/>

</bean>



通过普通配置


<context:property-placeholder location="classpath:jdbc.properties" />

<bean id="dataSource"

class="org.apache.commons.dbcp.BasicDataSource"

destroy-method="close">

<property name="driverClassName" value="${driverClassName}" />

<property name="url" value="${url}" />

<property name="username" value="${username}" />

<property name="password" value="${password}" />

<!-- 连接池启动时的初始值 -->

<property name="initialSize" value="${initialSize}" />

<!-- 连接池的最大值 -->

<property name="maxActive" value="${maxActive}" />

<!-- 最大空闲值 -->

<property name="maxIdle" value="${maxIdle}" />

<!--  最小空闲值 -->

<property name="minIdle" value="${minIdle}" />

</bean>


这种配置资源文件jdbc.properties,当然也可以直接写上


2,配置操作的ORM框架或不进行配置直接用dataSource


比如配置hibernate框架

<bean id="sessionFactory"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="dataSource">

<ref bean="dataSource" />

</property>

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">

org.hibernate.dialect.Oracle9Dialect

</prop>

</props>

</property>

<property name="mappingResources">

<list>

<value>com/cxps/report/pojo/A.hbm.xml</value></list>

</property></bean>



配置JdbcTemplate支持


 <bean id = "JdbcTemplate" 

         class = " org.springframework.jdbc.core.JdbcTemplate"> 

         <property name = "dataSource"> 

             <ref bean = "DataSource"/> 

         </property> 

     </bean> 

 </beans>


3,配置spring进行事务管理


hibernate的事务管理

<bean id="txManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">

  <property name="sessionFactory" ref="sessionFactory" />

</bean>


JdbcTemplate的事务管理直接管理jdbc就可以

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

  <property name="dataSource" ref="dataSource"/>

</bean>



②,Spring的事务属性


1,事务的传播性设置。 设置方法:


 @Transactional(propagation=required) 


 ----------默认的传播行为,指这个业务方法只能在事务中运行,如果调用它的bean有事务将会加入此事务中,那么它会创建一个新的事务运行。


 @Transactional(propagation=not_supported)


---------- 指这个业务方法不支持事务,如果在有事务的bean中运行,运行到此业务方法时

事务会被挂起;


 @Transactional(propagation=supports) 


----------指这个业务方法如果在有业务方法中运行将支持事务,没有的话就不做事务处理


 @Transactional(propagation=mandatory)


---------强制在有事务的bean中执行,否则抛出异常


 @Transactional(propagation=Never)


---------和上面那个正好相反,在有事务的bean中执行将抛出异常



以上的事务传播属性其实和EJB中的意义是一样的



还一个NESTED,没细看 


2.指定回滚异常


 @Transactional(rollbackFor=Exception.class) 与 @Transactional(no-rollback-for=Exception.class)


默认的是抛出runtimeException,如果需要抛出其它的则需要指定 


注:runtimeException一般指程序员的错误,比如数组越界,数据类型转换异常等,这类Spring称为unchecked


反之如非运行时异常为:IOException,fileCant'tfindException为普通的,这类异常必须catch;


3,事务隔离级别

主要要理解涉及到几个概念,都是指并发事务中

胀读:一个事务读取到另一个事务中未提交的更新数据

不可重复读:发生在同一个事务多次读取事务时,在第一次读取完时,刚刚好另一事务的提交数据,结果第二次读时读到了更新数据,导致两次读取结果不一样;

可重复读:和不可重复读一样,只不过第二次读取的数据结果一致,数据库形成镜像提供没更新前的数据,不受到另一事务影响

幻读:一个事务读取另一个事务已提交数据。


但这些都是由数据库控制的


4.其它设置

如:

readOnly=true,timeout等





三,Spring提供的工具类


1,资源文件,国际化,用类ResourceBundleMessageSource解析
<bean id="message" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="he"></property>  //加载he.properties资源文件
</bean>


未完待续... ...