上接【Spring】spring核心思想——IOC和DI

上篇文章结尾简单介绍了一下使用 XML 注册 Bean,这篇文章接着介绍一下 XML 注册 Bean 和使用注解注册、注入 Bean


文章目录

  • 1. 逻辑上的 Bean 注册
  • 2. XML 注册 Bean 到自建的库中
    • 2.1 工厂方法
    • 2.2 使用工厂方法和实例化工厂注册 Bean
  • 3. XML 配合注解进行 Bean 注册
  • 4. 使用注解注册 Bean
    • 4.1 注解方式注册的必要条件
    • 4.2 用到的注解
    • 4.3 @Component注解注入
    • 4.4 使用 @Bean 注解注册
  • 5. 通过注解注入 Bean
  • 6. 注入时的一个坑点
  • 7. 获取 库中的对象

1. 逻辑上的 Bean 注册

2. XML 注册 Bean 到自建的库中

上篇文章介绍了使用 XML 三种注册的三种方式 (直接注入、构造方法注入、set 方法注入),在这里继续介绍一下使用工厂方法 和 实例化工厂注册 Bean

2.1 工厂方法

工厂方法分为静态工厂方法和实例工厂方法

使用工厂方法注册就是调用静态工厂方法注册 Bean

实例化工厂注册就是调用实例工厂方法注册 Bean

2.2 使用工厂方法和实例化工厂注册 Bean

首先还是使用 XML 自建库,在 Main 方法中对库进行操作(这里对库的操作主要是打印 Bean)

import org.springframework.context.support.FileSystemXmlApplicationContext;public class Main {public static void main(String[] args) {FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("spring-config.xml");String[] names = context.getBeanDefinitionNames();for (String name : names) {Object bean = context.getBean(name);String canonicalName = bean.getClass().getCanonicalName();System.out.println(name + "     " + canonicalName);}int count = context.getBeanDefinitionCount();System.out.println("一共有 " + count + "个");}
}
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--    通过工厂注册,bean 的实例化由工厂方法完成--><bean id="工厂注册" class="com.hsq.ioc3.SomeClass" factory-method="createPerson"/><!--    通过已经注册的 bean 的实例方法注册,bean 的实例化由我们自己完成--><bean id="工具bean" class="com.hsq.ioc3.SomeClass"/><bean id="通过实例化工厂注册" factory-bean="工具bean" factory-method="instantCreatePerson"/></beans>
public class SomeClass {// 静态方法(可以直接通过类名调用)// 作用:返回一个对象// 这类方法被称为工厂方法public static Person createPerson() {System.out.println("createPerson 被调用");return new Person();}public Person instantCreatePerson() {System.out.println("instantCreatePerson 被调用");return new Person();}
}
public class Person {public Person() {System.out.println("Person 被调用");}
}

通过打印可以清楚的看到两种方法都成功注册 Person 对象

3. XML 配合注解进行 Bean 注册

自建 XML 库中的配置文件有所改变

用到的注解 @Component,此注解后边会讲到

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--    扫描这个包下的所有类,如果没在这个包下,即使加了注解接不会被注入--><context:component-scan base-package="com.hsq.ioc3"/></beans>
import org.springframework.stereotype.Component;@Component
public class World {public World() {System.out.println("World 被调用");}
}

通过打印可以清楚看到,World 对象被成功注册

4. 使用注解注册 Bean

使用注解注册简而言之就是使用某个注解修饰类或方法,对其进行注册

使用注解注册 Bean 是注册进 Spring 提供的库,就不需要自建库了

4.1 注解方式注册的必要条件

  1. 要被注解修饰类
  2. 被注册的 Bean 要在 XXXApplication 所在包下,否则注册不会成功

4.2 用到的注解

这几个注解在 IOC 场景下,没有区别,都是将类注册进 Spring 库,但在其他场景一般这样用

@Component:没有特殊作用时,都可以用

@Controller:SpringMVC中把此注解特殊化了,要求控制器类必须用此注解修饰

