Spring5 随手一记

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解析、工厂模式、反射

接口:

BeanFactoryApplicationContext 
都可以加载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:

普通BeanFactoryBean
返回的类型为在配置文件中定义的类型返回的类型可以在配置文件中定义的类型不一样

Bean的作用域: 

Bean默认是单实例对象,使用bean标签的scope属性变成多例对象。

singleton单实例prototype多实例
加载配置文件就会创建单例对象调用getBean()方法时创建多实例对象

Bean的生命周期:

无参构造器 --> set方法 -->

接口BeanPostProcessor里面的postProcessBeforeInitialization()方法 -->

初始化方法,使用bean标签属性init-method -->

接口BeanPostProcessor里面的postProcessAfterInitialization()方法 -->

 获取bean实例对象  -->  销毁方法,使用bean标签属性destroy-method

xml自动装配:使用bean标签属性autowrie

byNamebyType
注入值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 MVCSpring 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处理请求生成响应的函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值