在Blog中,博主给了跨域的详细例子:
当前页面url 被请求页面url 是否跨域 原因否 同源(协议、域名、端口号相同)
https://www.test.com/index.html 跨域 协议不同(http/https)
跨域 主域名不同(test/baidu)
跨域 子域名不同(www/blog)
:8080/ :7001/ 跨域 端口号不同(8080/7001)
(上表来自链接博文)
关于AJAX跨域问题移步这里
@RequestController@RequestMapping("rest")
public class RestController {
@PostMapping
@CrossOrigin
public String post(@RequestBody User user){
return user.toString();
}
}
//跨域问题解决 @Service
Controller中一般是不写逻辑的,都是直接调用相应的服务,我们需要吧业务逻辑封装在服务中。
上面的例子只是为了方便才把逻辑写入控制器,实际开发中不要图这种方便。
@Service用来注册bean,要放在服务的实现类之前。
接下来使用UserService做例子。这是一个接口。
// 接口类public class UserService {
public ResponseVO addUser(User user);
} // 实现类
@Service // 一定是在实现类而非接口类中
public class UserServiceImpl implements UserService {
public ResponseVO addUser(User user){
// implement the interface
}
} // 控制器类
public class UserController {
@Autowired
private UserService userService;
}
一般在控制器类中,又一个Service成员,在这个例子中便是private UserService userService
我们当然可以选择:
private UserService userService = new UserServiceImpl();但是SpringBoot提供了更方便的做法:
@Autowiredprivate UserService userService;
只要实现类被正确的标注,那么@Autowired就能帮我们完成初始化任务。
关于Autowired的进一步介绍移步@Autowired
@Component@Component和@Service非常类似,同样用来注册bean,使用方式也是一样的,区别在二者的使用场景。
@Service用于注解业务逻辑层中的服务代码,@Component用于注解通用性强的工具类(会被多方调用)。
例如:
既被控制器调用,又被服务实现类调用的类
被多个控制器/服务实现类调用的类
@Autowired@Autowired用来获取bean。
在SpringBoot中,默认的匹配方式是byType,具体规则如下:
按照类型去容器找到对应的组件
如果找到:赋值
如果没找到:报异常
如果找到多个:使用变量名作ID匹配,匹配上就赋值,没有就报错。
这里说明一下:ID即为类名的首字母小写,例如UserServiceImpl类的ID就是userServiceImpl
可以使用@Qualifier注解指定ID
例子:
使用变量名作ID匹配
@Autowiredprivate UserService userService;
查找到多个相同的类:UserService(id = userService)及其子类UserServiceExtend(id = userServiceExtend)
这时,使用userService作id匹配到UserService类。