Spring IOC 总结
IOC
简介
IOC是(Inversion of Control,控制反转)的简写。Spring提供IOC容器,将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的的过度程序耦合。它由DI(Dependency Injection,依赖注入)来实现。
那么到底什么是Spring IOC?
IOC 将传统的在对象内部直接控制对象(如new方式)改为交由Spring IOC容器去控制。由于控制对象的权限反转了所以叫做 控制反转。
比如:
在传统的java程序设计中我们一般会在对象内部通过new的方式直接创建对象。但是在IOC中我们将对象的控制权限转交给Spring的IOC容器,由容器根据需求创建对象。
IoC容器是啥?
Spring IOC容器是一个管理Bean的容器,在Spring的定义中要求所有的IOC容器都实现接口BeanFactory(它是一个顶层容器接口)。
如下部分源码:
import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;
public interface BeanFactory {
//前缀
String FACTORY_BEAN_PREFIX = "&";
// 多个 getBean 方法
Object getBean(String var1) throws BeansException;
<T> T getBean(String var1, Class<T> var2) throws BeansException;
Object getBean(String var1, Object... var2) throws BeansException;
<T> T getBean(Class<T> var1) throws BeansException;
<T> T getBean(Class<T> var1, Object... var2) throws BeansException;
<T> ObjectProvider<T> getBeanProvider(Class<T> var1);
<T> ObjectProvider<T> getBeanProvider(ResolvableType var1);
//是否包含 Bean
boolean containsBean(String var1);
//是否是单例
boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
//是否是原型
boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
//是否类型匹配
boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
//获取Bean 类型
@Nullable
Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
//获取Bean别名
String[] getAliases(String var1);
}
- 从源码中有多个getBean()方法,这是IOC容器最重要的方法之一。从多种getBean()方法中我们可以看出Spring IOC容器允许我们通过多种方式获取Bean。
- isSingleton 方法则判断 Bean 是否在 Spring IoC 中为单例。这里需要记住的是 在 Spring IoC 容器中,默认情况下,Bean 都是单例存在的,也就是说使用 getBean 方法返回的都是同一个对象。
- 与 isSingleton 方法相反的是 isPrototype 方法。如果它返回的是 true,那么当我们使用 getBean 方法获取 Bean 的时候, Spring IoC 容器就会创建一个新的 Bean 返回给调用者。
但是,BeanFactory的功能不够强大,在后期开发者在Spring BeanFactory 的基础上又设计了一个更高级的接口ApplicationContext。在现实使用上我们使用的大多数Spring IOC 容器都是ApplicationContext接口的实现类。
在SpringBoot中我们主要采用注解的方式来装配Bean到Spring容器。此时使用到一个基于注解的IOC容器AnnotationConfigApplicationContext。
演示(以SpringBoot中注解方式装配Bean到Spring容器中为例)
1.首先我们定义一个简单的User对象
public class User{
private Long id;
private String userName;
private String note;
/*** getter and setter ***/
}
2.然后定义一个java的配置文件APPConfig.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean(name = "user")
public User initUser(){
User user = new User();
user.setId(1L);
user.setUserName("name");
user.setNote("note");
return user;
}
}
注意:
- @Configuration:代表这是一个 Java 配置文件,Spring 容器会根据它来生成 IoC 容器去装配Bean。
- 代表将 initUser 方法返回的 POJO 装配到 IoC 容器中,而其 属性 name 定义这个Bean 的名称,如果没有配置它,那么则将方法名 initUser 作为Bean的名称并保存到 Spring IoC 容器中。
3.做好这些 ,就可以使用 AnnotationConfigApplicationContext 来构建自己的 IoC 容器了
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class IoCTest {
private static Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
public static void main(String[] args){
ApplicationContext ctx =
new AnnotationConfigApplicationContext(AppConfig.class);
User user = ctx.getBean(User.class);
logger.info("user' id is " + user.getNote());
}
}
代码中将 Java 配置文件 AppConfig 传递给 AnnotationConfigApplicationContext 的构造方法,这样它就能读取配置了。 然后将配置中的 Bean 装配到 IoC 容器中,于是就可以使用 getBean 方法获取对应的 POJO。
Spring IOC 总结的更多相关文章
- 【初探Spring】------Spring IOC(三):初始化过程---Resource定位
我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...
- 【初探Spring】------Spring IOC(一)
IOC:Inversion of Control(控制反转).IOC它所体现的并不是一种技术,而是一种思想,一种将设计好的对象交给容器来管理的思想.IOC的核心思想就体现在控制.反转这两个词上面,要理 ...
- spring ioc
spring ioc是spring的核心之一,也是spring体系的基础,那么spring ioc所依赖的底层技术是什么的?反射,以前我们开发程序的时候对象之间的相互调用需要用new来实现,现在所有的 ...
- Spring IoC源码解析——Bean的创建和初始化
Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...
- spring笔记6 spring IOC的中级知识
1,spring ioc的整体流程,xml配置 spring ioc初始化的流程结合上图 步骤编号 完成的工作 1 spring容器读取配置文件,解析称注册表 2 根据注册表,找到相应的bean实现类 ...
- 谈谈对Spring IOC的理解(转)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 自己动手编写spring IOC源码
前言:对于spring IOC概念不是很了解的朋友可以阅读我上一篇博客--轻松理解spring IOC(这两篇博客也是由于我的个人原因导致现在才发布,惭愧啊).通过这篇博客的理解之后,相信大家会对sp ...
- spring ioc 源码解析
什么是ioc? 通俗的解释是:(spring)框架中,完成对象的创建和注入的容器. springIOC体系结构: spring IOC的创建是典型的工厂模式,这一系列的bean工厂如上所示. 其核心是 ...
- Spring:源码解读Spring IOC原理
Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...
- 谈谈对Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
随机推荐
- 面试突击(五)——Java常用集合
为了勾起回忆,我画了一个常用集合类的结构关系图,话不多说,详见下图: 实际开发中ArrayList/HashMap/HashSet是三种最常用的集合工具类,通过其结构关系图也能清晰的了解他们的特性,所 ...
- css---【vw,vh】进行自适应布局单位
在进行CSS3自适应布局,会用到 vw 和 vh 进行布局 视口单位(Viewport units) 什么是视口? 在桌面端,视口指的是在桌面端,指的是浏览器的可视区域:而在移动端,它涉及3个视口:L ...
- socket 发送字符串0x00时被截断
发送数据如下: aa 02 02 00 00 00 6f 6b 02 00 00 00 55 数据是以字符数组的形式(char msg[])存储发送的,send时发送长度填写的strlen(msg), ...
- WeQuant教程—1.5 实盘运行须知
为了保证实盘交易程序能够正常稳定地运行,同时保护您在使用时账户资金的安全,我们设计了一些规则和机制.了解这些机制有助于您更快上手实盘交易. 启动前检查机制 在实盘交易程序启动前,系统会执行一次检查,出 ...
- node.js执行shell命令进行服务器重启
nodejs功能强大且多样,不只是可以实现 服务器端 与 客户端 的实时通讯,另一个功能是用来执行shell命令 1.首先,引入子进程模块var process = require('child_pr ...
- Linux 中的-rwxr-xr-x权限代表什么意思
Linux 中的权限 这里我拿一个tomcat目录举例说明.首先我们在linux系统中执行命令:ls -l 我们拿出其中一个说明-rwxr-xr-x,在Linux 系统中权限是区分用户的,即用户.组用 ...
- 使用vue搭建应用四引入axios
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中 特性 从浏览器中创建 XMLHttpRequests 从 node.js 创建 http 请求 支持 P ...
- STL源码之traits编程技法
摘要 主要讨论如何获取迭代器相应型别.使用迭代器时,很可能用到其型别,若需要声明某个迭代器所指对象的型别的变量,该如何解决.方法如下: function template的参数推导机制 例如: tem ...
- (三)Python知识图谱
查看大图
- turtle1
#画风车 from turtle import * pensize(2) for i in range(4): seth(360-i*90) fd(150) rt(90) circle(-150,45 ...
