IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中new相关的对象,应用程序由IOC容器进行组装。

查看ioc容器中的组件

public static void main(String[] args) {
//1、返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); //2、查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
/**
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
springbootReviewApplication
org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory
org.springframework.boot.autoconfigure.AutoConfigurationPackages
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
...
...
**/

组件添加

Bean四种注入方式

  1. @ComponentScan包扫描+组件标注注解@Component(@Controller@Service@Repository)
  2. @Configuration+@Bean

    使用场景:导入的第三方包里面的组件,将其他jar包中的类(类没有Component等注解),加载到容器中。
  3. @Import快速给容器中导入一个组件

    1)@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名

    2)ImportSelector:返回需要导入的组件的全类名数组;

    3)ImportBeanDefinitionRegistrar:手动注册bean到容器中
  4. 使用Spring提供的 FactoryBean(工厂Bean)

    1)默认获取到的是工厂bean调用getObject创建的对象

    2)要获取工厂Bean本身,我们需要给id前面加一个&&xxxFactoryBean 注意类名是X,这里就是小写的x?

@Configuration 和 @Bean

@Configuration(proxyBeanMethods = false) 告诉SpringBoot这是一个配置类、配置文件。@Configuration 用于定义配置类,可替换 xml 配置文件,被注解的类内部包含有一个或多个被 @Bean 注解的方法,这些方法将会被AnnotationConfigApplicationContextAnnotationConfigWebApplicationContext 类进行扫描。

@Bean 是一个方法级别上的注解,主要用在 @Configuration 注解的类里,也可以用在 @Component 注解的类里。添加的bean的id为方法名。标注在方法上,返回某个实例的方法,这个实例就会交给Spring容器管理。

proxyBeanMethods

  • FULL模式: @Configuration(proxyBeanMethods = true) ,保证每个@Bean方法被调用多少次返回的组件都是单实例的。配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用 FULL 模式。
  • LITE模式: @Configuration(proxyBeanMethods = false) ,每个@Bean方法被调用多少次返回的组件都是新创建的,配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断。
  • Spring Boot 在2.2.0版本(依赖于Spring 5.2.0)起就把它的所有的自动配置类默认proxyBeanMethods = false,提高Spring启动速度。
@Configuration(proxyBeanMethods = false)
public class ConfigDemo1 {
@Bean
public Student getStudent() {
Student student = new Student();
student.setAge(18);
student.setName("xiaoming");
return student;
}
}
@SpringBootApplication
public class SpringbootReviewApplication { public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(SpringbootReviewApplication.class, args);
ConfigDemo1 configDemo1 = run.getBean(ConfigDemo1.class);
Student student1 = configDemo1.getStudent();
Student student2 = configDemo1.getStudent();
//返回false,如果proxyBeanMethods = true,则返回true
System.out.println(student1 == student2);
}
}

@Bean,@Component,@Service,@Repository 和 @Controller注解的区别

1.@Bean

标注在方法上,返回某个实例的方法,这个实例就会交给Spring容器管理。

2.@Component

作用于类上,相当于一个基类,跟 @Bean 一样,可以托管到Spring容器进行管理。表示一个方法实例化、配置或者初始化一个Spring IoC容器管理的新对象

3.@Service, @Controller , @Repository

作用于类上,={@Component + 一些特定的功能}。这些注解在部分功能上是一样的,但有一些不同:

@Controller注解类:SpringMVC的理念,进行前端请求的处理,转发,重定向。包括调用Service层的方法。

@Service注解类:处理业务逻辑

@Repository注解类:作为DAO对象(数据访问对象,Data Access Objects),这些类可以直接对数据库进行操作。

@Controller、@Service、@Repository都属于@Component

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
@AliasFor(annotation = Component.class)
String value() default "";
}

使用bean

以上都是注册bean,那怎么使用bean呢?

@Autowired 属于Spring的注解             org.springframework.beans.factory.annotation.Autowired

@Resource  不属于Spring的注解,JDK1.6支持的注解   javax.annotation.Resource

@Autowired

根据类的类型进行装配

@Resource

根据类的名字进行装配,也可以设定根据类的名字

