Spring工厂API与原理

简介: Spring工厂API与原理

1. Spring 核心 API

ApplicationContext

作⽤:Spring 提供的 ApplicationContext 这个⼯⼚,⽤于对象的创建

好处:解耦合

ApplicationContext 接⼝类型

接⼝:屏蔽实现的差异

⾮web环境 : ClassPathXmlApplicationContext (main junit)

web环境 : XmlWebApplicationContext

image.png


ApplicationContext 是重量级资源。会占用大量内存。

So 不会频繁的创建对象 : ⼀个应⽤只会创建⼀个⼯⼚对象。

一定是线程安全的。

2. 程序开发

  1. 创建类型
  2. 配置⽂件的配置 applicationContext.xml
<bean id="person" class="com.snow.po.Person"/>


 3.通过⼯⼚类,获得对象

ApplicationContext ctx 
    = new ClassPathXmlApplicationContext("/applicationContext.xml"); 

Person person = (Person)ctx.getBean("person"); 

3. 细节分析

3.1 名词解释

Spring⼯⼚创建的对象,叫做 bean 或者组件(componet)

3.2 Spring⼯⼚的相关的⽅法

//  通过这种⽅式获得对象,就不需要强制类型转换
Person person = ctx.getBean("person", Person.class);
System.out.println("person = " + person);

//  当前Spring的配置⽂件中 只能有⼀个<bean class是Person类型
Person person = ctx.getBean(Person.class);
System.out.println("person = " + person);

//  获取的是 Spring⼯⼚配置⽂件中所有bean标签的id值 person person1
String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
    System.out.println("beanDefinitionName = " +
                       beanDefinitionName);
}

//  根据类型获得Spring配置⽂件中对应的id值集合
String[] beanNamesForType = ctx.getBeanNamesForType(Person.class);
for (String id : beanNamesForType) {
    System.out.println("id = " + id);
}

//  ⽤于判断是否存在指定id值的bean
//  ⽤于判断是否存在指定id值得bean,不能判断name值
if (ctx.containsBeanDefinition("a")) {
    System.out.println("true = " + true);
}else{
    System.out.println("false = " + false);
}

//  ⽤于判断是否存在指定id值的bean
//  ⽤于判断是否存在指定id值得bean,也可以判断name值
if (ctx.containsBean("person")) {
    System.out.println("true = " + true);
}else{
    System.out.println("false = " + false);
}

3.3 配置⽂件中需要注意的细节

1. 只配置class属性
<bean class="com.snow.po.Person"/>
    a) 上述这种配置 有没有id值 有 -> 默认:com.snow.po.Person#0
    b) 应⽤场景: 如果这个bean只需要使⽤⼀次,那么就可以省略id值
    如果这个bean会使⽤多次,或者被其他bean引⽤则需要设置id值

2. name属性
作⽤:⽤于在Spring的配置⽂件中,为bean对象定义别名(⼩名)
相同:
1. ctx.getBean("id|name")-->object
2. <bean id="student" class=""
         等效
   <bean name="student,stu,xuesheng" class=""
区别:
  别名可以定义多个, 但是id属性只能有⼀个值
//⽤于判断是否存在指定id值得bean,不能判断name值
if (ctx.containsBeanDefinition("person")) {
    System.out.println("true = " + true);
}else{
    System.out.println("false = " + false);
}
//⽤于判断是否存在指定id值得bean,也可以判断name值
if (ctx.containsBean("p")) {
    System.out.println("true = " + true);
}else{
    System.out.println("false = " + false);
}

4. Spring⼯⼚的底层实现原理(简易版)

Spring⼯⼚是可以调⽤对象私有的构造⽅法创建对象(反射)

image.png

5. 思考

问题:在开发过程中,是不是所有的对象,都会交给 Spring ⼯⼚来创建呢?

回答:理论上 是的,但是有特例 :实体对象(entity)是不会交给 Spring 创建,它是由持久层框架进⾏创建。

相关文章
|
30天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
40 4
|
1月前
|
Java API 数据库
如何使用Spring Boot构建RESTful API,以在线图书管理系统为例
【10月更文挑战第9天】本文介绍了如何使用Spring Boot构建RESTful API,以在线图书管理系统为例,从项目搭建、实体类定义、数据访问层创建、业务逻辑处理到RESTful API的实现,详细展示了每个步骤。通过Spring Boot的简洁配置和强大功能,开发者可以高效地开发出功能完备、易于维护的Web应用。
56 3
|
1月前
|
IDE Java API
基于Spring Boot REST API设计指南
【10月更文挑战第4天】 在现代的软件开发中,RESTful API已经成为了构建网络应用的标准之一。它通过HTTP协议提供了与资源交互的方式,使得不同的应用程序能够进行数据交互。Spring Boot作为一个功能强大的框架,它简化了配置和开发流程,成为了构建RESTful API的理想选择。本文将详细介绍如何在Spring Boot中设计和实现高质量的RESTful API,并提供一些最佳实践。
48 1
|
29天前
|
缓存 Java API
基于Spring Boot REST API设计指南
【10月更文挑战第11天】 在构建现代Web应用程序时,RESTful API已成为一种标准,使得不同的应用程序能够通过HTTP协议进行通信,实现资源的创建、读取、更新和删除等操作。Spring Boot作为一个功能强大的框架,能够轻松创建RESTful API。本文将详细介绍如何在Spring Boot中设计和实现高质量的RESTful API。
118 61
|
1天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
9 2
|
1天前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
8 0
|
1月前
|
Java Spring 容器
Spring底层原理大致脉络
Spring底层原理大致脉络
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
123 9
|
1月前
|
Java Spring
获取spring工厂中bean对象的两种方式
获取spring工厂中bean对象的两种方式
37 1
|
1月前
|
安全 Java API
基于Spring Boot REST API设计指南
【10月更文挑战第10天】 在现代Web应用开发中,RESTful API扮演着至关重要的角色。Spring Boot作为一个高效、便捷的Java开发框架,为构建RESTful API提供了强大的支持。本文将分享基于Spring Boot的REST API设计指南,涵盖从项目初始化到API文档配置的全过程。
40 0

热门文章

最新文章