01-spring5:
spring
1、spring概念
1、什么是spring及优点
Spring框架使Java EE应用程序的开发更加简捷,通过使用POJO为基础的编程模型促进良好的编程风格。
轻量级:Spring在大小和透明性方面绝对属于轻量级的,基础版本的Spring框架大约只有2MB。
控制反转(IoC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。 把创建对象过程交给 Spring进行管理
面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来。 不修改源代码进行功能增强
容器:Spring包含并管理应用程序对象的配置及生命周期。
MVC框架:Spring的web框架是一个设计优良的web MVC框架,很好的取代了一些web框架。
事务管理:Spring对下至本地业务上至全局业务(JAT)提供了统一的事务管理接口。
异常处理:Spring提供一个方便的API将特定技术的异常(由JDBC, Hibernate, 或JDO抛出)转化为一致的、Unchecked异常。
2、spring架构图
2、spring-IOC-DI
1、IOC
IOC 负责创建管理对象(通过依赖注入DI,装配对象,配置对象,并且管理这些对象的整个生命周期。
使用IOC目的:为了降低耦合度
1、IOC底层(面试)
xml解析、工厂模式、反射
2、I0C容器实现的两种方式(两个接口)
(1)BeanFactory接口:IOC容器基本实现是Spring内部接口的使用接口,不提供给开发人员进行使用(加载配置文件时候不会创建对象,在获取对象时才会创建对象。)
(2)ApplicationContext接口:BeanFactory接口的子接口,提供更多更强大的功能,提供给开发人员使用(加载配置文件时候就会把在配置文件对象进行创建)推荐使用!
3、ApplicationContext通常的实现是什么?(面试)
FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean配置文件的全路径名必须提供给它的构造函数。
ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。
2、依赖注入DI
1、 什么是Spring的依赖注入?
依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。
2、有哪些不同类型的IOC(依赖注入)方式?
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
3、哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入?
你两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。
3、spring-Bean
1、spring-bean概念定义
1、什么是Spring beans?
Bean: 在Spring中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。Bean是由Spring IoC容器实例化,组装和以其他方式管理的对象。否则,bean仅仅是应用程序中许多对象之一。Bean及其之间的依赖关系反映在容器使用的配置元数据中。
Spring Beans是构成Spring应用核心的Java对象。这些对象由Spring IoC容器实例化、组装、管理。这些对象通过容器中配置的元数据创建,例如,使用XML文件中定义的创建。
2、 一个 Spring Bean 定义包含什么?
一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。
3、如何给Spring 容器提供配置元数据?
这里有三种重要的方法给Spring 容器提供配置元数据。
(1)XML配置文件。
(2)基于注解的配置。
(3)基于Java的配置
2、spring-xml注入
1、使用xml配置注入属性,set方式注入属性,有参构造方法注入
2、使用P名称空间注入
3、注入一些特殊类型的属性 【其他对象】
4、注入外部Bean 【比如数据库连接】
5、注入内部Bean属性 【对象包含对象】
6、注入集合属性 【list,map,set…】
3、FactoryBean
1、Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)
- 普通 bean:在配置文件中定义 bean 类型就是返回类型
- 工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样
案例演示
- 第一步 创建类,让这个类作为工厂 bean,实现接口 FactoryBean
- 第二步 实现接口里面的方法,在实现的方法中定义返回的 bean 类型
4、Spring Bean作用域
1、怎样在 Spring 里定义类的作用域
给这个bean声明一个作用域。可通过bean 定义中的scope属性来定义。
2、解释Spring支持的几种bean的作用域。
singleton : bean在每个Spring ioc 容器中只有一个实例。
prototype:一个bean的定义可以有多个实例。
request:将单个bean定义的范围限定为单个HTTP请求的生命周期; 也就是说,每个HTTP请求都有一个自己的bean实例,它是在单个bean定义的后面创建的。 仅在基于Web的Spring ApplicationContext上下文中有效。
session:将单个bean定义的作用域限定为HTTP会话的生命周期。 仅在web的Spring ApplicationContext上下文中有效。
application:将单个bean定义的作用域限定为ServletContext的生命周期。 仅在基于web的SpringApplicationContext上下文中有效。
websocket:将单个bean定义的作用域限定为WebSocket的生命周期。 仅在基于web的Spring ApplicationContext上下文中有效。
5、 Spring框架中的单例bean是线程安全的吗?
不,Spring框架中的单例bean不是线程安全的。
6、Spring Bean生命周期
https://blog.csdn.net/apeopl/article/details/82964799
1、Spring框架中bean的生命周期。
-
Spring容器 从XML 文件中读取bean的定义,并实例化bean。
-
Spring根据bean的定义填充所有的属性。
-
如果bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanName方法。
-
如果Bean实现了 BeanFactoryAware 接口, Spring传递beanfactory 给setBeanFactory方法。
-
如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。
-
如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。
-
如果有BeanPostProcessors 和bean关联,这些bean的postProcessAfterInitialization()方法将被调用。
-
如果bean实现了 DisposableBean,它将调用destroy()方法。
2、哪些是重要的bean生命周期方法? 你能重载它们吗?
初始化和销毁的时候(xml中init-method和destroy-method)(@PostConstruct和@PreDestroy)。
有两个重要的bean 生命周期方法,第一个是setup , 它是在容器加载bean的时候被调用。第二个方法是 teardown 它是在容器卸载类的时候被调用。
7、Spring Bean自动装配
1、什么是bean装配?
装配指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。
2、什么是bean的自动装配?
Spring 容器能够自动装配相互合作的bean,这意味着容器不需要和配置,能通过Bean工厂自动处理bean之间的协作。
3、解释不同方式的自动装配 。
no:默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。
byName:通过参数名自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。
byType::通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。
constructor:这个方式类似于byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。
8、Spring注解
1、什么是基于Java的Spring注解配置
@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用。另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。
2、Spring 针对 Bean 管理中创建对象提供注解
(1) @Component
(2) @Service
(3) @Controller
(4) @Repository
上面四个注解功能是一样的,都可以用来创建bean 实例
3、什么是基于注解的容器配置?
相对于XML,注解使用时开发时直接在相应的类,方法,属性上使用注解进行bean对象的组装和注入。
开发者通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用xml表述bean的装配关系。
4、怎样开启注解装配?
注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置 context:annotation-config/元素。
5、@Required 注解
这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出BeanInitializationException。
6、@Autowired 注解
@Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。它的用法和@Required一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。
7、@Qualifier 注解
当有多个相同类型的bean却只有一个需要自动装配时,将@Qualifier 注解和@Autowire 注解结合使用以消除这种混淆,指定需要装配的确切的bean。
4、Spring-AOP
1、AOP 基本概念
(1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得 业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
(2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能
(3)使用登录例子说明 AOP
2、AOP(底层原理)
1)AOP 底层使用动态代理 ,动态代理有两种情况:
第一种 有接口情况,使用 JDK 动态代理 ;创建接口实现类代理对象,增强类的方法
第二种 没有接口情况,使用 CGLIB 动态代理;创建子类的代理对象,增强类的方法
3、AOP(JDK 动态代理)
1)使用 JDK 动态代理,使用 Proxy 类里面的方法创建代理对象
调用 newProxyInstance 方法,方法有三个参数:
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h)
第一参数,类加载器
第二参数,增强方法所在的类,这个类实现的接口,支持多个接口
第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分
4、AOP(术语)
a)连接点:类里面哪些方法可以被增强,这些方法称为连接点(一个类里面所有的方法都可成为连接点)
b)切入点:实际被真正增强的方法称为切入点(真正被增强的方法,比如给类中的add()方法进行增强。add就是实际切入点)
c)通知(增强):实际增强的逻辑部分称为通知,且分为以下五种类型:
1)前置通知 2)后置通知 3)环绕通知 4)异常通知 5)最终通知
d)切面:把通知应用到切入点过程(一个过程)
5、AOP操作
a)Spring 框架一般都是基于 AspectJ 实现 AOP 操作,AspectJ 不是 Spring 组成部分,独立 AOP 框架,一般把 AspectJ 和 Spirng 框架一起使 用,进行 AOP 操作
b)基于 AspectJ 实现 AOP 操作:1)基于 xml 配置文件实现 (2)基于注解方式实现(使用)
c)引入相关jar包
d)切入点表达式,如下:
(1)切入点表达式作用:知道对哪个类里面的哪个方法进行增强
(2)语法结构: execution([权限修饰符] [返回类型] [类全路径] 方法名称 )
(3)例子如下:
例 1:对 com.zh.dao.BookDao 类里面的 add 进行增强
execution(* com.zh.dao.BookDao.add(..))
例 2:对 com.zh.dao.BookDao 类里面的所有的方法进行增强
execution(* com.zh.dao.BookDao.* (..))
例 3:对 com.zh.dao 包里面所有类,类里面所有方法进行增强
execution(* com.zh.dao.*.* (..))
execution: For matching method execution join points. This is the primary pointcut designator to use when working with Spring AOP.
execution:用于匹配到方法级别的连接点,这也是spring aop中最为常用的PCD。
within: Limits matching to join points within certain types (the execution of a method declared within a matching type when using Spring AOP).
within:只能匹配到具体类的类型级别
this: Limits matching to join points (the execution of methods when using Spring AOP) where the bean reference (Spring AOP proxy) is an instance of the given type.
this : 只能匹配目标类的代理类是否是this中指定的类型
target: Limits matching to join points (the execution of methods when using Spring AOP) where the target object (application object being proxied) is an instance of the given type.
target:只能匹配目标类是否是target中指定的类型
args: Limits matching to join points (the execution of methods when using Spring AOP) where the arguments are instances of the given types.
args:仅仅按照目标方法的参数类型来进行匹配,与方法所在类的包名和参数名无关。
@target: Limits matching to join points (the execution of methods when using Spring AOP) where the class of the executing object has an annotation of the given type.
@target:匹配目标类中有@target指定的注解
@args: Limits matching to join points (the execution of methods when using Spring AOP) where the runtime type of the actual arguments passed have annotations of the given types.
@args:匹配参数中有@args中指定的注解类型的方法
@within: Limits matching to join points within types that have the given annotation (the execution of methods declared in types with the given annotation when using Spring AOP).
@within:匹配目标类有@within中指定的注解的类
@annotation: Limits matching to join points where the subject of the join point (the method being executed in Spring AOP) has the given annotation.
@annotation:匹配方法上有@annotation中指定的注解类型的方法。
e the given annotation (the execution of methods declared in types with the given annotation when using Spring AOP).
@within:匹配目标类有@within中指定的注解的类
@annotation: Limits matching to join points where the subject of the join point (the method being executed in Spring AOP) has the given annotation.
@annotation:匹配方法上有@annotation中指定的注解类型的方法。
参考:https://blog.csdn.net/qq_35843514/article/details/114287046?spm=1001.2014.3001.5501
学习路径:https://space.bilibili.com/302417610/,如有侵权,请联系q进行删除:3623472230