Spring回忆

spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的框架。

首先我们要在maven的pom文件中导包,我们导入spring-webmvc即可,它会帮我们导入所以的相关依赖。在这里插入图片描述
相关依赖在这里插入图片描述
我们把业务分成dao层,service层,和用户层(controller),业务层调dao层,用户只管调业务层。以往的面向对象程序设计,对象与对象之间的关系是硬编码在程序中的,对象由程序自己创建,控制反转后对象创建移交给第三方,我们认为,控制反转就是获得依赖对象的方式反转了。DI(依赖注入) 是控制反转的一种方法。
IOC 是spring的核心,使用多种方式实现了IOC,可以使用xml配置,也可以使用注解,新版的spring可以零配置实现IOC.

控制反转是一种通过描述(xml或注解)并通过第三方去生产特定对象的方式,在spring中控制反转的是ioc容器,其实现是依赖注入。 所谓的IOC,就是对象由spring来创建,管理和装配。属性注入是采用set的方法进行注入的

IOC:

方式1:spring通过加载xml实现对象注入

通过加载xml文件获得ioc容器,可以 在里面获取到我们想要的bean而注入方式分set注入和构造器注入。
在这里插入图片描述

set注入通过set注入对象属性,set注入的前提是必须要有无参构造器,且每个属性都要有set方法。下面是通过set注入各种类型的属性,普通,引用,数组,list,set,map等。在这里插入图片描述

beans的注入第二种为构造器注入,构造器注入的前提是必须要有有参构造器。

采用有参构造实现对象注入,有参构造有三种方式,我们建议采用第三种给参数名赋值的方式比较好,在这里插入图片描述
还有P命名空间注入和C命名空间注入,P命名空间注入就是简化了set注入,C命名空间注入就是简化了构造器注入。使用时需要引入P命名空间xml约束和C命名空间xml约束,

bean的作用域

主要分为单例模式原型模式prototype。
在这里插入图片描述
1.单利模式(spring默认模式),容器中的bean只会是一个对象。在这里插入图片描述
2.原型模式:每次从容器中get的时候,都会产生一个新对象。多线程可以考虑使用原型模式。在这里插入图片描述
3.其余的request,session,application这些只能在web开发中用到。

beans的隐式自动装配 autowire

autowire,byname,bytype可以自动的将一个bean自动装配到另一个bean的属性里,我们可以选择装配方式是通过bean名字和bean类型。下图里面people里面有dog和cat属性。
在这里插入图片描述

方式二:spring通过注解实现对象注入

注解某种程度比xml配置bean更加得心应手
1.导入注解开发约束,在beans.xml中加入如图所示红线划的三个约束,这样我们就可以采用注解装配bean的引用类型的属性了。
在这里插入图片描述
2.开启注解支持,在beans.xml中。在这里插入图片描述
若ioc容器中有dog,cat,people的bean,但people的cat,dog属性为空,这时我们就可以在people的属性上打上 @autowire 注解,则spring会自动为people的属性在ioc容器中寻找合适的bean进行装配。在这里插入图片描述
如果@autowire自动装配环境比较复杂,如bean id和类型都不符合,我们可以搭配 @Qualifier 来指定需要装配的同类型的bean,即直接指定bean ID。自动装配原理是反射,不需要实现set方法。
但自动装配要求不能为空必须找到,不然报错,这时可以再加一个 @Nullable 注解表示装配不上可以为空。

当然我们可以不在beans.xml注入任何bean,直接通过注解来注入bean,这时就要用到 @Component 注解加在实体类上即可,该实体类注入为bean,在属性上加 @Value注解即可为属性赋值。但需要在beans.xml中配置扫描实体类POJO包。在这里插入图片描述
我们要在beans.xml中开启注解的支持并扫描具体包下的注解来注入bean。不扫描的话bean只能在beans.xml中注入,此时注解只能用来注入属性。
在这里插入图片描述

在这里插入图片描述
4.注解也支持设置bean的作用域,通过@Scope(“singleton”)
在这里插入图片描述

通过Java类来配置spring

由上面可知即使采用注解的方式来注入bean,也离不开我们的applicationContext.xml,和它对应的上下文开启。
ApplicationContext context =ClassPathXmlApplicationContext(“beans.xml”),然后通过context.getBean()获得对应的对象。而且采用注解也需要在applicationContext.xml中开启注解支持和扫描对应的包来注入bean。

