spring : 包含众多方法的IoC容器: 控制反转的容器 实现了代码的解耦 DI :依赖注入,
IoC是实现思想 DI是具体的手段
spring
项目创建的时候路径不要出现中文,spring配置文件对应的jar包下载好。
创建spring项目,得到spring上下文对象的时候,不一致的时候就会报错
ApplicationContext 和 BeanFactory区别:
相同点: 都是用来获取spring上下文对象的
不同点: ApplicationContext 是 BeanFactory的子类 有BeanFactory的所有功能
BeanFactory只具备最基础的访问bean的能力 尔ApplicationContext具备更多的能力:国际化支持 资源访问支持等
性能不同:ApplicationContext可以一次性加载并初始化所有的bean对象 BeanFactory要访问那个才加载那个,更轻量化
将bean存储到spring中:
类注解:(五大类注解)
1, @Controller (控制器)业务逻辑层:验证前端传送的参数(安全检查)可以实现将当前修饰的类存储到spring中
2,@Service (服务层)服务层:服务调用的编排和汇总,不做数据的持久化 可以实现将当前修饰的类存储到spring中
3, @Repository (仓库)持久层:直接操作数据库 可以实现将当前修饰的类存储到spring中
4, @Component (组件):通用化的工具类 可以实现将当前修饰的类存储到spring中
5, @Configuration (配置)配置层:当前项目的配置 可以实现将当前修饰的类存储到spring中
方法注解: @Bean
为什么需要这么多的类注解: 是为了让程序员看到类注解,直接了解到当前类的作用和用途。
五大类注解之间的关系: 逻辑上Controller Service Repository Configuration 都是基于Component
他们的作用都是把bean存储到spring中
关于bean的命名规则:
默认情况 :是将五大类注解的类名称首字母小写的命名规则;并且是修饰方法的,不能用在类上
特殊情况: 如果首字母和第二个字母都是大写的情况下,bean的命名就是原来的命名。
关于bean注解的使用:
必须配合五大类注解进行使用!使用五大类注解和bean配合使用的时候,bean的命名为方法名。
spring存储bean: HashMap<String,Object> --><key,value>; bean注解只能设置到没有参数的方法(spring初始化的时候没有办法传参数)
@Bean的重命名:
1. @Bean(name="方法名") //方法注解
2. @Bean("方法名")
3. @ bean(name = {" "," "} ) //命名多个方法
@Bean重命名之后,就不能通过方法名进行访问了
关于Bean对象的读取(对象注入)的实现方法:
- 属性注入 : @Autowired//(自动分配)
static 执行的时机比较早,比spring执行的时间早,所以导致在static执行时,访问不到spring
优点: 写法简单
缺点:1.功能性问题:不能注入一个final修饰的属性(final修饰的变量:修饰的时候赋值 , 构造方法中赋值)
2. 通用性问题 : 只适用于IoC(框架)容器
3. 设计原则问题: 更容易违背单一设计原则 (使用方法简单,滥用可能性更大)
- setter注入
优点:符合单一设计原则(一个setter只针一个对象)
缺点: 不能注入一个不可变的对象(final修饰的对象)
注入对象可能被改变(因为setter方法可能会被多次调用,所以存在注入对象被改变)
- 构造方法注入:当 当前类 只有一个构造方法的时候,就可以省略Autowired 可以在一个构造方法里面注入多个对象
当存在多个构造方法的时候Autowired就不能省略,当你的Autowired加在哪个构造方法上,那个构造方法才可以被访问到。 Spring中一个类有多个构造方法的时候,只能在一个构造方法上加Autowired,否则就会报错。
优点: 构造方法中可以注入不可修改的对象(用final修饰的对象)
注入对象不可以被修改(构造方法只能被执行一次)
依赖对象是在构造方法中执行的,构造方法是在对象创造之初执行的,因此被注入的对象在使用之初就会被初始化;
通用性更好,因为构造方法是java(JDK)支持的【最底层的支持】
注解: @Resource 实现Setter注入:
实现属性注入:
注意: @Resource注解不能使用在构造方法上实现 @Resource 来自于JDK的注解
当有多个bean的时候,可以采用 @Resource给name值去确定所要拿取的bean 或者采用 @AUtowired + @Qualifire(value = "所要查取的bean名") 两者都可以使用。
Bean的作用域和生命周期:
Spring默认是单例的 Bean对象在整个Spring中的某种行为模式,单例模式中Spring只有一份。属于全局共享,一但修改一份整个Spring中的Bean的值都会修改。
Bean的6种作用域 :
- singleton:1. 单例模式,:在IoC容器中只能存在一个实例:获取Bean或者配装Bean的都是同一个Bean;
2. 场景: 通常无状态的Bean使用该作用域,表示Bean的属性状态不需要更新的。
3. Spring默认使用该作用域
- prototype:原型模式(多例模式)每次对该作用域下的Bean请求都会创建一个新的实例。获取Bean及配置Bean都是对新的对象实例。
使用场景:通常有状态的Bean使用该作用域。
- request (请求作用域): 每次http请求会创建新的Bean实例,类似于prototype
一次http的请求和响应都会响应共享的Bean
限定SpringMVC使用。
- session(会话作用域): 每一次http会话中定义一个Bean
用户会话共享一个Bean
限定SpringMVC使用。
- application (全局作用域): 每一次的http servlet Context 定义一个Bean
Web应用的上下文中
限定SpringMVC使用
- websocket(Http Websocket 作用域);
比较: 单例作用域与全局作用域的对比:
单例作用域是Spring Core的作用域 全局作用域是SpringWeb的作用域
单例作用域是作用于IoC容器的 全局作用域是作用于Servlet的
Spring主要执行流程:
- 启动容器,加载配置文件
- Baen初始化 (配置文件中的Bean 配置了加载组件路径下的类进行扫描 看有没有加注解)
- 将Bean对象注入到容器中
- 配置Bean的属性 使用Bean
- Spring销毁
Bean的生命周期:
- 实例化(分配内存空间)
- 设置属性(注入依赖 ID)
- 初始化
-
- 执行各种通知
- 初始化的前置方法(xml 中定义 init-method|@PostConstruct)
- 初始化方法
- 初始化的后置方法
- 使用Bean
- 销毁Bean(xml destroy-method|@PreDestroy)
Springboot中的注意点:
properties 和 yml 当两个同时设置了端口号,那么此时执行的是: properties 那么就是说明properties优先级更高;
设置数据库的连接信息:
从程序中读取配置文件中的内容: 可以使用@Value注解来实现
properties缺点:
yml的优点:可读性高,写法简单,易于理解
支持更多的数据类型
支持外观的特色,适合用来表达或编辑数据结构,各种配置文件
支持更多的编程语言
yml在编写的时候: key:value 中间一定要有空格 不可省略 省略就会出错
yml:当用双引号的时候,此时里面如果存在特殊字符表示特殊含义的时候就发挥他的特殊作用。
带有双引号的\n就发挥了它的特殊含义
如果你的properties中如果打开项目出现乱码的情况就是因为properties默认的编码格式不是utf-8 所以会出现乱码的情况。
springboot项目的日志查看:
日志级别:
打印自定义的日志:
打印的自己定义的日志:
日志持久化
- 设置日志的名称:
当重新运行的时候:新的日志不会丢失,也不会覆盖旧的日志
当日志比较大的时候,就会去分割成几个文件
- 设置日志的保存路径;
把日志持久化到磁盘中,重新运行程序的时候,也不会覆盖原来的日志。
这是日志的种类和日志级别:
fatal这是灾难级的,因为代码异常导致程序退出执行的事件;系统级别,程序猿无法打印
设置日志的打印的级别: 级别比当前高的时候就打印出来:
如果没有设置的时候默认的是info;
@Slf4j 注释可以来代替得到打印的日志的对象
pringMVC: 基于Select API的web框架
Spring 、SpringBoot 、 SpringMVC 区别;
Spring是一个开源容器框架,可以接管web层,业务层,dao层,持久层的组件,并且可以配置各种bean,和维护bean与bean之间的关系。其核心就是控制反转(IOC),和面向切面(AOP),简单的说就是一个分层的轻量级开源框架。
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。SpringMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校验等。SpringMVC是一个MVC的开源框架,SpringMVC=struts2+spring,springMVC就相当于是Struts2加上Spring的整合。
Springboot是一个微服务框架,延续了spring框架的核心思想IOC和AOP,简化了应用的开发和部署。Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置。提供了一堆依赖打包,并已经按照使用习惯解决了依赖问题—>习惯大于约定。
Spring包含了SpringMVC,而SpringBoot又包含了Spring或者说是在Spring的基础上做得一个扩展。
SpringMVC项目:
类上的RequestMapping(“/web”)可以省略 直接通过访问“/hi”进行访问 也可以使用@RestController来实现
此时也能访问到。
注意这里的类注解只能使用@Controller 原因:前端在传输数据的时候@Controller控制器先进行检查,所以当你不使用@Controller时候就不可以执行了,是访问不到的。
所以你此时的请求可以自己去定义 可以是post,可以是get。
Spring中获取单个参数:(保证前后端的参数一样)
参数名一样
Spring中获取对象
forward(请求转发)和 redirect(请求重定向)区别:
redirect:将请求重新定位到资源 forward:服务器转发
redirect:地址发生改变 forward:地址不发生改变
redirect:直接访问新地址,不存在原来的外部资源不能访问。forward:请求服务器转发有可能造成原来的外部资源不能访问
举个例子:(redirect:就相当于拿着A的产品去B换,A让你去B换 ; forward:就相当于拿着A产品去A换,A没有,但是A去别的地方给你换)
redirect:会跳转地址
forward不会跳转
Mybatis:ORM框架,对象关系映射。
组成:1. 接口 (当前类的所有方法的声明)
2. xxx.xml(和接口一一对应,一个类会有一个对应的实现操作的xml文件)
对象的时候,如果使用@Param就需要在xml中注释一下:非对象的时候就不用去注解
Mybatis:添加得到用户的自增ID
MyBatis删除功能:
参数占位符: #{} :预编译处理
${}:字符直接替换 :MySQL的关键字就不能使用#,需要使用$来传
SQL注入: ‘or 1 =’1 注入语句。
select * from userinfo where password = '' or 1 = '1'这就是SQL注入 此时可以看到不管password你输入的是对的还是错的,都会执行后面的1=1的语句。所以不管怎么输入密码都会被查询到
多表查询:
当两个的名字都不一致的时候,此时你要么就改UserInfo表的那一列的名字 改成一致,要么就看下面的操作
所以你的数据库知识要比较强
MyBatis 动态SQL:
<where>标签:
使用:
作用:使用where标签的内容,决定要不要拼接where语句
去掉最前面的and关键字,让sql符合数据库的执行标准
<set>标签:针对修改的操作
作用: 生成set关键字 去掉最后一个,
一次删除多条数据;
AOP: 面向切面编程,对某一类事件做处理
AOP的基本组成: 切面: 定义业务类型
连接点: 有可能调用AOP的地方就是一个连接点
切点: 定义AOP的拦截规则
通知(advice):前置通知: 拦截的目标方法执行之前的通知
后置通知:拦截的目标方法执行之后的通知
返回之后通知:拦截目标方法返回数据之后的通知
抛出异常之后的通知: 拦截目标方法抛出异常之后的通知
环绕通知: 在拦截方法的前后执行的通知
ps: 以上仅是我的个人的总结,不喜勿喷!!!