接口开发实例
第一步,在com.jepcc.wiki
目录下新建Pacakgecontroller
第二步,在Packagecontroller
下新建类TestController
//TestContorller.java
package com.jepcc.wiki.controller;
public class TestContorller {
public String hello(){
return "Hello World!";
}
}
第三步,添加注解,形成接口
@RequestMapping(url)
,支持HTTP请求的所有方法,如GET
、POST
、PUT
、DELETE
@GetMapping(url)
,仅支持HTTP GET方法
同@RequestMapping(value=url,method=RequestMthod.GET)
@PostMapping(url)
,仅支持HTTP POST方法
同@RequestMapping(value=url,method=RequestMthod.POST)
@PutMapping(url)
,仅支持HTTP PUT方法
同@RequestMapping(value=url,method=RequestMthod.PUT)
@DeleteMapping(url)
,仅支持HTTP DELETE方法
同@RequestMapping(value=url,method=RequestMthod.DELETE)
@RestController
,接口返回字符串或者JSON对象
//WikiApplication.java
package com.jepcc.wiki;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;
@SpringBootApplication
public class {
private static final Logger LOG = LoggerFactory.getLogger(WikiApplication.class);
public static void main(String[] args){
SpringApplication app = new SpringApplication(WikiApplication.class);
Environment env = app.run(args).getEnvironment();
LOG.info("启动成功!");
LOG.info("地址:\t http://127.0.0.1:{}",env.getProperty("server.port"));
}
}
//TestController.java
package com.jepcc.wiki.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestContorller {
@RequestMapping("/hello")
public String hello(){
return "Hello World!";
}
}
启动项目,打开浏览器输入地址localhost:8000/hello
,浏览器页面显示Hello World!
。
注解
接下来,我们着重了解下注解。
RestController、Controller、ResponseBody
按住Ctrl且鼠标悬停至注解@RestController
,可单击进入该注解所在类。
//RestController.class
package org.springframework.web.bind.annotation;
@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Documented
@org.springframework.stereotype.Controller
@org.springframework.web.bind.annotation.ResponseBody
public @interface RestController {
@org.springframework.core.annotation.AliasFor(annotation = org.springframework.stereotype.Controller.class)
java.lang.String value() default "";
}
在RestController.class
中,我们可以看到@Controller
和ResponseBody
这两个注解,其中@Controller
用来返回页面,@ResponseBody
用来返回字符串或者JSON对象。
SpringBootApplication、ComponentScan
我们再来看看@SpringBootApplication
这个注解,在SpringBootApplication.class
里,可以看到@ComponentScan()
这么一个注解,表示会扫描SpringBootApplication
这个注解所在的类所在包下的所有子包。
//SpringBootApplication.class
package org.springframework.boot.autoconfigure;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {};
@AliasFor(
annotation = EnableAutoConfiguration.class
)
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "nameGenerator"
)
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
现在不妨将试试将WikiApplication
、TestController
这两个类放在两个不同的包下,看看会发生什么。
瞧,访问localhost://8000/hello
,接口返回404
。
怎么破?
在WikiApplication
这个类里添加@ComponentScan("com.jepcc.wiki")
即可。