但我们也可以直接通过java配置类来配置spring和注入对象,完全离开applicationContext.xml配置文件。

通过java配置类来取代applicationContext.xml:

@Configuration标记的类为spring配置类。创建一个java配置类,在配置类中设置方法,方法的返回类型就是我们想要注入spring的bean,我们在方法中new了该bean并将其返回,同时在方法上打上@Bean标签表示该方法是往容器中注入bean的。
在这里插入图片描述
被@Configuration标记的配置类也是bean,其父注解有一个 @Component,说明它就是bean。通过这个配置类的bean来往容器中加入其他的bean。作用相当于beans.xml。
我们也可以在配置类上加@ComponentScan来开启组件扫描。在这里插入图片描述
如果通过@Configuration配置类来配置,我们就要采用AnnotationConfigApplicationContext来获取上下文。
ApplicationContext context = new AnnotationConfigApplicationContext(“配置类”);获得上下文后才能获取想要的bean。
User user=(User)context.getBean(“getUser”)获得bean。.

AOP

aop的核心思想是代理模式。代理分静态代和动态代理。

静态代理:

真实角色和代理角色都继承同一个接口,代理角色里面有真是角色的引用,这样代理模式使用接口中的方法的时候,实际上是真是角色在使用接口中的方法。

在不改变原有代码的情况下,想实现和增强一些功能,采用代理模式非常好。将真实角色放入代理角色中,在代理角色中实现一些新功能。
静态代理的坏处是代码量翻倍。

动态代理:

动态代理和静态代理一样,动态代理的代理类是动态生成的不是我们提前写好的,动态代理分两大类,基于接口的动态代理,基于类的动态代理。

  1. 基于接口:—JDK动态代理
  2. 基于类: --cglib
    我们这里用第一种。
    需要了解两个类, Proxy 代理, InvocationHandler 调用处理。
    InvocationHandler的实例会代理一个接口,其rent引用指向真实对象,通过 InvocationHandler可以获得代理对象Proxy,代理对象Proxy中包含了 InvocationHandler对象的具体信息,被代理接口信息。
    在这里插入图片描述
    这样我们把真实对象交给 InvocationHandler后,通过 InvocationHandler的方法获取到代理对象,代理对象包含了被代理接口信息和 InvocationHandler信息。**通过Proxy调用真实对象的方法,实际是调用 InvocationHandler的invoke方法,invoke方法中会传入 调用的 method, args。**通过反射实现动态代理。
    在这里插入图片描述
    下面是基于 JDK 接口的动态代理通用模板,用Object作引用实现。在这里插入图片描述

spring AOP

spring AOP底层默认也是 InvocationHandler 和 Proxy 帮我们做动态代理,在不影响原来功能的情况下实现动态增强。
使用aop得导入包
在这里插入图片描述

一. 使用原生spring API接口

通过spring配置切入点和执行环绕,实现在真实对象的某个方法执行前后增加我们想要的操作。
我们先通过api定义我们想要的切入点操作。如MethodBeforeAdvice api它可以在我们切入点前面执行一些操作。method,args,target就是我们切入点函数的一些信息。
在这里插入图片描述
AfterReturningAdvice api就是我们在切入点后面的一些操作 。其中多出来的 returnValue就是我们切入点执行得到的结果。
在这里插入图片描述
在 beans.xml 中配置 spring 切入点和执行环绕。在这里插入图片描述
最后要注意的是,spring aop是基于动态代理实现的,动态代理代理的是接口,所以我们通过context拿到的bean,其引用必须是接口,这样bean便是上面的target,执行的方法是上面的method,参数是args。在这里插入图片描述

二. 自定义切面

切面就是我们要围绕切入点做的一些操作,是个具体的类。下面就是个切面。
在这里插入图片描述
在beans.xml中配置我们的切面和切入点即可,但切面操作的缺点是不能和我们的切入点产生关联。在这里插入图片描述

三. 使用注解方式

使用注解 @Aspect 是将一个类标注成切面,并可标记其方法在切入点的前后执行。使用注解可以省去在beans.xml 中配置切入点和切面。
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值