Springboot笔记<2>IOC容器与组件注入的更多相关文章

  1. springboot成神之——ioc容器(依赖注入)

    springboot成神之--ioc容器(依赖注入) spring的ioc功能 文件目录结构 lang Chinese English GreetingService MyRepository MyC ...

  2. SpringBoot系列之Spring容器添加组件方式

    SpringBoot系列之Spring容器添加组件方式 本博客介绍SpringBoot项目中将组件添加到Spring容器中的方法,SpringBoot项目有一个很明显的优点,就是不需要再编写xml配置 ...

  3. IOC容器的依赖注入

    1.依赖注入发生的时间 当Spring IoC容器完成了Bean定义资源的定位.载入和解析注册以后,IoC容器中已经管理类Bean定义的相关数据,但是此时IoC容器还没有对所管理的Bean进行依赖注入 ...

  4. 通过中看不中用的代码分析Ioc容器,依赖注入....

    /** * 通过生产拥有超能力的超人实例 来理解IOC容器 */ //超能力模组接口 interface SuperModuleInterface{ public function activate( ...

  5. spring框架--IOC容器,依赖注入

    思考: 1. 对象创建创建能否写死? 2. 对象创建细节 对象数量 action  多个   [维护成员变量] service 一个   [不需要维护公共变量] dao     一个   [不需要维护 ...

  6. Castle学习笔记----初探IOC容器

    通常IOC实现的步骤为-->建立容器-->加入组件-->获取组件-->使用组件. 1.建立容器 建立容器也就是IWindsorContainer.接着我门要向容器中注册服务,并 ...

  7. Spring源码解析三:IOC容器的依赖注入

    一般情况下,依赖注入的过程是发生在用户第一次向容器索要Bean是触发的,而触发依赖注入的地方就是BeanFactory的getBean方法. 这里以DefaultListableBeanFactory ...

  8. AspectCore中的IoC容器和依赖注入

    IOC模式和依赖注入是近年来非常流行的一种模式,相信大家都不陌生了,在Asp.Net Core中提供了依赖注入作为内置的基础设施,如果仍不熟悉依赖注入的读者,可以看看由我们翻译的Asp.Net Cor ...

  9. [spring源码] 小白级别的源码解析IOC容器的依赖注入(三)

    上一篇介绍了ioc容器的初始化过程,主要完成了ioc容器建立beanDefinition数据映射.并没有看到ioc容器对bean依赖关系进行注入. 接口getbean就是出发依赖注入发生的地方.下面从 ...

  10. ASP.NET中IOC容器Autofac(依赖注入DI 控制反转IOC)

    IOC的一个重点是在程序运行中,动态的向某个对象提供它所需要的其他对象.这一点是通过DI来实现的.Autofac则是比较流行的一款IOC容器. IoC和DI有什么关系呢?其实它们是同一个概念的不同角度 ...

随机推荐

  1. 单词搜索 & 周赛第二道

    单词搜索 描述: 给定一个二维网格和一个单词,找出该单词是否存在于网格中.单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同 ...

  2. CORS 跨域请求一种解决方案

    平常工作难遇到这类问题, 一般搭建新系统或搭建系统二时需要复用系统一一些前后端能力, 可能会遇到跨域拦截问题. 这里提供一种基于服务器解决方案. 更多其他方案, 详细细节可自行查阅更多资料, 写一些前 ...

  3. Git 命令使用体验的神器 -- tig

    tig, 就是把 Git 这个单词倒过来念, 它是一个命令行工具, 日常使用中我用它来取代 Git 最高频的几个操作, 如 git log, git diff 以及 git blame等, 使用常见安 ...

  4. .NET8中gRPC的使用

    在现代分布式系统中,服务之间的通信是一个非常重要的环节.随着微服务架构的流行,服务之间的通信方式也在不断演进.gRPC作为一种高性能.跨语言的RPC框架,逐渐成为了我们的首选. 一.简介 gRPC 是 ...

  5. C# using 别名

    场景重现 当using的多个库出现类名重复的情况时... 解决办法 使用类的完全限定名称,例如: // 不需要using,避免using名称重复导致的异常 // 使用类的完全限定名称,俗称全名. Sy ...

  6. 活动中台系统慢 SQL 治理实践

    作者:vivo 互联网服务器团队- Zhang Mengtao 活动中台系统作为中台项目非常注重系统性能和用户体验,数据库系统性能问题会对应用程序的性能和用户体验产生负面影响.慢查询可能导致应用程序响 ...

  7. Clion配置Fortran环境

    1.安装CLion 下载链接:https://www.jetbrains.com/ 下载好后安装到指定目录即可 2.安装Fortran插件 3.编写程序 1)打开CLion,新建一个Fortran项目 ...

  8. MCP应用docker部署,docker-compose部署

    一.概述 前面几篇文章,MCP应用直接用的python3 server.py运行的,如果服务器重启,进程就会关掉,很不方便. 所以需要使用docker部署,实现开机自启动. 二.docker部署 my ...

  9. 为了掌握设计模式,开发了一款Markdown 文本编辑器软件(已开源)

    设计模式实战项目:Markdown 文本编辑器软件开发(已开源) 一.项目简介 项目名称:YtyMark-java 本项目是一款基于 Java 语言 和 JavaFX 图形界面框架 开发的 Markd ...

  10. 常用的 JVM 配置参数有哪些?

    常用的 JVM 配置参数 JVM 配置参数可以用来控制 Java 程序的内存分配.垃圾回收.性能优化等.以下是一些常用的 JVM 配置参数: 1. 堆内存相关参数 -Xms:设置 JVM 初始堆内存大 ...