Spring核心(IoC) 入门解读
什么是IoC容器和Bean?
说到容器,就是用来装东西,那么这里边装的是什么那?是bean对象。那么你会问什么是bean?这就要从很久很久以前说起,当我们创建对象的时候,我们会new一个对象出来,但是会有这么一个问题,当我们在不同的包下需要this对象的时候,我们都会进行new的操作,这还只是一个对象,那么要创建多个对象呢?
是不是很麻烦。Spring为我们解决了这一个难题,我们不在需要自己创建对象,由Sprig的BeanFactory为我们创建。所以说由SpringIoC容器管理的对象是bean对象,反过来说bean是由SpringIoc容器实例化、配置、组装的对象,而BeanFactory是SpringIoC的对象生产工厂。
思路结构:SpringIoC容器 --> BeanFactory工厂 --> bean对象
如何配置容器?
容器是个好东西,可以装bean对象、装水、装妹子……,容器该怎么使用那?有三种方式:
1、基于xml配置元数据
2、基于注解的方式告诉spring这个类要加载到容器当中去
3、基于java代码配置
简单介绍基于xml文件配置元数据(元数据就是实例化bean对象,处理bean对象之间的依赖等等一系列有关bean的配置)
xml文件基本结构:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="【bean的别名】" class="【bean的完全限定的类名】">
<property name="【bean中对象参数名称】" ref="【所依赖的bean的别名】"/>
</bean>
举个栗子
<bean id="demo" class="com.taobao.Seller">
<property name="product" ref="productBean"/>
</bean>
<bean id="productBean" class="com.taobao.Product">
<property name="id" value="007"/>
</bean>
实例化容器:
实例化容器一般在测试的时候用到:
知识小助手 --> 虽说SpringIoC容器靠BeanFactory工厂来创建对象的,但是更多的是org.springframework.context.ApplciationContext这个BeanFactory的子接口来做的,ApplicationContext是对BeanFactory的完善和补充。
容器的实例化是通过ApplicationContext来实例化的,其两个实现是ClassPathXmlApplicatonContext和FileSystemXmlApplication
举个栗子
//加载我们所配置的xml文件,默认从resource开始加载,可以加载多个xml文件哦
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml"); // getBean这个方法一看就是获取具体的bean,参数(bean的别名,bean的class)
PetStoreService service = context.getBean("petStore", PetStoreService.class); // 拿到对象调用对象的getUsernameList()方法
List<String> userList = service.getUsernameList();
--> 以上就是容器简单的实例化
bean的详细概述:
Name: bean的命名
提倡小驼峰命名规则,可以使用id属性和name属性进行命名,在使用内部bean和开启自动装配时也可以不用命名,容器会为该bean生成唯一的名称。
bean的实例化方式:
1、Constructor arguments: 构造函数参数
在容器本身通过反向调用其构造函数直接创建bean的情况下指定要构造的bean类,需要bean的无参构造,稍微等同于使用new运算符的Java代码。
2、静态工厂方法实例化
定义使用静态工厂方法创建的bean时,请使用该class 属性指定包含static工厂方法的类,并使用factory-method名称的属性指定工厂方法本身的名称。您应该能够调用此方法(使用可选参数,如稍后所述)并返回一个活动对象,随后将其视为通过构造函数创建的对象。
举个栗子
//静态工厂类
public class ClientService {
private static ClientService clientService = new ClientService();
private ClientService() {} public static ClientService createInstance() {
return clientService;
}
} <bean id="clientService"
class="examples.ClientService"
factory-method="createInstance"/>
3、实例工厂方法实例化
与通过静态工厂方法实例化类似,使用实例工厂方法进行实例化会从容器调用现有bean的非静态方法来创建新bean。
举个栗子
//实例工厂类
public class DefaultServiceLocator { private static ClientService clientService = new ClientServiceImpl(); public ClientService createClientServiceInstance() {
return clientService;
}
} <!--现有的bean-->
<bean id="serviceLocator" class="examples.DefaultServiceLocator"/> <!-- 通过现有的bean的方法返回clientService对象 -->
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
bean的依赖注入DI
依赖注入(DI)是一个过程,通过这个过程,对象只能通过构造函数参数,工厂方法的参数或在构造对象实例后在对象实例上设置的属性来定义它们的依赖关系(即,它们使用的其他对象)。
DI存在两个主要变体:基于有参构造注入和基于Setter注入。
//有参构造
public class SimpleMovieLister { private MovieFinder movieFinder; public SimpleMovieLister(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
<beans>
<bean id = "movieFinder" class = "a.b.MovieFinder"/>
//通过构造函数注入
<bean id="simpleMovieLister" class="a.b.SimpleMovieLister">
<constructor-arg ref="movieFinder"/>
</bean>
</beans> //基于Setter注入
public class SimpleMovieLister { private MovieFinder movieFinder; public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
} }
<beans>
<bean id = "movieFinder" class = "a.b.MovieFinder"/> <bean id="simpleMovieLister" class="a.b.SimpleMovieLister">
<property name="movieFinder" ref="movieFinder">
</property>
</bean>
</beans>
bean的自动装配
当然也可以使用@Autowire按照类型装配和@Resource按照名称装配的注解
bean的范围
singleton:(默认)将单个bean定义范围限定为每个Spring IoC容器的单个对象实例。
protpeype: 将单个bean定义范围限定为任意数量的对象实例。
request: 将单个bean定义范围限定为单个HTTP请求的生命周期。也就是说,每个HTTP请求都有自己的bean实例,它是在单个bean定义的后面创建的。仅在具有Web感知功能的Spring环境中有效ApplicationContext。
session: 将单个bean定义范围限定为HTTP的生命周期Session。仅在具有Web感知功能的Spring环境中有效ApplicationContext。
application: 将单个bean定义范围限定为a的生命周期ServletContext。仅在具有Web感知功能的Spring环境中有效ApplicationContext。
websocket: 将单个bean定义范围限定为a的生命周期WebSocket。仅在具有Web感知功能的Spring环境中有效ApplicationContext
Spring核心(IoC) 入门解读的更多相关文章
- 二 Spring的IOC入门,环境搭建,Spring测试类
IOC:inversion of Control 控制反转,Spring框架的核心.削减计算机程序的耦合问题,把对象(例如JDBC)的创建权交给Spring. IOC的两种类型: 依赖注入: 依赖查 ...
- Spring核心--IOC
先说说Spring框架 Spring框架 Spring框架的作用 Spring 的核心(IOC功能) SpringAOP功能 原有的业务流程:请求->servlet-->service-- ...
- Spring核心 IoC和AOP原理
1. 什么是Spring Spring是一个轻量的Java开源框架,它简化了应用开发,实现基于POJO的编程模型.它的两大核心是:IoC(控制反转),AOP(面向切面编程). 2. IoC控制反转 简 ...
- Spring核心--IOC&AOP
Ioc(控制反转) 所谓的控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转. AOP(面向切面编程) ...
- 简单解析Spring核心IOC容器原理
将大体流程解析了一边,具体可以看源代码一个方法一个方法的跟下 XmlBeanFactory的功能是建立在DefaultListableBeanFactory这个基本容器的基础上的,并在这个基本容器的基 ...
- spring的IOC入门案例
步骤: 一,导入jar 二,创建类,在类里创建方法 三,创建Spring配置文件,配置创建类 四,写代码测试对象创建
- Spring之 IOC&依赖注入
0x01.Spring 1什么是Spring Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的(解耦). 框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组 ...
- Spring第一天——入门与IOC
大致内容 spring基本概念 IOC入门 [17.6.9更新],如何学习spring? 掌握用法 深入理解 不断实践 反复总结 再次深入理解与实践 一.Spring相关概念 1.概述: Sprin ...
- Spring框架[一]——spring概念和ioc入门(ioc操作xml配置文件)
Spring概念 spring是开源的轻量级框架(即不需要依赖其他东西,可用直接使用) spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码来实现: ioc:控制反转,比如:有一个 ...
- Spring入门1. IoC入门实例
Spring入门1. IoC入门实例 Reference:Java EE轻量级解决方案——S2SH 前言: 之前学习过关于Spring的一点知识,曾经因为配置出现问题,而总是被迫放弃学习这些框架技术, ...
随机推荐
- 字典树(Trie)详解
详解字典树(Trie) 本篇随笔简单讲解一下信息学奥林匹克竞赛中的较为常用的数据结构--字典树.字典树也叫Trie树.前缀树.顾名思义,它是一种针对字符串进行维护的数据结构.并且,它的用途超级广泛.建 ...
- 【nodejs原理&源码赏析(5)】net模块与通讯的实现
目录 一. net模块简介 二. Client-Server的通讯 2.1 server的建立 2.2 Socket的建立 三. IPC通讯 四. 撸一个简易的cluster通讯模型 示例代码托管在: ...
- 我的计划任务 --- 实现市电停电安全关闭群辉,Windows, Linux等设备
有一次突然停电,我的群辉DS218+ 的一块硬盘出现故障了,让我担心我的数据安全,其实我是有UPS, 不是在线式的,然后就想如何实现停电自动关机呢? 经过半天的了解,其实群辉支持telnet协议,于是 ...
- windows平台多网卡设置路由
添加路由命令: route add 192.168.4.0 mask 255.255.255.0 192.168.4.1 metric 20 if 11 -p 其中192.168.4.0 是网络目标, ...
- java基础(3):变量、运算符
1. 变量 1.1 变量概述 前面我们已经学习了常量,接下来我们要学习变量.在Java中变量的应用比常量的应用要多很多.所以变量也是尤为重要的知识点! 什么是变量?变量是一个内存中的小盒子(小容器), ...
- 记录一次netcore3.0 code first使用迁移命令报错问题
环境描述:macOS .vscode .netcore3.0 迁移工具:Microsoft.EntityFrameworkCore.Tools 遇到的问题: Could not execute bec ...
- SpringCloud(一):了解SpringCloud
一.SpringCloud 简介 首先看看SpringCloud官方的介绍: Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由, ...
- vue jsx与render的区别及基本使用
vue template语法简单明了,数据操作与视图分离,开发体验友好.但是在某些特定场合中,会限制一些功能的扩展,如动态使用过滤器.解析字符串类型的模板文件等.以上功能的实现可以借助vue的rend ...
- Cesium专栏-裁剪效果(基于3dtiles模型,附源码下载)
Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...
- 微服务与Spring Cloud基本概念、Spring Cloud版本命名方式与版本选择
微服务是什么?Spring Cloud是什么?Spring Cloud版本命名方式?Spring Cloud版本选择? 一.微服务是什么 微服务是一种架构风格,是一种将单体应用开发为一组小型服务的方法 ...