Spring 使创建 Java 企业应用程序变得容易。它提供了在企业环境中使用 Java 语言所需的一切,支持 Groovy 和 Kotlin 作为 JVM 上的替代语言,并且可以根据应用程序的需要灵活地创建多种架构。从 Spring framework 5.1 开始,Spring 需要 JDK 8+(Java SE 8+)并为 JDK 11 LTS 提供开箱即用的支持。建议将 Java SE 8 update 60 作为 Java 8 的最低补丁版本,但通常建议使用最新的补丁版本。
Spring 支持广泛的应用场景。在大型企业中,应用程序往往存在很长时间,并且必须运行在升级周期不受开发人员控制的JDK和应用程序服务器上。其他可能作为嵌入服务器的单个 jar 运行,可能在云环境中。还有一些可能是不需要服务器的独立应用程序(例如批处理或集成工作负载)。
Spring 是开源的。它拥有一个庞大而活跃的社区,可根据各种实际用例提供持续的反馈。这帮助 Spring 在很长一段时间内成功发展。
Spring 框架分为多个模块。应用程序可以选择他们需要的模块。核心是核心容器的模块,包括配置模型和依赖注入机制。除此之外,Spring framework 为不同的应用程序架构提供基础支持,包括消息传递、事务数据和持久性以及 Web。它还包括基于 Servlet 的 Spring MVC Web 框架,以及并行的 Spring WebFlux 反应式 Web 框架。
Spring 的历史和 Spring 框架
随着时间的推移,Java EE 在应用程序开发中的作用不断发展。在 Java EE 和 Spring 的早期,创建应用程序是为了部署到应用程序服务器。今天,在 Spring Boot 的帮助下,应用程序以一种 DevOps 和云友好的方式创建,嵌入了 Servlet 容器,更改起来很简单。从 Spring framework 5 开始,WebFlux 应用程序甚至不直接使用 Servlet API,并且可以在不是 Servlet 容器的服务器(例如 Netty)上运行。
Spring 不断创新和发展。除了 Spring 框架之外,还有其他项目,例如 Spring Boot、Spring Security、Spring Data、Spring Cloud、Spring Batch 等。重要的是要记住,每个项目都有自己的源代码存储库、问题跟踪器和发布节奏。有关Spring 项目的完整列表,请参阅spring.io/projects。
设计理念
-
提供各个级别的选择。Spring 允许您尽可能晚地推迟设计决策。例如,您可以在不更改代码的情况下通过配置切换持久性提供程序。许多其他基础设施问题和与第三方 API 的集成也是如此。
-
包容不同的观点。Spring 拥抱灵活性,并且对事情应该如何做没有固执己见。它以不同的视角支持广泛的应用需求。
-
保持强大的向后兼容性。Spring 的演变经过精心管理,以强制在版本之间进行很少的重大更改。Spring 支持精心挑选的一系列 JDK 版本和第三方库,以方便维护依赖 Spring 的应用程序和库。
-
关心 API 设计。Spring 团队投入了大量的思想和时间来制作直观的 API,这些 API 可以跨越多个版本和多年。
-
为代码质量设定高标准。Spring framework 非常强调有意义、最新和准确的 javadoc。它是极少数可以声称代码结构清晰且包之间没有循环依赖关系的项目之一。
编写我们的 spring 文件 , 这里我们命名为applicationcontext.xmlorg.springframework spring-webmvc5.1.10.RELEASE
该id属性是一个字符串,用于标识单个 bean 定义。
该class属性定义 bean 的类型并使用完全限定的类名。
实例化一个容器
@Test
public void test1(){
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationcontext.xml");
// 取出
User user = (User) applicationContext.getBean("user");
System.out.println(user);
}
IOC
创建对象方式
.
通过无参构造方法来创建
结果可以发现,在调用
show
方法之前,
User
对象已经通过无参构造初始化了!
.
通过有参构造方法来创建
. beans.xml
有三种方式编写
import 团队的合作通过 import 来实现 .
数组注入
List 注入西游记 红楼梦 水浒传
Map 注入
听歌 看电影 爬山
set 注入
P 命名空间注入 : 需要在头文件中假如约束文件LOL BOB COC
导入约束 : xmlns:p="http://www.springframework.org/schema/p"c 命名空间注入 : 需要在头文件中假如约束文件
导入约束 : xmlns:c="http://www.springframework.org/schema/c"Bean 的作用域 在 Spring 中,那些组成应用程序的主体及由 Spring IoC 容器所管理的对象,被称之为 bean 。简单地讲, bean就是由 IoC 容器初始化、装配及管理的对象 . Bean 的自动装配 自动装配是使用 spring 满足 bean 依赖的一种方法 spring 会在应用上下文中为某个 bean 寻找其依赖的 bean Spring 中 bean 有三种装配机制,分别是: 1. 在 xml 中显式配置; 2. 在 java 中显式配置; 3. 隐式的 bean 发现机制和自动装配。 Spring 的自动装配需要从两个角度来实现,或者说是两个操作: 1. 组件扫描 (component scanning) : spring 会自动发现应用上下文中所创建的 bean ; 2. 自动装配 (autowiring) : spring 自动满足 bean 之间的依赖,也就是我们说的 IoC/DI ; 组件扫描和自动装配组合发挥巨大威力,使的显示的配置降低到最少。 byName autowire byName ( 按名称自动装配 ) 由于在手动配置 xml 过程中,常常发生字母缺漏和大小写等错误,而无法对其进行检查,使得开发效率降低。 采用自动装配将避免这些错误,并且使配置简单化。
当一个 bean 节点带有 autowire byName 的属性时。 1. 将查找其类中所有的 set 方法名,例如 setCat ,获得将 set 去掉并且首字母小写的字符串,即 cat 。 2. 去 spring 容器中寻找是否有此字符串名称 id 的对象。 3. 如果有,就取出注入;如果没有,就报空指针异常。 byType autowire byType ( 按类型自动装配 ) 使用 autowire byType 首先需要保证:同一类型的对象,在 spring 容器中唯一。如果不唯一,会报不唯一的异常。 使用注解 jdk1.5 开始支持注解, spring2.5 开始全面支持注解。 准备工作: 利用注解的方式注入属性。 1. 在 spring 配置文件中引入 context 文件头
xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd开启属性注解支持!
@Autowired (重点) @Autowired 是按类型自动转配的,不支持 id 匹配。 需要导入 spring-aop 的包! 自动把一个类装配到另外一个类中 @Qualififier @Autowired 是根据类型自动装配的,加上 @Qualififier 则可以根据 byName 的方式自动装配 @Qualififier 不能单独使用。
@Autowired @Qualifier(value = "cat2") private Cat cat; @Autowired @Qualifier(value = "dog2") private Dog dog;@Resource @Resource 如有指定的 name 属性,先按该属性进行 byName 方式查找装配; 其次再进行默认的 byName 方式进行装配; 如果以上都不成功,则按 byType 的方式自动装配。 都不成功,则报异常。 小结 @Autowired 与 @Resource 异同: 1. @Autowired 与 @Resource 都可以用来装配 bean 。都可以写在字段上,或写在 setter 方法上。 2. @Autowired 默认按类型装配(属于 spring 规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的 required 属性为 false ,如: @Autowired(required=false) ,如果我 们想使用名称装配可以结合 @Qualififier 注解进行使用 3. @Resource (属于 J2EE 复返),默认按照名称进行装配,名称可以通过 name 属性进行指定。如果没有指定name 属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在 setter 方法上默认取属性名进行装配。 当找不到与名称匹配的 bean 时才按照类型进行装配。但是 需要注意的是,如果 name 属性一旦指定,就只会按照名称进行装配。 它们的作用相同都是用注解方式注入对象,但执行顺序不同。 @Autowired 先 byType , @Resource 先 byName 使用注解开发 、说明 在 spring4 之后,想要使用注解形式,必须得要引入 aop 的包
Bean 的实现 我们之前都是使用 bean 的标签进行 bean 注入,但是实际开发中,我们一般都会使用注解! . 配置扫描哪些包下的注解org.springframework spring-aop5.3.5
@Component("user")
// 相当于配置文件中
public class User {
public String name = "111";
}
属性注入
使用注解注入属性
1.
可以不用提供
set
方法,直接在直接名上添加
@value("
值
")
@Component("user")
// 相当于配置文件中
public class User {
@Value("111")
// 相当于配置文件中
public String name;
}
如果提供了
set
方法,在
set
方法上添加
@value("
值
");
衍生注解
我们这些注解,就是替代了在配置文件当中配置步骤而已!更加的方便快捷!
@Component
三个衍生注解
为了更好的进行分层,
Spring
可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。
@Controller
:
web
层
@Service
:
service
层
@Repository
:
dao
层
写上这些注解,就相当于将这个类交给
Spring
管理装配了!
小结
XML
与注解比较
XML
可以适用任何场景 ,结构清晰,维护方便
注解不是自己提供的类使用不了,开发简单方便
xml
与注解整合开发
:推荐最佳实践
xml
管理
Bean
注解完成属性注入
使用过程中, 可以不用扫描,扫描是为了类上的注解



