spring

spring有两大特性ioc和aop

IOC:

        ioc只是一种思想:控制反转。那么什么叫控制反转呢,在没有ioc之前,对于对象的使用、管理,都有程序员自我把控,比如在编写对象a的时候要手动new出对象b,才能使用b,那么a和b就会高度耦合。有了ioc思想的出现,ioc的思想是将对象容器化管理,也就是无论是什么对象,都会转交给ioc管理,这时对象a需要使用b的时候,只需要通过注解的方式告诉ioc容器,那么ioc会在适当的时候创建对象b以供a使用,其中实现过程是通过反射实现的,毕竟是在程序运行过程中动态注入的,那么注入的过程由DI依赖注入来实现

 DI:重点在于程序运行过程中给目标对象提供其所需的对象,通过反射完成此操作

AOP

        面向切面编程,在不改动主业务代码的情况下,对主业务方法做增强代码,通常增强代码为记录埋点,添加日志等作用

        AOP的实现基础:通过动态代理的方式实现,JDK动态代理和CGLIB动态代理

                JDK动态代理:aop的默认实现方式,但只能对实现接口的类使用

                 CGLIB:实现方式是通过创建类的子类来完成增强代码

        AOP重要的概念

                目标:通常对某注解标记为目标,也就是说对目标使用增强代码

                切面:是一个单独的类,在此类中会说明对什么目标进行监听,并且在什么时候完成什么样的增强代码,所以切面代码都会在切面中进行编写

                切入点:@pointcut会明确写明要切入的目标是什么,通常是目标对象的全路径

                通知:在什么时候完成什么样的代码,也就是增强代码的具体实现,通知分多种:前置、后置、环绕、返回、异常

                织入:将切面类加入到对象种,此过程由容器自动管理

例子:在项目种,用户要求埋点功能,想知道用户对页面功能的使用情况,比如用户点击了哪个功能多少次,使用时长是怎样的,如何使用的,那么我们将功能性接口加上了我们自定义的注解,并且写明此接口的属于哪个模块做什么功能的,并且通过切面类完成具体的增强操作来记录用户操作。

springMvc的工作机制。


    springMVC会将所有请求都交由DispatcherServlet。它会委托给应用其他模块进行真正的处理工作。
    DispatcherServlet会查询HandleMapping。找到对应的controller
    controller进行业务逻辑处理后,会返回一个modelAndView。
    DispatcherServlet查询viewResover(视图解析器)。找到modelAndView指定的视图对象。
    视图对象负责渲染页面返回客户端

SpringBoot的自动装配原理?


    我们首先从启动类的@SpringBootApplication 核心注解讲起。它里面其实是有另外三个核心注解组成。
        @ComponetScan : 组件扫描注解。他会将我们应用中添加了@Controller @Service @Componet 的类添加到spring容器中。
        @Configurtion : 允许在上下文中注册额外的bean或导入其他配置类。
        @EnableAutoConfiguration : 启动自动配置机制
            那我们看下这个注解里到底做了什么。
            @AutoConfigurationPackage : 将main包下所有组件注册到容器中
            @Import(AutoConfigurationImportSelector.class): 加载自动装配类。自动装配的核心功能其实也是通过此类实现的。
AutoConfigurationImportSelector这个类不光获取meta-info/spring.factories 下。还会获取springBoot Starter下的meta-info/spring.factories文件。

SpringBean的作用域

    spring有五种作用域

        单例模式:在ioc容器中只会有一个共享的bean,无论有多少bean引用他,最终指向的都是这同一个bean。

        原型模式:每次通过容器来获取bean的时候,都会创建一个新的bean实例。

        request:再一次请求中,容器返回的是同一个实例,如果有新请求,那么会创建新的实例供使用

        session:再一次session中,容器会使用同一个实例,有新的session则创建新的实例供使用

        全局session:在全局session中会使用同一个实例

反射:

        反射是java语言的特征之一,它能够在程序运行的过程中访问或使用该类的所有方法和变量,包括私有的方法,反射是框架的灵魂,注解和ioc的实现,是在反射的基础上实现的。

        我们首先需要了解class对象,在代码运行的时候,需要靠JVM编译代码来实现功能,但是JVM不能直接读懂我们写的代码,所以JVM会将代码转成.class文件,然后使用其中的代码。那么有了反射之后,意味着我们可以,不经过JVM的转义,就可以在程序运行的过程中动态使用目标类的方法,日常开发是无需使用,但是框架在运行的时候并不知道目标类信息的,所以用到了反射,比如Mybatis,它并不知道我们项目里有哪些类,但是通过配置类的地址他就能访问使用。

        如何使用:

        首先需要获取class对象,获取class对象的方式有三种:

        1.类名.class :StudentPo.class

        2.对象.class: StudentPo student = new StudentPo();

                                student.class

        3.全路径获取:Class.forName("全路径")

        得到了class文件后,可以通过class调用或获取方法信息

        class.getDeclaredMethod("getName",null);

        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值