Spring基础
1.Spring简介
spring的full-stack全栈是什么意思?
就是在每一层都有对应的解决方案,如web层有对应的spring MVC,在dao层有JDBC Template
1.1 Spring的思想
任何实际的应用程序都是由很多组件组成的,每个组件负责整个应用功能的一部分,这些组件需要与其他的应用元素进行协调以完成自己的任务。当应用程序运行时,需要以某种方式创建并引入这些组件。
Spring的核心是提供了一个容器(container),通常称为Spring应用上下文(Spring application context),它们会创建和管理应用组件。这些组件也可以称为bean,会在Spring应用上下文中装配在一起,从而形成一个完整的应用程序。这就像砖块、砂浆、木材、管道和电线组合在一起,形成一栋房子似的。
将bean装配在一起的行为是通过一种基于依赖注入(dependency injection DI)的模式实现的。此时,组件不会再去创建它所依赖的组件并管理它们的生命周期,使用依赖注入的应用依赖于单独的实体(容器)来创建和维护所有的组件,并将其注入到需要它们的bean中。通常,这是通过构造器参数和属性访问方法来实现的。
举例来说,假设在应⽤的众多组件中,有两个是我们需要处理的:库存服务(⽤来获取库存⽔平)和商品服务(⽤来提供基本的商品信息)。商品服务需要依赖于库存服务,这样它才能提供商品的完整信息。
图1.1阐述这些bean和Spring应⽤上下⽂之间的关系。
1.2 基于xml的配置方式
在核⼼容器之上,Spring及其⼀系列的相关库提供了Web框架、各种持久化可选⽅案、安全框架、与其他系统集成、运⾏时监控、微服务⽀持、反应式编程以及众多现代应⽤开发所需的特性。
在历史上,指导Spring应⽤上下⽂将bean装配在⼀起的⽅式是使⽤⼀个或多个XML⽂件(描述各个组件以及它们与其他组件的关联关系)。
例如,如下的XML描述了两个bean,也就是InventoryService bean和ProductService bean,并且通过构造器参数将InventoryService装配到了ProductService中:
1.3 基于Java的配置方式
但是,在最近的Spring版本中,基于Java的配置更为常⻅。如下基于Java的配置类是与XML配置等价的:
@Configuration注解会告知Spring这是⼀个配置类,会为Spring应⽤上下⽂提供bean。这个配置类的⽅法使⽤@Bean注解进⾏了标注,表明这些⽅法所返回的对象会以bean的形式添加到Spring的应⽤上下⽂中(默认情况下,这些bean所对应的bean ID与定义它们的⽅法名称是相同的)。
相对于基于XML的配置⽅式,基于Java的配置会带来多项额外的收益,包括更强的类型安全性以及更好的重构能⼒。即便如此,不管是使⽤Java还是使⽤XML的显式配置,只有当Spring不能进⾏⾃动配置的时候才是必要的。
1.4 自动配置
在Spring技术中,⾃动配置起源于所谓的⾃动装配(autowiring)和组件扫描(component scanning)。借助组件扫描技术,Spring能够⾃动发现应⽤类路径下的组件,并将它们创建成Spring应⽤上下⽂中的bean。借助⾃动装配技术,Spring能够⾃动为组件注⼊它们所依赖的其他bean。
最近,随着Spring Boot的引⼊,⾃动配置的能⼒已经远远超出了组件扫描和⾃动装配。Spring Boot是Spring框架的扩展,提供了很多增强⽣产效率的⽅法。最为⼤家所熟知的增强⽅法就是⾃动配置(autoconfiguration),Spring Boot能够基于类路径中的条⽬、环境变量和其他因素合理猜测需要配置的组件并将它们装配在⼀起。
我⾮常愿意为你展现⼀些关于⾃动配置的⽰例代码,但是我做不到。⾃动配置就像⻛⼀样,你可以看到它的效果,但是我找不到代码指给你说,“看!这就是⾃动配置的样例!”事情发⽣了,组件启⽤了,功能也提供了,但是不⽤编写任何代码。没有代码就是⾃动装配的本质,也是它如此美妙的原因所在。Spring Boot⼤幅度减少了构建应⽤所需的显式配置的数量(不管是XML配置还是Java配置)。实际上,当完成本章的样例时,我们会有⼀个可运⾏的Spring应⽤,该应⽤只有⼀⾏Spring配置代码。
Spring Boot极⼤地改善了Spring的开发,因此很难想象在没有它的情况下,如何开发Spring应⽤。因此,我们会将Spring和Spring Boot当成⼀回事。我们会尽可能多地使⽤Spring Boot,只有在必要的时候才使⽤显式配置。因为Spring XML配置是⼀种过时的⽅式,所以我们主要关注Spring基于Java的配置。
2.Spring优势
Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理
Spring工厂是用于生成bean
3.Spring体系结构
4.Spring开发步骤
这是之前的开发,现在是想借助spring框架完成解耦合
spring框架的作用就是读取这个配置文件,从而获得全包名,帮助创建对象的。
步骤:
(1)导入Spring开发的基本包坐标。导入框架对应的jar包,这里是maven,就是导入spring对应的maven坐标
(2)编写Dao接口和实现类。要获得UserDaoImpl对象,因此要编写UserDao的接口和UserDaoImpl的实现
(3)创建Spring核心配置文件。创建xml配置文件
(4)在Spring配置文件中配置UserDaoImpl。将UserDaoImpl的全包名配置到xml配置文件中
(5)使用Spring的API获得Bean实例。通过这句话UserDao userDao = Spring客户端.getBean(id标识);把标识传进去,最终返回一个对象,这样的话,就去找Spring容器去要对象,而不是自己去new对象的。
通过这五步可以完成解耦
后面如果替换成其他对象,直接在配置文件中修改就行了。
下面按照上面的五个步骤实现一下:
(0)创建maven工程
这个可以参考我的这一篇博客:https://www.cnblogs.com/GumpYan/p/13711056.html
(1)在pom.xml中导入坐标
(2)编写Dao接口和实现类
UserDao.java(接口)
package com.company.dao; public interface UserDao { public void save(); }
UserDaoImpl.java(实现类)
package com.company.dao.impl; import com.company.dao.UserDao; public class UserDaoImpl implements UserDao { public void save() { System.out.println("save running..."); } }
(3)创建Spring核心配置文件。创建xml配置文件,applicationContext.xml
如果没有Spring config,可以看这三篇文档解决:
https://blog.csdn.net/Javaytp/article/details/79637101#commentBox
https://www.cnblogs.com/iceywu/p/12366871.html
https://blog.csdn.net/wt_better/article/details/78162332
注意:一定要刷新项目工程
(4)在Spring配置文件中配置UserDaoImpl。将UserDaoImpl的全包名配置到xml配置文件中
(5)使用Spring的API获得Bean实例
package com.company.demo; import com.company.dao.UserDao; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserDaoDemo { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao) applicationContext.getBean("userDao"); userDao.save(); } }
打印出来结果: