Spring
ioc
di
- Spring容器实在内存中开辟一块区域,用于存储管理对象
- 数据结构: Key(类型首字母小写)-Value(对象)
- 数据类型: Map集合
依赖注入原理
- 默认按照类型注入
按照属性的类型去Map集合中查找是否有该类型的对象,如果有则注入
按照名称注入,根据属性的name去Map集合中查找对应的Key - 规则:
如果对象在进行实例化且对象的属性被@Autowired注解修饰则说明应该先注入属性
首先根据属性的类型 查找Map集合中是否有该类型的对象
如果根据类型查找没有找到则根据属性的名称按照name查找对象
如果上述方式都没有找到则报错实例化对象失败
Spring容器中要求接口必须单实现,如果有多实现则通过@Qualifier(“xx”)区分
@Autowired
@Qualifier("value=xxx")
// 类型 属性
private Service service;
Spring MVC
Spring MVC调用流程
前端控制器:实现请求的流转
处理器映射器:实现请求路径与方法的映射,内部有K:V结构,Key存放预先设定好的URL的路径,Value存放方法的全路径
处理器适配器:处理器的管理器,内部有N个处理器,针对不同需求调用不同处理器
视图解析器:执行页面内容
1.用户发送请求到后端,被前端控制器拦截
2.前端控制器转发请求到处理器映射器,根据URL查找能处理的方法(预先存放好的url路径与方法的全路径)
2.1 如果没有找到对应的方法则返回null给前端控制器,然后前端控制器返回404
2.2 如果拿到特定的数据则交给前端控制器
3.前端控制器继续向下执行调用处理器适配器,根据处理器映射器的结果找到对应的控制器,并开启执行业务层代码
4.执行业务层代码返回给处理器适配器,处理器适配器在返回Model(业务数据)AndView(页面路径) 被包装过的数据给前端控制器
5.前端控制器再去找视图解析器,视图解析器拼接完整的页面路径前缀/xxx.后缀(html等等)
6.视图解析器将数据交给视图渲染,将数据与页面进行渲染,用户可以看到的数据,交给前端控制器
7.前端控制器将渲染过的数据交给前端
由于流行前后端分离,所以不需要在后端对页面进行操作,而是直接交给前端操作,所以图中6,7不执行
可以执行分离的操作是因为@ResponseBody注解,直接将ModelAndView转成JSON传给前端
Servlet
Servlet 概述
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
总结: Servlet是java与前端页面进行数据交互的一种机制
核心对象:
- request对象 封装用户请求的参数/请求头/请求全部内容
- response对象 封装用户响应信息
Servlet获取参数规则
简单的方式
/**
* 注意事项: 如果后端服务器没有匹配的方法,也会报跨域错误.
* URL:http://localhost:8090/getUserById?id=1&age=18
* 参数: id=1
* 返回值: User对象
* servlet特点:
* 1.获取的数据都是String类型
*/
@GetMapping("/getUserById")
public User getUserById(Integer id){
//1.SpringMVC框架通过Servlet中request对象,根据参数名称获取值
// String id = request.getParameter("age");
//2.SpringMVC根据已知的数据类型 自动的实现数据转化
return null;
}
/*@GetMapping("/getUserById")
public User getUserById(HttpServletRequest request,
HttpServletResponse response){
//1.参数获取 每个参数都需要手动获取
String id = request.getParameter("id");
String age = request.getParameter("age");
//2.数据类型转化
int intId = Integer.parseInt(id);
System.out.println("根据ID查询数据库~~~~~");
return null;
}*/
对象方式
/**
* URL: http://localhost:8090/getUserByUser
* 参数: user对象的数据
* 返回值: User
*/
@GetMapping("/getUserByUser")
public User getUserByUser(User user){
//1.SpringMVC如果解析到参数是对象 先获取其中的Get方法
// getId()/getName()......
//2.将方法get去除首字母小写~~~id1111/name/age/sex
//3.实例化一个User对象之后调用setxxx()方法实现赋值
//4.最终方法中获取一个实例化的User对象
//String id = request.getParameter("id");
return user;
}
Maven
maven坐标查询
https://mvnrepository.com/
跨域问题
同源策略
同源策略是什么
同源策略是一个重要的安全策略,用于限制一个origin文档或者它加载的脚本如何能与另一个源的资源进行交互,用来阻隔恶意文档,减少被攻击的媒介
同源的定义
如果两个URL的protocol(协议)、port(端口)和host都相同的话,则这两个URL是同源,这个方案也称为"协议/主机/端口元组",或者直接是"元组"
判断条件是根据元组进行判断的,如果元组不一致那么,就不是同源
跨域解决策略
JSONP
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的
核心知识: 利用 <script src属性=“获取远程服务器数据”> 实现跨域访问.
CORS 跨域资源共享
跨域资源共享( CORS ) 是一种基于HTTP 标头的机制,它允许服务器指示浏览器应允许从其加载资源的任何其他来源(域、方案或端口)。CORS 还依赖于浏览器向托管跨域资源的服务器发出“预检”请求的机制,以检查服务器是否允许实际请求。在该预检中,浏览器发送指示 HTTP 方法的标头和将在实际请求中使用的标头。
解释:
跨域资源共享(CORS),通过Http响应头信息标识哪些网址可以访问服务器,现在几乎所有的浏览器默认支持CORS,在请求之前会进行预检 如果预见成功则一段时间之后无需检验(30分钟)
报错信息:
注解解决跨域问题
1、标识注解
2、响应头信息
注解
接收请求返回响应
@RestController
将要响应的数据转化为Json串
@ResponseBody
控制层的Ioc注解
@Controller
跨域注解
@CrossOrigin
映射关系
可以接收所有类型的映射注解
@RequestMapping("/请求路径")
接收Get类型的映射注解
@GetMapping("/请求路径")
接收Post类型的映射注解
@PostMapping("/请求路径")
接收Delete类型的映射注解
@DeleteMapping("/请求路径")
接收Put类型的映射注解
@PutMapping("/请求路径")
用于指定请求传来的参数
@PathVariable
通用注解
DI、自动装配、自动布线 ,从Bean容器中拿到关联的Bean对象
@Autowired
@Resource(name = "user")
@Qualifier("user")
全局定义Ioc
@Component
将请求的传来的数据转化为对象
@RequestBody
重写注解
@Override
定义Advice
@ControllerAdvice 一般不同了
@RestControllerAdvice 定义全局异常的处理类
@ExceptionHandler 表示拦截的异常类型
属性:运行时异常、编译时异常,全异常,自定义异常
业务层注解
业务层的Ioc注解
@Service
@Transactional 事物控制
属性: rollbackfor: 配置特殊类型异常,进行事物控制
noRollBackFor: 配置特殊类型异常,不进行事物控制
Dao层注解
Dao层的Ioc注解
@Repository
接口文件
@Select()
@Update()
@Delete()
@Insert()
对象绑定表 @TableName(“demo_user”)
主键自增 @TableId(type = IdType.AUTO)
对象属性绑定表中字段,字段与属性一致可以不用写,支持驼峰语法,如果不一致需要指定@TableField(“name”)
@RefreshScope 当配置中心的值发生变化后,如果需要对对应的属性进行动态刷新则加入这个注解
主启动类 @SpringBootApplication
扫描接口并创建代理对象 @MapperScan(“com.jt.mapper”)
配置
@Configuration
@Bean
@propertySource
@LoadBalanced 负载均衡
获取配置文件中定义的值 @Value("${person.name}")
@SentinelResource(“doGetResource”)
@ConditionalOnMissingBean(“xxx.class”)
@ConditionalOnBean(“xxx.class”)
测试 @SpringBootTest
- SpringBoot程序为了简化后端代码测试,提供了专门的测试API
- 测试时需要Spring容器管理对象,同时将测试的对象获取之后进行测试
- 测试包路径必须在主启动类的同包或子包中
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
首选注入的对象
@Primary
排除默认配置
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
读取配置文件注入到对象中
@ConfigurationProperties(prefix = “spring.datasource”)
@Bean
//读取配置文件注入到对象中
@ConfigurationProperties(prefix = “spring.datasource”)
public DataSource dataSource(){
return new HikariDataSource();
}