来源:http://blog.youkuaiyun.com/wangkai0681080/article/details/8447916
综合网上答案
<context:annotation-config/>
隐式地向spring容器中注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 及 equiredAnnotationBeanPostProcessor 这 4 个 BeanPostProcessor。
在配置文件中使用<context:annotationconfig/>之前,必须在 <beans> 元素中声明 context 命名空间
例如:
如果你想使用@Autowired注解,那么就必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。传统声明方式如下:
- <bean class=”org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor “/>
如果想使用@ Resource 、@ PostConstruct、@ PreDestroy等注解就必须声明CommonAnnotationBeanPostProcessor
如果想使用@PersistenceContext注解,就必须声明PersistenceAnnotationBeanPostProcessor的Bean。
如果想使用 @Required的注解,就必须声明RequiredAnnotationBeanPostProcessor的Bean。同样,传统的声明方式如下:
- <bean class=”org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor”/>
一般来说,这些注解我们还是比较常用,尤其是Antowired的注解,在自动注入的时候更是经常使用,所以如果总是需要按照传统的方式一条一条配置显得有些繁琐和没有必要,于是spring给我们提供<context:annotation-config/>的简化配置方式,自动帮你完成声明。
不过,呵呵,我们使用注解一般都会配置扫描包路径选项
- <context:component-scan base-package=”XX.XX”/>
该配置项其实也包含了自动注入上述processor的功能,因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。
<context:component-scan/>
配置项不但启用了对类包进行扫描以实施注释驱动 Bean 定义的功能,同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor),因此当使用 <context:component-scan/> 后,除非需要使用PersistenceAnnotationBeanPostProcessor和equiredAnnotationBeanPostProcessor两个Processor的功能(例如JPA等)否则就可以将 <context:annotation-config/> 移除了
<mvc:annotation-driven/>
<mvc:annotation-driven/>是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。<mvc:annotation-driven/>会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter两个bean,是spring MVC为@Controllers分发请求所必须的。并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。 配置一些messageconverter。即解决了@Controller注解的使用前提配置。
<mvc:annotation-driven/> is a tag added in Spring 3.0 which does the following:
1. Configures the Spring 3 Type ConversionService (alternative to PropertyEditors)
2. Adds support for formatting Number fields with @NumberFormat
3. Adds support for formatting Date, Calendar, and Joda Time fields with @DateTimeFormat, if Joda Time is on the classpath
4. Adds support for validating @Controller inputs with @Valid, if a JSR-303 Provider is on the classpath
5. Adds support for support for reading and writing XML, if JAXB is on the classpath (HTTP message conversion with @RequestBody/@ResponseBody)
6. Adds support for reading and writing JSON, if Jackson is o n the classpath (along the same lines as #5)
<context:annotation-config/>
Looks for annotations on beans in the same application context it is defined and declares support for all the general annotations like @Autowired, @Resource, @Required, @PostConstruct etc etc.
<context:annotation-config> does NOT search for @Component, @Controller, etc.
<context:component-scan> DOES search for those @Component annotations, as well as the annotations that <context:annotation-config/> does.
there are other “annotation-driven” tags available to provide additional functionality in other Spring modules. For example, <transaction:annotation-driven />
enables the use of the @Transaction annotation, <task:annotation-driven />
is required for @Scheduled et al
=================扩展阅读=================
来源:http://www.mspring.org/article/211
昨天在编写Springmvc程序的时候遇到了一个问题:在使用@ResponseBody返回数据的时候出现了中文乱码的问题,于是上网搜索了一下原因。 发现原来是因为在类org.springframework.http.converter.StringHttpMessageConverter中设置的默认编码为ISO-8859-1。
问题原因找到了,那么接下来就是想办法解决了。我的解决办法是,重写spring提供的StringHttpMessageConverter,然后将我重写的类加载到Spring配置文件中,当spring调用的时候就会去调用我重写过的StringHttpMessageConverter,这样编码问题就会解决了。我的java代码和spring的配置如下:
Java:
-
package org.mspring.platform.web.converter;
-
-
import java.io.IOException;
-
import java.io.OutputStreamWriter;
-
import java.nio.charset.Charset;
-
import java.util.ArrayList;
-
import java.util.List;
-
-
import org.springframework.http.HttpOutputMessage;
-
import org.springframework.http.MediaType;
-
import org.springframework.util.FileCopyUtils;
-
-
/**
-
* @author Gao Youbo
-
* @since 2012-8-1
-
* @Description
-
* @TODO 解决spring默认提供的StringHttpMessageConverter在@ResponseBody中文时乱码
-
*/
-
public
class StringHttpMessageConverter extends org.springframework.http.converter.StringHttpMessageConverter {
-
-
/**
-
*
-
*/
-
public StringHttpMessageConverter(Charset defaultCharset) {
-
// TODO Auto-generated constructor stub
-
List<MediaType> mediaTypeList =
new ArrayList<MediaType>();
-
mediaTypeList.add(
new MediaType(
“text”,
“plain”, defaultCharset));
-
mediaTypeList.add(MediaType.ALL);
-
super.setSupportedMediaTypes(mediaTypeList);
-
}
-
-
protected void writeInternal(String s, HttpOutputMessage outputMessage) throws IOException {
-
Charset charset = Charset.forName(
“UTF-8”);
-
FileCopyUtils.copy(s,
new OutputStreamWriter(outputMessage.getBody(), charset));
-
}
-
}
Spring配置
-
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
-
<property name="messageConverters">
-
<list>
-
<bean id="stringHttpMessageConverter" class="org.mspring.platform.web.converter.StringHttpMessageConverter">
-
<constructor-arg value="UTF-8" />
-
</bean>
-
</list>
-
</property>
-
</bean>
这样配置就做好了,但是事不随人意,我测试之后乱码问题仍然还是存在。然后就是无线的蛋疼,折腾。。。 花了我一下午的时候,还是没有找到问题的所在。
有心栽花花不成,无心插柳柳成荫。今天上午看到了一篇关于Springmvc的文章,找到了问题的所在。原来是我spring配置中
<mvc:annotation-driven conversion-service=”conversionService” />
和:
<bean class=”org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter”>。。。
配置重复了。那篇文章中是这么描述的:
<mvc:annotation-driven/>是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。<mvc:annotation-driven/>会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter两个bean,是spring MVC为@Controllers分发请求所必须的。并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。
原来我的配置还停留在spring初学者的阶段。。。看来我要好好学习了。好了找到错误的原因了,那么接下来就该去验证了,希望这次能够通过。。。