SpringBoot 学习心得

      • @Controller 和 @RestController的区别
      • @PathVariable,@RequestParam,@GetMapping,@RequestBody
      • maven更改资源目录
      • @Value 和 静态变量
      • InitializingBean,DisposableBean

@Controller 和 @RestController的区别

@Controller: 处理http请求
@RestController: Spring4之后新加的注解,原来返回json需要@ResponseBody
和@Controller的配合

  1. 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
  2. 如果需要返回到指定页面,则需要用 @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/javadirectory>
        <includes>
            <include>**/*.xmlinclude>
        includes>
    resource>
    
    <resource>
        <directory>src/main/resourcesdirectory>
    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("停止");
    }

}

你可能感兴趣的:(spring)