@Service:修饰中间数据整合的类

@Repository:修饰数据获取类

@Configuration:修饰配置类

4.3 @Component注解注入

import org.springframework.stereotype.Component;@Component
public class World {public World() {System.out.println("World() 被调用");}
}
@SpringBootApplication
public class IocAApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(IocAApplication.class, args);String[] names = context.getBeanDefinitionNames();System.out.println("bean 陈列如下:");for (String name : names) {Object bean = context.getBean(name);String canonicalName = bean.getClass().getCanonicalName();System.out.println(name + "   " + canonicalName);}int count = context.getBeanDefinitionCount();System.out.println("一共 " + count + "个");}}

通过打印清楚看到,对象被注册

4.4 使用 @Bean 注解注册

使用 @Bean 修饰方法,@Configuration 修饰类

此方法注册就相当于 XML 中的工厂方法注册

@Configuration
public class AppConfig {// <bean id="hsq" factory-bean="appConfig" factory-method="hsq" />// 以工厂方法注册@Beanpublic String hsq() {return "hsq";}@Bean       // 这里的 World 由 Spring 注入// 因为 createHello 被 Spring 调用public Hello createHello(@Autowired World world) {System.out.println("createHello(), world = " + world);return new Hello(world);}
}

5. 通过注解注入 Bean

需要用到 World 类时

  1. 先让 Hello 类被注册到 Spring 容器,并且实例化过程交给 Spring。———— @Component 修饰 Hello 类
  2. 要求 World 类被注册到 Spring 中(类注册或者方法注册都可以)
  3. 使用构造方法、set 方法、属性直接注入三种方法注入bean——使用 @Autowired 修饰
import org.springframework.stereotype.Component;@Component
public class World {public World() {System.out.println("World() 被调用");}
}

构造方法注入

@Component
public class Hello {@Autowired      // 这个注解其实可以不写,但是建议写上,主要是让看代码的人知道我们的 World 对象是被注入的// 如果有多个构造方法,告诉 Spring,实例化对象是,应该调用哪个public Hello(World world) {System.out.println("Hello(), world = " + world);}
}

set 方法注入

@Component
public class Hello2 {@Autowired          // 这里的此注解必须写上public void setWorld(World world) {System.out.println("setWorld(), World = " + world);}
}

属性直接注入

@Component
public class Hello3 {@Autowiredpublic World world;     // world 属性的值会被 Spring 容器对象注入public void printWorld() {System.out.println("printWorld(), world = " + this.world);}
}

6. 注入时的一个坑点

当使用以下方法注入时,会注入进 NULL 值,而非对象,原因已在下面代码的注释中写出

// 发生在 set 注入 / 属性直接注入上
@Component
public class 注入时的一个坑点 {@Autowiredpublic World world;public 注入时的一个坑点() {// 构造方法先执行,然后再进行注入(属性注入 / set 注入)// 所以,构造方法执行的时候,注入还没有发生,所以还是 null// 所以一般建议使用构造方法注入System.out.println("注入时的一个坑点(), world = " + this.world);}
}

7. 获取 库中的对象

ConfigurableApplicationContext context = SpringApplication.run(IocAApplication.class, args);Object world1 = context.getBean("world");         // 根据 id 获取 bean
World world2 = context.getBean(World.class);         // 根据类型获取 bean
World world = context.getBean("world", World.class);      // 根据 id + 类型获取 bean

【Spring】Bean注册和注入相关推荐

  1. spring bean注册和注入覆盖

    1.注册 //存储注册的俄BeanDefinition      private final Map<String, BeanDefinition> beanDefinitionMap = ...

  2. Spring Bean的属性注入

    在spring中bean的属性注入有两种 构造器注入 <bean id="car" class="nwtxxb.di.Car"><constr ...

  3. Spring Bean四种注入方式(Springboot环境)

    阅读此文建议参考本人写的Spring常用注解:https://blog.csdn.net/21aspnet/article/details/104042826 给容器中注册组件的四种方法:  1.@C ...

