@Controller 和 @RestController的区别
@Controller: 处理http请求
@RestController: Spring4之后新加的注解,原来返回json需要@ResponseBody
和@Controller的配合
- 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
- 如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
@PathVariable,@RequestParam,@GetMapping,@RequestBody
@PathVariable: 获取url中的参数
@GetMapping: 组合注解
@RequestParam:
用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)
RequestParam可以接受简单类型的属性,也可以接受对象类型。
实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。
在Content-Type: application/x-www-form-urlencoded的请求中,
get 方式中queryString的值,和post方式中 body data的值都会被Servlet接受到并转化到Request.getParameter()参数集中,所以@RequestParam可以获取的到。
@RequestBody
处理HttpEntity传递过来的数据,一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据。
GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。
POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。
@RequestMapping(value="/get/id/{id}", method = RequestMethod.GET)
public String getId(@PathVariable("id")Integer id){
System.out.println("test");
return "id:" + id ;
}
maven更改资源目录
不同工具对资源目录的识别位置不同,可以利用maven来指定资源目录
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!--配置spring的资源目录,否则maven不识别-->
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
@Value 和 静态变量
spring不支持通过@Value的方式注入静态变量中,但是可以通过set方法来注入到静态变量中
private static String xx;
@Value("${test}")
public void setXx(String test){
xx = test;
}
set方法也必须为非静态方法,且赋值过程在静态块初始化过程之后.
InitializingBean,DisposableBean
Spirng的InitializingBean为bean提供了定义初始化方法的方式
InitializingBean是一个接口,它仅仅包含一个方法:afterPropertiesSet()
实现org.springframework.beans.factory.InitializingBean接口允许一个bean在它的所有必须属性被BeanFactory设置后,来执行初始化的工作,InitialzingBean仅仅指定了一个方法。
实现org.springframework.beans.factory.DisposableBean接口的bean允许在容器销毁该bean的时候获得一次回调。DisposableBean接口也只规定了一个方法:
void destroy() throws Exception;
Component
@ComponentScan
public class MqConsumer implements InitializingBean, DisposableBean {
private static final Logger logger = LogManager.getLogger(MQController.class.getName());
@Autowired
private AliMQConfig aliMQConfig;
private Consumer busConsumer;
@Autowired
private MqMessageMapper mqMessageMapper;
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("消费者初始化");
busConsumer = ONSFactory.createConsumer(aliMQConfig.getConsumer());
System.out.println("消费者初始化完成");
}
public void start(){
busConsumer.start();
}
public void onMessage(){
busConsumer.subscribe(aliMQConfig.getTopic(), "*", new MessageListener() {
@Override
public Action consume(Message message, ConsumeContext context) {
String msg = "";
try {
//do something..
msg = new String(message.getBody(), "UTF-8");
MqMessage mqMessage = new MqMessage();
mqMessage.setMessage(msg);
mqMessageMapper.insert(mqMessage);
WebSocketServer.sendInfo(msg, "20");
logger.info("订阅消息:" + msg);
return Action.CommitMessage;
} catch (Exception e) {
//消费失败
e.printStackTrace();
logger.info("消费失败:" + msg);
return Action.ReconsumeLater;
}
}
});
}
@Override
public void destroy() throws Exception {
busConsumer.shutdown();
System.out.println("停止");
}
}