基于l和l的配置与
深⼊理解
⽬录
前沿
1、l是全局的
2、l 是spring mvc的配置
(1)l配置
1、⾸先介绍⼀下启动⼀个项⽬的整体流程:
2、现在开始正式讲解l中的配置内容
⾸先准备db.properties 配置⽂件
SqlSessionTemplate介绍:
事务管理的两种⽅式:
(2)l的配置
1.⾃动扫描
2.注解驱动
3.静态资源处理
4.避免IE执⾏AJAX时,返回JSON出现下载⽂件
5.启动SpringMVC的注解功能,完成请求和注解POJO的映射
6.配置⽂件上传
7.配置viewResolver视图解析
8.定义跳转的⽂件的前后缀,视图模式配置
前沿
1、l是全局的
应⽤于多个serverlet,配合listener⼀起使⽤,l中配置如下:
<!-- 配置 -->
<listener>
<listener-class>org.t.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>l</param-value>
</context-param>
2、l 是spring mvc的配置
<!--配置springmvc DispatcherServlet-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:l</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
如果直接采⽤SpringMVC,只需要把所有相关配置放到l中就好,⼀般spring mvc项⽬⽤不到多个serverlet。开始进⼊正题。
(1)l配置
spring的核⼼配置⽂件的名字叫做 l,后期也可以通过配置⽂件中的配置修改名称,在l中进⾏如下配置:
1、⾸先介绍⼀下启动⼀个项⽬的整体流程:
1、tomcat启动⼀个WEB项⽬的时候,WEB容器会去读取它的配置⽂件l,读取<listener>和<context-param>两
个结点。
2、紧接着,容器创建⼀个ServletContext(servlet上下⽂,全局的),这个web项⽬的所有部分都将共享这个上下⽂。
可以把ServletContext看成是⼀个Web应⽤的服务器端组件的共享内存,在ServletContext中可以存放共享数据。
ServletContext对象是真正的⼀个全局对象,凡是web容器中的Servlet都可以访问
3、容器将<context-param>转换为键值对,并交给servletContext。
4、容器创建<listener>中的类实例,创建。 listener中ContextLoaderListener的作⽤就是启动Web容器
时,监听servletContext对象的变化,获取servletContext对象的<context-param>,来⾃动装配ApplicationContext的配置信息。(即加载l⽂件)
2、现在开始正式讲解l中的配置内容
1、扫描service层和dao层注解(spring中扫描service,然后再在SpringMVC中扫描controller中扫描controller。因为如果Controller在主容器中进⾏扫描的话会扫描到原样的service,那时service还没有进⾏事务处理可能会引起事务失效)
如图所⽰:⾸先是开启注解扫描,其次是设置注解扫描的包:com.dao和com.service
A、 <context:annotation-config/> :⾃动简化的完成相应bean的声明。
启动spring的⼀些注解,主要包括:向 Spring 容器注册如下4 个BeanPostProcessor。
1、AutowiredAnnotationBeanPostProcessor @Autowired注解
2、CommonAnnotationBeanPostProcessor @ Resource 、@ PostConstruct、@ PreDestroy
3、PersistenceAnnotationBeanPostProcessor @PersistenceContext注解
4、RequiredAnnotationBeanPostProcessor 这 @Required的注解
注册这4个 BeanPostProcessor的作⽤,就是为了你的系统能够识别相应的注解。
<context:annotation-config/>的⽅式等价于以下的传统⽅式:
<bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/>
但是配置更加简单,⽅便,不需要按照传统的⽅式⼀条⼀条配置显得有些繁琐和没有必要,于是spring给我们提供
<context:annotation-config/>的简化配置⽅式,⾃动帮你完成声明。
B、设置使⽤注解的类所在的包主要是dao层和service层,剔除controller层注解扫描
注意,这部分主要是扫描项⽬中除了controller以外的其他层的注解。配置这部分的⽬的是在于扫描service包和dao包⾥⾯的类,只要有@Service或者@Repository就注册成spring容器中的Bean,下次可以通过@Autowired直接注⼊。
如果有B的配置,可以不需要A的配置,<context:component-scan base-package=”XX.XX”/> ,该配置项其实也包含了⾃动注⼊上述processor的功能,因此当使⽤ <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。
2、配置数据库相关内容(这部分内容可以单独⽤⼀个l进⾏配置,本项⽬没有单独进⾏配置,⽽是和l⽂件⼀起配置的)
配置db.properties⽂件-----》配置数据源(dataSource(可以采⽤数据库连接池),可以配置多个数据源(如果有多个数据库的话))---》配置spring+mybatis(Spring和Mybatis整合有两种⽅式)----》配置事务(事务管理器、配置事务传播特性、事务aop配置)
⾸先准备db.properties 配置⽂件
1、所在项⽬⽂件夹的位置:
2、l⽂件定位到dbconfig.properties⽂件
3、dbconfig.properties⽂件内容
4、在l中配置数据源,后期需要可以在其中添加多个属性配置。
springmvc的注解有哪些5、配置spring+mybatis(主要是获取sqlSession对象,通过MapperScannerConfigurer ⾃动装配SqlSessionFactory 或SqlSessionTemplate,MapperFactoryBean 创建的代理类实现了 UserMapper 接⼝,并且注⼊到应⽤程序中)
创建SqlSessionFactory的过程:
①定义Configuration对象(包括数据源,事务,mapper⽂件资源以及影响数据库⾏为属性设置的settings)
--> ②由Configuration对象创建⼀个SqlSessionFactoryBuilder对象
--> ③由SessionFactoryBuilder获得SqlSessionFactory实例
--> ④由SqlSessionFactory实例获得SqlSession实例,操作数据库
在 MyBatis 中,使⽤ SqlSessionFactoryBuilder创建SqlSessionFactory ,进⽽来创建 SqlSession。⼀旦你获得⼀个 session 之后,你可以使⽤它来执⾏映射语句,提交或回滚连接,最后,当不再需要它的时候, 你可以关闭 session。
Mybatis社区⾃⼰开发了⼀个Mybatis-Spring⽤来满⾜Mybatis⽤户整合Spring的需求。使⽤ MyBatis-Spring 之后, 会使⽤SqlSessionFactoryBean来代替SqlSessionFactoryBuilder创建SqlSessionFactory,然后可以使⽤下⾯两种⽅式使⽤sqlSession。
1、SqlSessionTemplate;
2、SqlSessionDaoSupport;上⾯做法没问题,但就是在l中需要配置所有的dao层实现,把sqlSession或者sqlSessionFactory注⼊进去,可以使⽤MapperScannerConfigurer来解决这个问题,MapperScannerConfigurer帮我们⾃动装配SqlSessionFactory 或 SqlSessionTemplate,因此不需要我们在l⽂件中注⼊sqlSession或者sqlSessionFactory。
SqlSessionFactoryBean、SqlSessionFactory、SqlSession、SqlSessionTemplate之间的关系。
SqlSessionFactoryBean是⽣产SqlSessionFactory的⼀种⼯⼚Bean;SqlSessionFactory是⼀种⽣产SqlSession的⼯⼚;SqlSession是代表数据库连接客户端和数据库Server之间的会话信息;SqlSessionTemplate是SqlSession的⼀个具体实现。SqlSessionTemplate介绍:
Mybatis-Spring提供了⼀种直接使⽤SqlSession的⽅式(⼀个实现了SqlSession接⼝的SqlSessionTemplate实现类)
1、它是线程安全的,可以被多个Dao同时使⽤;
2、它跟Spring的事务进⾏了关联,确保当前被使⽤的SqlSession是⼀个已经和Spring的事务进⾏绑定了的,⽽且它还
可以⾃⼰管理Session的提交和关闭。
⽅式⼀:需要l⽂件,mapper⽂件⾥⾯写sql语句,UserMapper接⼝类⾥⾯不写sql语句
⽅式⼆:不需要l⽂件,但是需要在UserMapper⾥⾯写sql语句
5.1、需要配置MapperScannerConfigurer ⾃动扫描将Mapper接⼝⽣成代理注⼊到Spring,这部分实现l⽂件映射成mapper接⼝类的实现类,⾃动注⼊到spring中,这样我们就不⽤写mapper接⼝的实现类了。
原理:Mybatis在与Spring集成的时候可以配置MapperFactoryBean来⽣成Mapper接⼝的代理,MapperFactoryBean 创建的代理类实现了 UserMapper 接⼝,并且注⼊到应⽤程序中。因为代理创建在运⾏时环境中(Runtime,译者注) ,那么指定的映射器必须是⼀个接⼝,⽽不是⼀个具体的实现类。MapperScannerConfigurer , 它将会查类路径下的映射器并⾃动将它们创建成 MapperFactoryBean。(需要增加对MapperFactoryBean源码的理解)
注意 , 没有必要去指定 SqlSessionFactory 或 SqlSessionTemplate , 因为 MapperScannerConfigurer 将会创建MapperFactoryBean,之后⾃动装配。但是,如果你使⽤了⼀个以上的 DataSource ,那么⾃动装配可能会失效。这种情况下 ,你可以使⽤ sqlSessionFactoryBeanName 或 sqlSessionTemplateBeanName 属性来设置正确的 bean 名称来使⽤。这就是它如何来配置的,注意 bean 的名称是必须的,⽽不是 bean 的引⽤,因此,value 属性在这⾥替代通常的 ref。
6、配置事务管理器(声明式事务:⽤⾯向切⽚编程AOP的思想,来管理事务;编程式:TransactionTemplate)
<!-- 对dataSource 数据源进⾏事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 事务管理通知,对不同的⽅法进⾏不同的事务管理 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 对insert,create,update,modify,delete,remove 开头的⽅法进⾏事务管理,只要有异常就回滚 -->
<tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Throwable"  read-only
="false"/>
<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Throwable"  read-only="false"/>
<tx:method name="create*" propagation="REQUIRED" rollback-for="java.lang.Throwable"  read-only="false"/>
<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Throwable"  read-only="false"/>
<tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Throwable"  read-only="false"/>
<tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Throwable"  read-only="false"/>
<tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Throwable" read-only="false"/>
<!-- find,get,select,count开头的⽅法,开启只读,提⾼数据库访问性能 -->
<tx:method name="find*" read-only="true" />
<tx:method name="get*" read-only="true" />
<tx:method name="select*" read-only="true" />
<tx:method name="count*" read-only="true" />
<!-- 对其他⽅法使⽤默认的事务管理 -->
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<!-- 事务 aop 配置
<aop:pointcut>切⼊点    <aop:advice>需要注⼊的⽅法  <aop:advisor> 适配器,把注⼊的⽅法注⼊切⼊点的位置,是连接pointcut跟advice的⼯具-->
<aop:config>
<aop:pointcut id="serviceMethods" expression="execution(public * com.service..*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
</aop:config>
<!-- 配置使Spring采⽤CGLIB代理 --><!-- 开启基于@AspectJ切⾯的注解处理器 -->
<aop:aspectj-autoproxy proxy-target-class="true" />
<!-- 配置 Annotation 驱动,扫描@Transactional注解的类定义事务  -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。