  4. Spring Bean配置依赖注入

    Bean配置 属性 值 注释 id 自自定义,一般为类名 Bean ID name 自自定义,一般为类名,与id作用相同 Bean别名,多个别名逗号分隔 class 指定的类路径,com.xx.xx. ...

  5. 解决Spring+Quartz无法自动注入bean问题

    问题 我们有时需要执行一些定时任务(如数据批处理),比较常用的技术框架有Spring + Quartz中.无奈此方式有个问题:Spring Bean无法自动注入. 环境:Spring3.2.2 + Q ...

  6. Spring Bean 装配和依赖注入

    Spring IOC 容器的依赖注入工作可以分为两个阶段.第一个阶段可以认为是构建和收集 Bean 定义的阶段,在这个阶段中,我们可以通过 xml 或者 Java 代码的方式定义一些 Bean,然后通 ...

  7. Spring bean注入之注解注入-- @Autowired原理

    之前我们已经讲述过bean注入是什么了,也使用了xml的配置文件进行bean注入,这也是Spring的最原始的注入方式(xml注入). 本节课就讲注解注入. 主要讲解的注解有以下几个: @Autowi ...

  8. Spring中注解注入bean和配置文件注入bean

    注解的方式确实比手动写xml文件注入要方便快捷很多,省去了很多不必要的时间去写xml文件 按以往要注入bean的时候,需要去配置一个xml,当然也可以直接扫描包体,用xml注入bean有以下方法: 1 ...

  9. Spring Bean 的注入方式

    DI 注入 一. 传统的注入方式 通过bean标签方式注入 通过包扫描的方式注入 二. 注解方式配置注入 @Configuration 与 @Bean 注解方式注入 @ComponentScan 包扫 ...

最新文章

  1. Spring Boot持久化的简单实现
  2. raid磁盘阵列OFFLINE后的应急方案
  3. win10开启telnet客户端
  4. java删除通用方法_一个比较通用的java删除文件和文件夹的方法
  5. 领域驱动设计和开发实战总结
  6. 系统mysql数据库服务器,系统mysql数据库服务器
  7. python实现解释器_Python设计模式之解释器模式
  8. 鸿蒙系统被烧毁,华为鸿蒙操作系统再次被质疑 国产是原罪
  9. 基于随机梯度下降法的手写数字识别、epoch是什么、python实现
  10. WTL-编译出错01--CVTRES : fatal error CVT1100: 资源重复。类型: MANIFEST,名称: 1,语言: 0x0409
  11. Akka系列(二):Akka中的Actor系统
  12. 南阳OJ 16 矩形嵌套
  13. 多层json字符串转map_java json字符串转map集合递归嵌套
  14. 发字的楷书写法图片_硬笔书法笔顺正确写法,手写示范动态图
  15. Java EJB到底是什么?
  16. 使用回溯算法解决排列组合问题
  17. 互联网创新创业大赛优秀范例_互联网创业大赛优秀作品_ 创新创业大赛优秀作品...
  18. 2020年新年新气象
  19. 【蓝桥杯真题训练 day14】今日四道真题全解析
  20. 根据显示屏分辨率调试html 样式

热门文章

  1. 统一信用代码n开头_农业银行信用卡审批及拒绝代码汇总!
  2. 什么是Vue?什么又是vue指令?
  3. UML中的组成和聚集
  4. svn 安装目录 没有 svn.exe(修复不需要重装)
  5. 微服务架构设计模式学习笔记——六边形架构
  6. 小议多种团队性格-你想组建并良好管理自己的团队吗?
  7. 基于FME的多表格统计分析
  8. 抖音怎么使用鸿蒙系统,又好用又易用的鸿蒙OS来了 华为官方抖音账号参与新系统相关话题...
  9. HTTP 请求报文 组成部分和特点 及实现功能
  10. android密码忘记了vivo,vivo手机忘了账号密码怎么办?vivo手机账号密码找回教程...