Spring框架中配置bean的高级属性"props"是什么作用?

2025-02-02 14:42:09
推荐回答(3个)
回答1:

给你详细讲一下SSH框架的事物管理,希望对你有帮助。
Struts+hibernate+spring整合开发web应用是相当流行的,只需要简单的配置就能轻松的对数据库进行crud操作,下面就hibernate+spring的配置做一下剖析,一边与大家一起分享经验:

1、 准备工作:

可以利用hibernate tools生成相关映射文件已经po对象、dao对象,dao也可以自己手动编写,无非就是实现crud,如果通过继承hibernate提供的HibernateDaoSupport,则可以更轻松的实现

关键就在于配置文件,下面看一个样例app.xml:




xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

















































com/ouya/User.hbm.xml









org.hibernate.dialect.MySQLDialect

true

true





























PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly





















































可以看到配置文件的步骤:

1、 配置数据源

2、 配置会话工厂(依赖注入上面的数据源,还要注入hbm映射文件[注意正确的位置]、hibernate属性文件)

3、 配置事务管理器(依赖注入上面的会话工厂)

4、 Spring中声明事务管理器(根据需要又可分为几种,但都要依赖注入上面的事务管理器,此外还需要配置transationAttributes)

后面的一些普通的bean配置就不用说了

上面的例子中使用的声明事务管理器是:TransactionProxyFactoryBean,这样的话我们就需要在后面配置目标bean,比如上面的例子中我们的原服务对象是id为us的UserService(没有实现接口),所以我们为他配置了id为userService的代理对象(目标bean),程序中使用时只能通过使用代理对象才能实现数据库操作功能(代理对象的父类是上面声明的事务管理器,一边我们使用的时候开启事务),如果直接使用服务对象就无法开启事务

程序中调用:UserService us = (UserService) app.getBean("userService");

注:userService就是上面配置的代理对象的id,而不是原服务对象的id

但是如果我们想通过原服务对象的id来使用对象,则我们需要使用代理事务管理器BeanNameAutoProxyCreator(根据beanname自动代理),上面的配置文件需要做改动,做两件事(当然先要删除原来配置的TransactionProxyFactoryBean,不然就混乱了,可能会报错的):

1、 增加一个事务拦截器













PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly







2、 定义自动代理事务管理器

















us















transactionInterceptor







然后我们在程序中调用时应如下:

UserService us = (UserService) app.getBean("us");

注:注意与上面使用TransactionProxyFactoryBean时的调用区别,此处我们用getbean时直接取原服务层对象的id,不需要去配置目标bea,这也正是

BeanNameAutoProxyCreator(根据bean名称自动代理)的含义所在

附录:

1、关于hibernate的属性详解:































Hibernate 会话厂 SessionFactory

Session 就是用于每次与数据库会话的,因此需要:

数据库的配置参数,这些参数就是 上面的数据源指定的! 因此我们只需引用即可: ref="dataSource";

实体映射配置 hibernate.cfg.xml 配置

结果缓存配置(这里使用的是开源的 ehcache)















org/springframework/samples/jpetstore/domain/Account.hbm.xml

org/springframework/samples/jpetstore/domain/Banner.hbm.xml

org/springframework/samples/jpetstore/domain/Category.hbm.xml

org/springframework/samples/jpetstore/domain/Inventory.hbm.xml

org/springframework/samples/jpetstore/domain/Item.hbm.xml

org/springframework/samples/jpetstore/domain/LineItem.hbm.xml

org/springframework/samples/jpetstore/domain/Order.hbm.xml

org/springframework/samples/jpetstore/domain/Product.hbm.xml

org/springframework/samples/jpetstore/domain/Supplier.hbm.xml













${hibernate.dialect}





true



true



true



2



100



50



update



update



true

org.hibernate.cache.EhCacheProvider



















2、Spring的transactionAttributes

PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

回答2:

PROPAGATION_REQUIRED意思是支持当前事务,如果当前没有事务,就新建一个事务。
insert*意思是对所有以insert开头的方法应用事务控制。
list, set, map和props元素分别用来设置类型为List,Set,Map和Propertis的属性值,分别用来为bean传入集合值

回答3:

知道上很多答案都是乱答,复制粘贴的人很恶心。很多采纳的答案都是错的。

  • 回答你第一个问题,引入键值对


    PROPAGATION_REQUIRED
    XXXX
    等等

key是键,prop标签中间是值。

等价于:


    
        键1=值1
        键2=值2
        等等
   

你还可以配置外部properties文件,用context标签引入:

  • 回答你第二个问题

    PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。是事物传播行为的一种(还有其他的六种),具体可以再百度。
    insert* 是执行insert开头(因为你后面跟了*)的方法时的事物如何处理。

手敲的原创回答,你找不到其他出处的。