zoukankan      html  css  js  c++  java
  • 详解SSH注解配置,bean注解、事物注解等

    使用过SSH注解的屌丝们都知道,要想使用注解需要在applicationContext.xml配置文件里面开启注解配置,开启方式如下:
    1.头部声明需加入
    xmlns:context="http://www.springframework.org/schema/context"
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd

    2.文件内部配置
    <context:annotation-config />  <!--打开注解模式  -->
    <context:component-scan base-package="com.newer" /> <!-- 开启自动扫描Bean,一般配到基础包即可。使用这个可以不配置-打开注解模式 -->


    Bean注解管理
    Spring自动扫描管理Bean注解有四种配置模式,如下
    @Service     用于业务层(service) 示例:@Service("baseService")
    @Controller  用于控制层(action)  示例:@Controller("baseAction")
    @Repository  用于数据访问层(dao) 示例:@Repository("baseDao")
    @Component   泛型配置(当组件不确定时用),以上3种配置是基于此扩展
    推荐不同分层采用对应的配置,切忌所有配置都使用@Component

    Spring事物注解配置
    <!-- xml,@事务配置 -->
    <bean id="hibernateTransaction" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
     <property name="sessionFactory">
      <ref bean="sessionFactory" />
     </property>
    </bean>
    <tx:annotation-driven transaction-manager="hibernateTransaction" proxy-target-class="true" />

    @Transactional            //默认事务配置
    @Transactional(rollbackFor=Exception.class) //出现Exception异常也回滚
    @Transactional(noRollbackFor=Exception.class) //出现Exception异常不回滚
    @Transactional(readOnly=true) //只读,性能优化,效率高
    @Transactional(propagation=Propagation.NOT_SUPPORTED)  //不开启事务
    @Transactional(propagation=Propagation.REQUIRED) //如果有事务,那么加入事务,没有的话新建一个(不写的情况下)
    @Transactional(propagation=Propagation.NOT_SUPPORTED) //容器不为这个方法开启事务
    @Transactional(propagation=Propagation.REQUIRES_NEW) //不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
    @Transactional(propagation=Propagation.MANDATORY) //必须在一个已有的事务中执行,否则抛出异常
    @Transactional(propagation=Propagation.NEVER) //必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
    @Transactional(propagation=Propagation.SUPPORTS) //如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
    @Transactional(propagation=Propagation.NESTED)
    @Transactional(propagation = Propagation.REQUIRED,readOnly=true) //readOnly=true只读,不能更新,删除
    @Transactional(propagation = Propagation.REQUIRED,timeout=30)//设置超时时间
    @Transactional(propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)//设置数据库隔离级别

    注解事物是可以依赖类继承而继承的,例如某个service继承了baseService,那么它也会继承baseService的事物声明
    屌丝们可以根据不同需求配置不同事物传播属性,下面是常见的事物隔离级别和传播属性:

    1.事务的隔离级别

    DEFAULT

    采用数据库默认隔离级别

    READ_UNCOMMITTED

    读未提交数据( 会出现脏读,不可重复读,幻读 ,避免了 第一类丢失 更新 )

    READ_COMMITTED

    读已提交的数据(会出现不可重复读,幻读)

    REPEATABLE_READ

    可重复读(会出现幻读)

    SERIALIZABLE

    串行化

    2. 事务的传播属性

    REQUIRED

    需要事务,存在:加入,不存在:自己创建.这是spring默认的传播行为.

    SUPPORTS

    支持事务, 存在:加入,不存在:不使用事务

    MANDATORY

    只能在一个已存在事务中执行,业务方法不能发起自己的事务,如果业务方法在没有事务的环境下调用,就抛异常

    REQUIRES_NEW

    业务方法总是会为自己发起一个新的事务,如果方法已运行在一个事务中,则原有事务被挂起,新的事务被创建,直到方法结束,新事务才结束,原先的事务才会恢复执行.

    NOT_SUPPORTED

    声明方法需要事务,如果方法没有关联到一个事务,容器不会为它开启事务.如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行.

    PROPAGATION_NEVER

    声明方法绝对不能在事务范围内执行,如果方法在某个事务范围内执行,容器就抛异常.只有没关联到事务,才正常执行.

    NESTED

    嵌套事务(一般数据库不支持)

    Action注解单例问题
    交有spring管理后,action默认是单例模式。但是项目不能全部都采用单例,使用我们需要加入相关注解切换为非单例:
    在action上面配置,@Scope("prototype") ,每个请求都会new一个新的实例

    Bean初始化执行配置(服务器启动时就执行)
    要想在bean初始化的时候就执行某个方法可使用注解@PostConstruct,同样有初始化就有结束@PreDestroy
    @PostConstruct
    public void init(){
     System.out.println("初始化执行方法");
    }

    @PreDestroy
    public void destory(){
     System.out.println("关闭资源");
    }

    推荐单例模式使用,如果bean类配置@Scope("prototype") 那该bean类只有在调用是才被初始化,
    相当于init方法也只能在bean被调用是才执行,而且bean的每次调用都会执行
    转,初始化执行的详细,及xml配置介绍:http://blog.csdn.net/ypl9935250/article/details/7013231

  • 相关阅读:
    Oracle 按一行里某个字段里的值分割成多行进行展示
    Property or method "openPageOffice" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by
    SpringBoot 项目启动 Failed to convert value of type 'java.lang.String' to required type 'cn.com.goldenwater.dcproj.dao.TacPageOfficePblmListDao';
    Maven 设置阿里镜像
    JS 日期格式化,留作参考
    JS 过滤数组里对象的某个属性
    原生JS实现简单富文本编辑器2
    Chrome控制台使用详解
    android权限(permission)大全
    不借助第三方网站四步实现手机网站转安卓APP
  • 原文地址:https://www.cnblogs.com/mgzy/p/3904334.html
Copyright © 2011-2022 走看看