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 创建,它是由持久层框架进⾏创建。

相关文章
|
14天前
|
监控 Java API
Spring cloud Hystrix 、Dashboard、API(zuul)相关报错
Spring cloud Hystrix 、Dashboard、API(zuul)相关报错
27 2
|
2天前
|
Java Spring 容器
【Spring底层原理】BeanFactory的实现
【Spring底层原理】BeanFactory的实现
6 0
|
2天前
|
Java API Spring
Spring Boot中的 6 种API请求参数读取方式
本文介绍了Spring Boot中6种常见的请求参数读取方式:@RequestParam用于加载URL查询参数,@PathVariable处理RESTful风格的URL路径参数,@MatrixVariable处理URL路径中的矩阵变量,@RequestBody用于读取POST/PUT请求的复杂请求体,@RequestHeader加载请求头信息,而@CookieValue则用于获取Cookie值。这些注解在不同场景下满足了API参数的多样化需求。
|
4天前
|
安全 算法 Java
Java Stream API:原理、应用与深入解析
Java Stream API:原理、应用与深入解析
|
4天前
|
Java Spring 容器
Spring底层原理之 BeanFactory 与 ApplicationContext
Spring底层原理之 BeanFactory 与 ApplicationContext
16 3
Qt 窗口常用位置API函数 & 绘图原理 & 双缓冲机制 总结
Qt 窗口常用位置API函数 & 绘图原理 & 双缓冲机制 总结
|
14天前
|
监控 安全 Java
Spring cloud原理详解
Spring cloud原理详解
27 0
|
14天前
|
Java 开发者 微服务
Spring Cloud原理详解
【5月更文挑战第4天】Spring Cloud是Spring生态系统中的微服务框架,包含配置管理、服务发现、断路器、API网关等工具,简化分布式系统开发。核心组件如Eureka(服务发现)、Config Server(配置中心)、Ribbon(负载均衡)、Hystrix(断路器)、Zuul(API网关)等。本文讨论了Spring Cloud的基本概念、核心组件、常见问题及解决策略,并提供代码示例,帮助开发者更好地理解和实践微服务架构。此外,还涵盖了服务通信方式、安全性、性能优化、自动化部署、服务网格和无服务器架构的融合等话题,揭示了微服务架构的未来趋势。
42 6
|
14天前
|
负载均衡 Java 开发者
Spring Cloud:一文读懂其原理与架构
Spring Cloud 是一套微服务解决方案,它整合了Netflix公司的多个开源框架,简化了分布式系统开发。Spring Cloud 提供了服务注册与发现、配置中心、消息总线、负载均衡、熔断机制等工具,让开发者可以快速地构建一些常见的微服务架构。
|
Java Spring 容器
Spring构造通过工厂创建bean
Spring构造通过工厂创建bean