对Spring的了解:
spirng其实就是一个轻量级的框架,用他整合其他的框架使用,他主要的思想就是AOP和IOC,
AOP:底层就是动态代理来实现的,所谓的动态代理就是说 AOP 框架不会去修改字节 码,而是每次运行时在内存中临时为方法生成一个 AOP 对象,这个 AOP 对象包含了 ,目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。Spring AOP 中的动态代理主要有两种方式,JDK 动态代理和 CGLIB 动态代理:JDK 动态代理只提供接口的代理,不支持类的代理。核心InvocationHandler 接口和 Proxy 类,InvocationHandler 通过 invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy 利用InvocationHandler 动态创建一个符合接口的的实例,生成目标类的代理对象。如果代理类没有实现 InvocationHandler 接口,那么 Spring AOP 会选择使用 CGLIB 来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现 AOP。CGLIB 是通过继承的方式做的动态代理,因此如果某个类被标记为 final,那么它是无法使用 CGLIB 做动态代理的。不过在我们的业务场景中没有代理过final的类,基本上都代理的controller层实现权限以及日志,还有就是service层实现事务统一管理。
IOC:ioc就是控制反转,将创建对象反转给spring,由spring来创建,如果需要某个对象通过DI从容器中获取: Spring 提供了两种 IoC 容器,分别为 BeanFactory 和 ApplicationContext BeanFactory 是基础类型的 IoC 容器,提供了完整的 IoC 服务支持。简单来说,BeanFactory 就是一个管理 Bean的工厂,它主要负责初始化各种 Bean,并调用它们的生命周期方法。ApplicationContext 是 BeanFactory 的子接口,也被称为应用上下文。它不仅提供了 BeanFactory 的所有功能,还添加了对 i18n(国际化)、资源访问、事件传播等方面的良好支持。他俩的主要区别在于,如果 Bean 的某一个属性没有注入,则使用 BeanFacotry 加载后,在第一次调用 getBean()方法时会抛出异常,但是呢ApplicationContext 会在初始化时自检,这样有利于检查所依赖的属性是否注入。因此,在实际开发中,通常都选择使用 ApplicationContex
AOP的应用场景(3)
当时进行redis增强使用过aop的设计思想 首先我们定义了两个注解,分别是用来删除的和查询缓存 删除的注解中的值:key,fieldKey 缓存和查询的注解中的值:key,fieldKey,expired(过期时间默认值为3600) 然后在需要缓存或者是删除的方法上添加相应的注解 在切面类中定义两个切入点,分别对应两种注解 如果是删除注解,定义一个后置通知的拦截器,获取到注解上的值,然后根据对应的值执行删除 如果是缓存注解,定义一个环绕通知的拦截器,获取到注解上的值,先从redis中查询该缓存。
除了这块儿,其实我们项目上关于公共异常捕获和网关都是使用aop思想,我们的单点登录、用户鉴权就是再网关实现的,用户访问接口时,会先经过网关这个切面,我们对用户携带的token进行校验
IOC/DI(Dependency Injection,依赖注入)(4)
控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理,传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,使得程序的整个体系结构变得非常灵活。
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,注入到ioc中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的。依赖注入的底层是通过反射来实现的,它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。
configuration和component的区别(2)
1,configuration底层通过CGLIB动态代理获取注入到IOC的单例对象,而component内部通过bean注入时,如果方法被重复调用,会重新创建注入对象,覆盖已注入ioc的对象(也就说没有动态代理)。
2,configuration和bean来自同一个包,一般我们再写配置类的时候,会使用二者的组合,而component一般会作为一个独立对象扫描的扫描组件使用。
3,在配置类中,如果多个bean注入的对象有相互依赖或引用的情况下,尽量使用configuration(在boot版本2.2.6以后,component也支持,但不能保证调到的对象唯一)
请解释 Spring Bean 的生命周期?
-
通过构造器或工厂方法创建bean实例;
-
为bean的属性赋值;
-
调用bean的初始化方法;
-
使用bean;
-
当容器关闭时,调用bean的销毁方法;
请解释 Spring Bean 的自动装配?
Spring支持IOC,自动装配不用类实例化,直接从bean容器中取。
1、配置在xml中
<bean id="employeeDAO" class="com.guor.EmployeeDAOImpl" autowire="byName" /> 2、@Autowired自动装配
spring 、springboot、spring cloud区别
Spring是一个生态体系
Spring Framework是整个spring生态的基石,针对于开发的WEB层(springMVC)、业务层(IoC)、持久层(jdbcTemplate)等都提供了多种配置解决方案
Spring Boot默认集成了很多第三方包,将过去繁杂的配置改为注解和Java代码实现
Spring Cloud是一整套基于Spring Boot的微服务解决方案,包括**配置管理、注册中心、负载均衡、限流、网关等。
spring的常用注解(4)
bean,controller,restcontroller,requestbody,responsebody,service,autowire,recourse,requestmapping(get,post,put),requestparam,param,Component,componentscan,value,configuration,Transactional