在很多配置中一般都会吧Spring-business.xml和Spring-MVC.xml进行分开配置,这种配置就行各施其职一样,显得特别清晰。
在Spring-MVC.xml中只对@Controller进行扫描就可,作为一个控制器,其他的事情不做。
在Spring-business.xml中再通过<import resource="classpath:business-userInfo.xml" />方式引入其它配置文件进一步对配置文件进行业务细分。
二、读取外部属性文件配置数据源--定义一个事务管理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下的所有类,第三个*代表类里面的所有方法,“(..)”代表方法参数。
总结:
编程式事务是不推荐的,即使有很少事务操作,Spring发展到现在,没有理由使用编程式事务,只有在为了深入理解Spring事务管理才需要学习编程式事务使用。
推荐使用声明式事务,而且强烈推荐使用<tx:tags>方式的声明式事务,因为其是无侵入代码的,可以配置模板化的事务属性并运用到多个项目中。
而@Transaction注解事务,不过如果一个项目模块太多,service方法太多导致每个方法都要手动去加注解,是不是很麻烦,也容易出错。如果一个项目结构清晰,分层明确,那么标签形式的配置将是最直观和方便的办法。
总之,能保证项目正常工作的事务配置就是最好的。
spring 的事务传播这边就不提了,各种可百度到。但在用REQUIRES_NEW的时候,发现没有起作用。
正常情况下:A(B) B为required——new时,b事务失败会影响a事务,a事务失败不会影响b事务。
分析了一下,原因是A方法(有事务)调用B方法(要独立新事务),如果两个方法写在同一个类里,spring的事务会只处理同一个。
解决方案1:需要将两个方法分别写在不同的类里。
解决方案2:方法写在同一个类里,但调用B方法的时候,将service自己注入自己,用这个注入对象来调用B方法。
![](https://i-blog.csdnimg.cn/blog_migrate/28539366fc9f8813fdd5a9e3d8b65e1e.png)
六、常见困扰:
1、SpringMVC控制器的配置和请求的拦截
△URL-Pattern 的三种配置方式
1、完全路径匹配 以/开始 不能包含通配符* 例如:/hello /init
2、目录匹配 以/开始 , /*结尾 例如: /* /aa/* /aaa/bbb/*
3、扩展名匹配 不能以/开始 ,以*开始 例如: *.do *.action
△/和/*区别- 严格匹配优于带*的匹配
- 最长pattern优于其他pattern
- 路径匹配优于文件类型匹配
问题:springMVC如何拒绝直接访问jsp?
方法1、配置springMVC拦截器
方法2、配置过滤器
七、@Bean方式注册bean时,bean的id是什么?
@Configuration
public class MyRedisTemplate {
@Bean("myRTEemplate")
public StringRedisTemplate myRTemplate(RedisConnectionFactory fc){
StringRedisTemplate myStringRedisTemplate = new StringRedisTemplate(fc);
myStringRedisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
myStringRedisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
return myStringRedisTemplate;
}
}
1、如果@Bean("name")有指定,则是指定值;
2、如果@Bean没有指定,则是方法名,可以通过下面注解来获取
@Autowired
@Qualifier("myStringRedisTemplate")
private StringRedisTemplate myStringRedisTemplate;