Spring 及 Spring MVC 配置说明

    xiaoxiao2021-03-25  104

    我们知道,Spring 和 Spring MVC 工作的核心基础 Bean。那么相关配置的目的就是指明需要创建哪些 Bean,给出这些 Bean 创建时所需要的初始化参数,限定 Bean 的生命周期,管理 Bean 之间的关系与工作协作方式等等。 例如,我们需要 Spring MVC 接收和返回某一些(例如使用 @RequestBody 和 @ResponseBody 注解标注的)用户请求时,将接收到 JSON 格式的请求转化为对应的实体类,或返回用户请求时将实体类转化为 JSON 格式的字符串。这些工作需要借助一个 Spring 转换工具帮我们实现,我们就需要生成一个对应转换工具的 Bean。因此,可以在 Spring MVC 的配置文件中引入如下内容。

    <!-- JSON 数据转换工具 --> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!-- JSON 数据转换 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter" /> </list> </property> </bean>

    上面 RequestMappingHandlerAdapter 的作用是开启对 @RequestBody 和 @ResponseBody 注解标注的请求和响应的转换,其转换工具是一个名字为 messageConverters 的 Bean。messageConverters 也需要由 Spring IoC 容器创建,因此也上面有创建转换工具的 Bean 配置。 又例如,当需要将 View 返回给客户端时,需要 Spring 对视图进行渲染或者配置。可以借助 Spring 提供的视图解析 Bean 来完成这个操作,只要我们在 Spring MVC 的配置文件中加入创建该 Bean 的内容,Spring 就会自动用它来处理 View 的解析配置工作。

    <!-- 定义跳转的文件的前后缀,视图模式配置--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/view/" p:suffix=".jsp" />

    实际上,对于上面的几个 Bean,除了上述的创建方式之外,还可以在 Spring MVC 的配置文件中使用 <mvc:annotation-driven/> 来引入。从 Spring 3 开始,可以用 <mvc:annotation-driven/> 来引入创建几个常用的 Bean,其中就包括上述的几个。<mvc:annotation-driven/> 默认创建的 Bean 的类原型由 org.springframework.web.servlet 包下的 DispatcherServlet.properties 文件中记录,包括了 Spring MVC 工作时所需的核心 Bean,并因之而能够识别更多的注解。如果 Spring MVC 配置中加入了 <mvc:annotation-driven/> 标签,同时又有类似上面描述的配置去创建同一个 Bean,则 Spring 将以配置的 Bean 为创建对象。因此一般地可以使用<mvc:annotation-driven/> 标签保证 Spring MVC 加载了基本的 Bean,然后针对想要自定义的组件再在配置文件中单独制定其创建参数和类型等。

    除了 Spring 提供的 Bean,我们还需要 Spring IoC 容器创建并管理其它类库或者自定义的 Bean,例如 Spring MVC 需要转发用户请求到 controller,因此需为其创建相应的控制器 Bean。又如需要使用 Spring 管理数据库连接池及数据库事务。在 Spring 2.5 之前,我们需要在配置文件中列举出所有需要被创建的 Bean,导致配置文件十分的冗长并且不易管理。例如我们有下面的 controller 和 service。

    package org.example.controller; public class UserController { private UserService userService; } package org.example.service; public class UserService { private UserDao userDao; }

    为了让 Spring 能够生成这两个 Bean,在 Spring 2.5 之前,需要在 spring-mvc.xml 中做如下配置。

    <bean id="userService" class="org.example.service.UserService" /> <bean id="userController " class="org.example.controller.UserController"> <property name="userService" ref="userService"/> </bean>

    并且我们会发现,userService 这个 Bean 变量的 userDao 属性是尚未被初始化的,如果我们需要初始化它,还需要类似地配置一个 userDao Bean,并加入到 userService 初始化过程中。一个项目中往往会需要大量的 Bean,在一个 xml 文件中维护它们是不明智的。从 Spring 2.5 开始引入的注解可以非常方便地让 Spring 通过注解的方式维护 Bean。首先,对 controller 和 service 添加注解。

    package org.example.controller; @Controller public class UserController { @Autowired @Qualifier("userService") private UserService userService; } package org.example.service; @Service public class UserService { @Autowired(required=false) private UserDao userDao; }

    然后在 spring-mvc.xml 和 spring-context.xml 文件中使用 <context:component-scan base-package="org.example.controller" /> 和 <context:component-scan base-package="org.example.service" /> 来开启注解支持。 <context:component-scan /> 标签的作用是扫描 @Controller, @Service, @Repository 和 @Component 等注解的 java 类,并将其注册到 Spring IoC 容器中;扫描 @Autowired 和 @Qualifier 注解,并将 IoC 容器中存在的 Bean 注入到相应的变量中。 注:有时候我们也会见到 <context:annotation-config /> 标签,它只有扫描 @Autowired 和 @Qualifier 注解,并将 IoC 容器中存在的 Bean 注入到相应的变量中的功能,因此在使用了 <context:component-scan /> 的地方就没必要使用 <context:annotation-config /> 标签了。

    最后,研究一下 Spring 对数据库操作的支持。WEB 项目使用数据库,首先要取得数据库连接,Spring 借助三方库来管理数据库连接池,常见的有 DBCP, C3P0 和 Druid,三者在 Spring 中的配置方式类似,都以 Bean 的形式保存在 Spring IoC 容器中,以供使用。以 使用 DBCP 为例,我们在 Spring 的配置文件中加入以下的内容,其中 database.properties 是保存了数据连接信息的资源文件。

    <context:property-placeholder location="classpath:database.properties" /> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="initialSize" value="0" /> <property name="maxActive" value="20" /> <property name="maxIdle" value="20" /> <property name="minIdle" value="0" /> <property name="maxWait" value="6000" /> "6000" /> </bean>

    这样,Spring 就能创建了一个名为 dataSource 的数据库连接池。我们在需要的地方可以通过它获得数据库连接,而不需要去手动地管理这些连接。也可以配合 Mybatis 或 Hibernate 这样的持久层框架使用数据库连接池,从而完全将数据都读写操作与业务层分离开来。 在数据库交互的过程中,Spring 利用 AOP 还提供了数据库事务管理的功能。

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="*" propagation="SUPPORTS" read-only="true"></tx:method> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="transactionPointcut" expression="execution(* org.example.service.*.*(..))"/> <aop:advisor pointcut-ref="transactionPointcut" advice-ref="txAdvice"/> ce-ref="txAdvice"/> </aop:config>

    这个配置利用 AspectJ 的 AOP 配置语法,设置了针对org.example.service 包下所有方法的拦截,以便实施数据库事务操作。

    转载请注明原文地址: https://ju.6miu.com/read-19056.html

    最新回复(0)