一、基本介绍
在项目开发中,spring管理的 Service和 Respository,SrpingMVC管理 Controller和ControllerAdvice,分工明确
当我们同时配置application.xml, springDispatcherServlet-servlet.xml , 那么注解的对象会被创建两次, 故一定要区别开
二、具体做法
1、写好注解, @Repository @Service @ Controller ,看图
2、在web.xml中配置spring(包括spring的加载监听器), springMVC各自的配置文件
<web-app>
<!-- 配置spring-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置spring的加载监听器-->
<!-- 在启动Web容器时,自动装配applicationContext.xml的配置信息-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 假如不在默认位置(WEB-INF下,默认名称必须是 springDispatcherServlet-servlet.xml),
可以使用以下代码自定义-->
<!-- <init-param>-->
<!-- <param-name>contextConfigLocation</param-name>-->
<!-- <param-value>classpath:WEB-INF/springDispatcherServlet-servlet.xml</param-value>-->
<!-- </init-param>-->
<!-- 表示tomcat加载servlet的顺序,数字越小越先加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<!-- 这里注意这种url请求形式配置成/这样支持restfulT-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3、在applicationContext.xml, 配置如下
<context:component-scan base-package="com.bin.springMVC.*">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
4、在 springDispatcherServlet-servlet.xml (注意必须是这个名字,第一段可改,如果不指定位置,那么spirngMVC的配置文件的位置必须在WEB-INF下), 配置如下
<!--配置自动扫描包-->
<context:component-scan base-package="com.bin.springMVC.*" use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
<!--配置用 InternalResourceViewResolve
如果我们在目标方法返回一个"loginoK”则真实的资源就是
prefix/名字/suffixloginOK => /WEB-INF/pages/loginOk.jsp-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 加入两个常规配置,才会加载.js .css文件-->
<mvc:annotation-driven></mvc:annotation-driven>
<mvc:default-servlet-handler/>
5、效果,启动项目后,各个注解的对象只被创建一次
三、bean的引用
注意bean的相互引用关系, 即controller会引用 service , 但service不会去引用controller