SpringMVC个人笔记

来源:互联网 发布:男士去角质 知乎 编辑:程序博客网 时间:2024/06/06 00:02
一、组件扫描
1、<context:component-scan>的子标签

在很多配置中一般都会吧Spring-business.xml和Spring-MVC.xml进行分开配置,这种配置就行各施其职一样,显得特别清晰。

在Spring-MVC.xml中只对@Controller进行扫描就可,作为一个控制器,其他的事情不做。

在Spring-business.xml中再通过<import resource="classpath:business-userInfo.xml" />方式引入其它配置文件进一步对配置文件进行业务细分。

二、读取外部属性文件配置数据源
<!-- 读取properties配置文件 -->
<!-- <bean id="propertyConfigurer" 
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">   
        <list>           
            <value>
            WEB-INF/classes/db.properties
            </value>
        </list>
    </property>
</bean> -->
<!-- 扫描外部配置文件 spring2.5以后可通过该方式简化写法-->
<!-- PropertyPlaceholderConfigurer内置的功能非常丰富,如果它未找到${xxx}中定义的xxx键,
它还会去JVM系统属性(System.getProperty())和环境变量(System.getenv())中寻找。
查找顺序:首先会去用户变量中寻找,其次系统变量,最后为配置中制定属性文件。
通过启用systemPropertiesMode和searchSystemEnvironment属性,开发者能够控制这一行为。 -->    
<context:property-placeholder location="classpath:db.properties" />
<!-- 配置数据库 -->
    <bean id="dataSource220" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value="${driverClassName}"/>
      <property name="url" value="${url}"/>
      <property name="username" value="${db.username}"/>
      <property name="password" value="${password}"/>
      <property name="initialSize" value="${initialSize}"/>
      <property name="maxIdle" value="20"/>
      <property name="minIdle" value="10"/>
      <property name="maxActive" value="100"/>
      <property name="maxWait" value="120000"/>
      <property name="logAbandoned" value="true"/>
      <property name="removeAbandoned" value="true"/>
      <property name="removeAbandonedTimeout" value="3600"/>
    </bean> 

三、Spring事务管理(采用生命声明式事务管理,核心原理aop)
1、编程式事务管理(全注解):
         (1)、添加注解驱动 
         <!-- 添加注解驱动 -->
    <tx:annotation-driven transaction-manager="txManager"/>
        ( 2)、添加事务管理
    <!-- 添加事务管理 -->
    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource220" />
    </bean>   
         (3)、在需要添加事物管理的java类上添加@Transactional
说明:如果不存在类重复扫描的情况下,以上三步即可正常开启事务管理功能。
2、声明式事务管理(tx:advice标签方式)

             --定义一个事务管理Bean

                <bean id="txManager">

            --定义一个事务通知,指定遇到哪些方法采取哪些事务管理策略

                <tx:advice>

            --定义一个切入点

                <aop:pointcut>

            --将切入点和事务通知集合

                <aop:advisor>

实例:

<tx:advice id="txadvice" transaction-manager="transactionManager">

    <tx:attributes>

        <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception" />

        <tx:method name="modify*" propagation="REQUIRED" rollback-for="Exception" />

        <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/>

        <tx:method name="*" propagation="REQUIRED" read-only="true"/>

    </tx:attributes>

</tx:advice>


<aop:config>

    <aop:pointcut id="daoMethod" expression="execution(* com.dao.*.*(..))"/>

    <aop:advisor pointcut-ref="daoMethod" advice-ref="txadvice"/>

</aop:config>

说明:

expression="execution(* com.dao.*.*(..))"

其中第一个*代表返回值,第二*代表dao下的所有类,第三个*代表类里面的所有方法,“(..)”代表方法参数。


总结:

          注解编程式事务管理:该方式的优点是使事务管理更具体更细致切不容易出错。
     声明式tx标签事务管理方式:该方式的优点是事务控制不侵入代码。

   编程式事务是不推荐的,即使有很少事务操作,Spring发展到现在,没有理由使用编程式事务,只有在为了深入理解Spring事务管理才需要学习编程式事务使用。 
       推荐使用声明式事务,而且强烈推荐使用<tx:tags>方式的声明式事务,因为其是无侵入代码的,可以配置模板化的事务属性并运用到多个项目中。 
       而@Transaction注解事务,不过如果一个项目模块太多,service方法太多导致每个方法都要手动去加注解,是不是很麻烦,也容易出错。如果一个项目结构清晰,分层明确,那么标签形式的配置将是最直观和方便的办法。 
       总之,能保证项目正常工作的事务配置就是最好的。 

来源: http://blog.csdn.net/edward0830ly/article/details/8703123

四、事务管理的属性

       spring 的事务传播这边就不提了,各种可百度到。但在用REQUIRES_NEW的时候,发现没有起作用。

正常情况下:A(B) B为required——new时,b事务失败会影响a事务,a事务失败不会影响b事务。

分析了一下,原因是A方法(有事务)调用B方法(要独立新事务),如果两个方法写在同一个类里,spring的事务会只处理同一个。

解决方案1:需要将两个方法分别写在不同的类里。

解决方案2:方法写在同一个类里,但调用B方法的时候,将service自己注入自己,用这个注入对象来调用B方法。

来源: http://blog.csdn.net/arsenal04/article/details/41007545

五、SpringAOP动态方法代理(@AspectJ方式实现)
 

六、常见困扰:

1、SpringMVC控制器的配置和请求的拦截

问题:web.xml里面配置/和/*的区别?

△URL-Pattern 的三种配置方式

1、完全路径匹配   以/开始   不能包含通配符*       例如:/hello   /init

2、目录匹配   以/开始    ,   /*结尾   例如:   /*   /aa/*    /aaa/bbb/*

3、扩展名匹配   不能以/开始 ,以*开始     例如:  *.do   *.action

△/和/*区别
/定义默认servlet映射
/*表示拦截所有类型的请求
问题、servlet映射规则?
  1. 严格匹配优于带*的匹配
  2. 最长pattern优于其他pattern
  3. 路径匹配优于文件类型匹配
  4.pattern/总是匹配没有其他pattern匹配的request 

问题:springMVC如何拒绝直接访问jsp?

方法1、配置springMVC拦截器

方法2、配置过滤器


0 0
原创粉丝点击