Spring框架是由于软件开发的复杂性而创建的,Spring使用的是基本的JavaBean来完成以前只可能由EB完成的事。从简单性、可测性和松耦合性角度而言,绝大部分Java应用都可以用Spring。
2、spring的优缺点 2.1、优点- Spring属于低侵入设计。
- IOC将对象之间的依赖关系交给Spring,降低组件之间的耦合,实现各个层之间的解耦,让我们更专注于业务逻辑。
- 提供面向切面编程。
- 对各种主流插件提供很好的集成支持。
- 对事务支持的很好,只要配置即可,无须手动控制。
- 依赖反射,影响性能。
- spring5整个框架基于java8
- 支持http/2
- Spring Web MVC支持最新API
- Spring WebFlux 响应式编程
- 支持Kotlin函数式编程
负责创建对象、管理对象(通过依赖注入)、整合对象、配置对象以及管理这些对象的生命周期。
5、依赖注入(DI)依赖注入是Spring实现IoC的一种重要手段,将对象间的依赖关系的控制权从开发人员手里转移到容器。
6、IOC注入的方式- 构造器注入
- setter注入
- 接口注入(我们几乎不用)
- 组件之间的解耦,提高程序可维护性、灵活性。
- 创建对象步骤复杂,有一定学习成本。
- 利用反射创建对象,效率上有损。(对于代码的灵活性和可维护性来看,Spring对于我们的开发带来了很大的便利,这点损耗不算什么哦)
- Spring 对bean进行实例化。
- Spring将值和bean的引用注入到bean对应的属性中。
- 如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法。
- 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将bean所在的应用引用传入进来。
- 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用引用传入进来。
- 如果bean实现了BeanPostProcessor接口,Spring将调用他们的post-ProcessBeforeInitalization()方法。
- 如果bean实现了InitializingBean接口,Spring将调用他们的after-PropertiesSet()方法,类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用。
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法。
- 此时, bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用被销毁。
- 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
总结为4个阶段:
-
实例化 Instantiation
-
属性赋值 Populate
-
初始化 Initialization
-
销毁 Destruction
- 基于xml
- 基于注解
- 基于Java
- singleton:单例,每一个bean只创建一个对象实例。
- prototype,原型,每次对该bean请求调用都会生成各自的实例。
- request,请求,针对每次HTTP请求都会生成一个新的bean。表示在一次HTTP请求内有效。
- session,在一个http session中,一个bean定义对应一个bean实例。
- global session:在一个全局http session中,一个bean定义对应一个bean实例。
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
12、面向切面的通知类型- 前置通知(Before):目标方法被调用之前调用通知功能。
- 后置通知(After):目标方法完成之后调用通。
- 返回通知(After-returning):目标方法成功执行之后调用通知。
- 异常通知(After-throwing):目标方法抛出异常后调用通知。
- 环绕通知(Around):在被通知的方法调用之前和调用之后执行自定义的行为。
连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。
14、切点(Pointcut)切点的定义会匹配通知所要织入的一个或多个连接点。
我们通常使用明确的类和方法名称,或是利用正则表达式定义所匹配的类和方法名称来指定这些切点。有些AOP框架允许我们创建动态的切点,可以根据运行时的决策(比如方法的参数值)来决定是否应用通知。
15、切面(Aspect)切面是通知和切点的结合。通知和切点共同定义了切面的全部内容。
16、织入(Weaving)织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。
17、引入(Introduction)引入允许我们向现有的类添加新方法或属性。
18、在目标对象的生命周期里有哪些点可以织入-
编译期:切面在目标类编译时被织入。
AspectJ的织入编译器就是以这种方式织入切面的。
-
类加载期:切面在目标类加载到JVM时被织入。
它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5的加载时织入(load-time weaving,LTW)就支持以这种方式织入切面
-
运行期:切面在应用运行的某个时刻被织入。
一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。Spring AOP就是以这种方式织入切面的。
- 如果目标对象实现了接口,默认采用JDK动态代理。可以强制转为CgLib实现AOP。
- 如果没有实现接口,采用CgLib动态代理。
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
21、Spring MVCSpringMVC是Spring框架的一个模块。是一个基于MVC模式的框架。
22、Spring MVC的核心DispatcherServlet:前端控制器
23、Spring MVC的核心组件- DispatcherServlet:前端控制器,也叫中央控制器。相关组件都是它来调度。
- HandlerMapping:处理器映射器,根据URL路径映射到不同的Handlero
- HandlerAdapter:处理器适配器,按照HandlerAdapter的规则去执行Handler。
- Handler:处理器,由我们自己根据业务开发。
- ViewResolver:视图解析器,把逻辑视图解析成具体的视图。
- View :视图,一个接口,它的实现支持不同的视图类型 (freeMaker,JSP等)
- 用户请求旅程的第一站是DispatcherServlet。
- 收到请求后,DispatcherServlet调用HandlerMapping,获取对应的Handler。
- 如果有拦截器一并返回。
- 拿到Handler后,找到HandlerAdapter,通过它来访问Handler,并执行处理器。
- 执行Handler的逻辑。
- Handler会返回一个ModelAndView对象给DispatcherServlet。
- 将获得到的ModelAndView对象返回给DispatcherServlet。
- 请求ViewResolver解析视图,根据逻辑视图名解析成真正的View。
- 返回View给DispatcherServlet。
- DispatcherServlet对View进行渲染视图。
- DispatcherServlet响应用户。
- 具有Spring的特性。
- 可以支持多种视图(jsp,freemaker)等。
- 配置方便。
- 非侵入。
- 分层更清晰,利于团队开发的代码维护,以及可读性好。
不是。
27、spring实现自动装配组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean.
自动装配(autowiring):Spring自动满足bean之间的依赖。
28、bean注解- @Component:普通bran
- @Service:有表示service层的含义
- @Repository:有表示mapper层的含义
- @Controller:有表示controller层的含义
- Hibernate
- iBatis
- JPA (Java Persistence API)
- TopLink
- JDO (Java Data Objects)
- OJB
- @Repository:dao层注解,扫描注册bean
- @Value:将常量,配置中的变量值等注入变量中。
- @Controller:定制控制器
- @Aspect:声明一个切面
- @RequestMapping:映射web请求
- @ResponseBody:作用是将返回对象通过适当的转换器转成置顶格式,写进response的body区。通常用来返回json、xml等。
- @RestController:等于@ResponseBody + @Controller
- @PathVariable:接收路径参数
- @Cacheable:标记缓存查询
- @CacheEvict:清空缓存
- @Component:泛指组件,不好归类时使用它
- @Qualifier:当创建多个相同类型的bean时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用@Qualifier注释和@Autowired 注释通过指定哪一个真正的bean将会被装配来消除混乱。
- @Transaction:开启事务的注解
BeanFactory
- 它使用懒加载
- 它使用语法显式提供资源对象
- 不支持国际化
- 不支持基于依赖的注解
ApplicationContext
- 它使用即时加载
- 它自己创建和管理资源对象
- 支持国际化
- 支持基于依赖的注解
声明式:
- xml配置文件的方式。
- 注解方式(在类上添加@Transaction注解)。
编码式:
- 提供编码的形式管理和维护事务。
事务在嵌套方法调用中如何传递,具体如何传播,取决于事务传播行为。
34、事务- PROPAGATION_REQUIRED:支持当前事务,如果不存在,就新建一个。
- PROPAGATION_SUPPORTS:支持当前事务,如果不存在,就不使用事务
- PROPAGATION_MANDATORY:支持当前事务,如果不存在,抛出异常。
- PROPAGATION_REQUIRES_NEW:如果有事务存在,挂起当前事务,创建一个新的事务。
- PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果有事务存在,挂起当前事务。
- PROPAGATION_NEVER:以非事务方式运行,如果有事务存在,抛出异常。
- PROPAGATION_NESTED:如果当前事务存在,则嵌套事务执行。
结束!
什么都是短暂的,只有怀念和失去是漫长的。



