1.入门案例-调用类里面的方法
配置文件:
<!--配置创建对象-->
<bean id="idName" class="类全路径"/>
id:唯一标识
Java代码:
1.加载spring配置文件
ApplicationContext context = new ApplicationContext ("配置文件的名称");
2.获取配置文件的对象
Class name = context.getBean("配置文件里面的idName",ClassName.class);
3.调用类的方法
name.Method();
2.IOC(控制反转)
基本概念:
将创建对象和对象之间的调用过程,交给Spring来管理。
底层原理:
xml解析、工厂模式、反射
接口:
BeanFactory | ApplicationContext | |
同 | 都可以加载Spring配置文件 | |
异 | 获取对象时才创建对象 | 加载配置文件时,就创建对象 |
Bean管理之基于xml方式
1.创建对象:参考入门案例,注意:默认使用无参构造方式创建对象。
<!--配置创建对象-->
<bean id="idName" class="类全路径">
<property name="类的属性名称" value="向属性注入的值"></property >
</bean>
2.注入属性:使用set方式注入和使用有参构造函数的方式注入。
<!--配置创建对象-->
<bean id="idName" class="类全路径">
<constructor-arg name="类的属性名称" value="向属性注入的值"></constructor-arg>
</bean>
其它属性:index=""
空值:
<property name="xxx">
<null/>
<property>
属性值设置特殊符号:
<property name="xxx">
<value><![CDATA[此处填写特殊符号]]></value>
<property>
外部Bean注入 :
<!--创建service和dao对象-->
<bean id="serviceName" class="类全路径">
<property name="daoName" ref="userDaoImpl"></property>
</bean>
<!--id要和上面的ref保持一致,若此处为接口的话,class则为其实现类-->
<bean id="userDaoImpl" class=""></bean>
内部Bean注入:
<bean id="xxx" class="类全路径">
<!--普通属性-->
<property name="类的属性名" value=""></property>
<!--对象属性-->
<property name="yyy">
<bean id="对象的属性名" class="">
<property name="" value=""></property>
</bean>
</property>
</bean>
集合属性注入 :
<bean id="xxx" class="类全路径">
<property name="类的属性名">
<!--数组类型-->
<array>
<value></value>
......
<value></value>
</array>
数组也可以使用使用list标签
-------------------------
list类型就用list标签
set类型就用set标签
-------------------------
<!--map类型-->
<map>
<entry key="" value=""></entry>
<entry key="" value=""></entry>
</map>
</property>
-------------------------
注入list集合,值为对象类型
<property name="对象名称">
<list>
<ref bean="bean1"></ref>
<ref bean="bean2"></ref>
</list>
</property>
</bean>
<bean id="bean1" class="">
<property name="类的属性名" value=""></property>
</bean>
<bean id="bean2" class="">
<property name="类的属性名" value=""></property>
</bean>
提取集合注入的公共部分:使用util标签
以List为例:
<util:list id="xxx">
<value></value>
......
<value></value>
</util:list>
<bean id="" class="类全路径">
<property name="list" ref="xxx"></property>
</bean>
FactoryBean:
普通Bean | FactoryBean |
返回的类型为在配置文件中定义的类型 | 返回的类型可以在配置文件中定义的类型不一样 |
Bean的作用域:
Bean默认是单实例对象,使用bean标签的scope属性变成多例对象。
singleton单实例 | prototype多实例 |
加载配置文件就会创建单例对象 | 调用getBean()方法时创建多实例对象 |
Bean的生命周期:
无参构造器 --> set方法 -->
接口BeanPostProcessor里面的postProcessBeforeInitialization()方法 -->
初始化方法,使用bean标签属性init-method -->
接口BeanPostProcessor里面的postProcessAfterInitialization()方法 -->
获取bean实例对象 --> 销毁方法,使用bean标签属性destroy-method
xml自动装配:使用bean标签属性autowrie
byName | byType |
注入值bean的id值和类属性名称一致 | 不可有多个类型相同的bean |
Bean管理之注解方式
创建对象
常见注解:@Component、@Service、@Controller、@Repository
这四个注解都可以创建bean实例。
<!--开启组件扫描-->
<context:component-scan base-package="">
<!--只扫描带注解@Controller的类-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<!--不扫描带注解@Controller的类-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
注解里面的value属性值可以省略不写,默认是首字母小写的类名称
@Component(value="user") == <bean id="user" class=""/>
属性注入
常见注解:
@Autowired | @Qualifier | @Resource | @Value |
根据属性类型进行自动装配 | 根据属性名称进行注入 | 两者都可 | 注入普通类型属性 |
3.AOP(面向切面编程)
理解:在不改变源代码的情况下,增加新的功能。
底层原理:动态代理。
有接口 | 无接口 | |
名称 | JDK动态代理 | CHGLIB动态代理 |
方法 | 创建接口实例类代理对象 | 创建当前类子类的代理对象 |
步骤 | 使用proxy类里面的newProxyInstance()方法 |
AspectJ
@AspectJ: 生成代理对象
@PointCut:抽取相同的切入点
@Order():增加类的优先级,数字越小优先级越高
切点表达式:
execution([权限修饰符][返回类型][类全路径][方法名称]([参数列表]))
基于注解方式
前置通知 | @Before | |
后置通知 | @AfterReturning | 返回结果后执行 |
环绕通知 | @Around | 方法之前和之后都执行 |
异常通知 | @AfterThrowing | |
最终通知 | @After | 方法之后就执行 |
4.事务
基本概念:数据库操作最基本单元,逻辑上的一组操作,要么都成功,如果有一个失败,则所有操作都失败。
典型场景:银行转账。
特性:ACID。
Spring事务管理:
1、将事务添加到JavaEE三层结构里面的Service层(业务逻辑层)。
2、主要使用的是声明式事务管理(还有一种管理方式叫编程式事务管理),底层原理是AOP。
@Transactional:添加事务
添加的位置 | 效果 |
类上面 | 这个类的所有方法都添加注解 |
方法上面 | 为这个方法添加注解 |
用法:
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_REDE,timeOut = 5,readOnly = false)
参数 | 解释 |
propagation (传播行为) | 一个方法调用另一个方法时,事务的传播行为 |
isolation(隔离级别) | 多事务之间不会产生影响 |
timeOut(超时时间) | 默认值为-1,单位为秒 |
readOnly(是否只读) | 默认值为false,可以添加修改删除操作 |
rollbackFor(回滚) | 设置出现那些异常进行事务回滚 |
noRollbackFor(不回滚) | 设置出现那些异常不进行事务回滚 |
事务的隔离级别可以避免脏读、不可重复读和虚(幻)读。
脏读 | 一个未提交事务读取到另一个未提交事务的数据 |
不可重复读 | 一个未提交事务读取到另一个为提交事务修改数据 |
虚(幻)读 | 一个未提交事务读取到另一个为提交事务新增数据 |
@Nullable:可以使用在方法、属性和参数上。表示方法、属性和参数可以为空。
5.log4j
用法:
private static final Logger log = LoggerFactory.getLogger(xxx.class);
log.info(".......");
log,warn(".......");
6.WebFlux
异步和同步的理解:异步和同步都是从调用者这个角度去区分的,调用者发送请求,如果对方回应之后才去做其他事情,就是同步;如果发送请求后不等对方回应就去做其他事情,就是异步。
阻塞和非阻塞的理解:异步和同步都是从被调用者这个角度去区分的,被调用者收到请求后,做完请求任务之后才给出反馈,就是阻塞;收到请求后,马上给出反馈,然后才去做事情,就是非阻塞。
Spring MVC和Spring Webflux的异同:
Spring MVC | Spring WebFlux | |
同 | 都可以使用注解,在Tomcat等容器运行 | |
异 | 命令式编程 (一行一行运行代码,方便debug) | 异步响应式编程 |
用Reactor实现响应式编程:
Reactor的核心类:Mono和Flux。
Mono:实现发布者,返回0个或者1个元素。
Flux:实现发布者,返回n个元素。
这两个类都是数据流的发布者,都可以发出三种数据信号:元素值、错误信号和完成信号。
错误信号和完成信号都代表终止信号(不能共存),用于告诉订阅者数据流结束了,
而且错误信息终止数据流的同时,也会把错误信息传递给订阅者。
PS:如果没有发送任何元素值,而是直接发送错误或者完成信号,表示是空数据流。
如果没有错误信号,没有完成信号,表示是无限数据流。
// 声明数据流
Flux.just(x,x,x,x);
Mono.just(x)
Flux.formArray(array); //数组
Flux.formIterable(list); //list集合
Flux.formStream(stream);//输出流
// 订阅数据流并输出
Flux.just(x,x,x,x).subscribe(System.out::print);
Mono.just(x).subscribe(System.out::print);
数据符:数据流进行一道道加工后就变成了数据符。
名称 | 作用 |
map元素 | 映射为新元素 |
flatMap元素 | 将每一个元素转成流,然后把转换后流合并成一个大的流 |
核心处理器:DispatcherHandler。
基于函数式编程模型:
请求:ServerRequest。
响应:ServerResponse。
需要实现两个函数式接口并且启动服务器。
函数名称 | 作用 |
RouterFunction | 实现路由功能,请求转发给对应的handler |
HandlerFunction | 处理请求生成响应的函数 |