• 系统学习SpringFramework:SpringBean的注入方式


    本篇内容包括:Spring 容器简介(什么是容器、容器如何工作)、SpringBean 注入方式(SpringBean 注入方式分类、@Autowiring 自动绑定)以及 获取 Spring Bean 的工具类!

    一、Spring 容器

    1、什么是容器

    Spring IOC 容器就是一个 org.springframework.context.ApplicationContext 的实例化对象,容器负责实例化,配置以及装配 Bean

    • 从代码层次来看,Spring 容器就是一个实现了 ApplicationContext 接口的对象
    • 从功能层次来看,Spring 容器是 Spring 框架的核心,用来管理对象的。容器将创建的对象,把它们连接在一起,配置它们,并管理它们的整个生命周期从创建到销毁
    2、容器如何工作

    未命名文件 (3)

    Spring 容器通过我们提交的 POJO 对象(Your Business Objects(POJOs))以及配置元数据(Configuration Metadata)产生一个充分配置的可以使用的系统

    这里说的配置元数据,实际上就是我们提供的 XML 配置文件,或者通过注解方式提供的一些配置信息


    二、SpringBean 注入方式

    1、SpringBean 注入方式分类

    SpringBean 注入方式按照模式划分可分为两种:

    • 手动模式:配置或编程的方式,提前安排注入规则,包括 Xml 资源配置元信息、Java 注解配置元信息、Api 配置元信息(不常用)。
    • 自动模式:实现放提供依赖自动关联的方式,按照内建的注入规则,包括 @Autowiring 。

    SpringBean 注入方式按照类型来进行划分可分为:

    • setter 注入(官网):这种注入方式通过set方法完成注入,所以在类中必须要给属性设定set方法。
    • 构造器注入(官网):这种注入方式是通过构造方法来实现,类中必须提供构造方法,属性的set方法不需要。
    • 字段注入:通过 @Autowired 注解方式,可以实现自动装配,只要在对应的属性上面添加该注解进来,但是 @Autowired 注解是按照 byType 类型来注入(字段注入会忽略静态字段)。
    • 方法注入:通过将 @Autowired 注解放在方法上来完成方法参数注入。
    • 接口回调注入:这是一种比较特殊的注入方式,回调注入利用一类 Aware 接口(XX意识接口,名称为:注入对象+Aware)来实现,例如:
      • BeanFactoryAware:获取 Ioc 容器
      • ApplicationContextAware:获取应用上下文—— ApplicationContextAware 对象
      • EnvironmentAware:获取 Environment 对象
      • ResourceLoaderAware:获取资源加载器对象—— ResourceLoader
      • BeanClassLoaderAware:获取加载当前 Bean Class 的 ClassLoader
      • BeanNameAware:获取当前 Bean 的名称
    2、@Autowiring 自动绑定

    Spring 容器可以维护协作 Bean 之间的关系。你可以通过检查 ApplicationContext 的内容,让 Spring 自动为你的 Bean 解析协作者(其他 Bean)

    优点:

    • @Autowiring 可以显著减少指定属性或构造函数参数的需要
    • @Autowiring 可以随着对象的改变而更新配置

    除了使用 @Autowired 注解来注入外,其实也可以通过 java 的注解 @Resource 来实现自动装配,它默认按照 byName 名称来进行自动装配,但是如果找不到与之名称相匹配的bean 对象时,则会按照 byType 类型进行装配


    三、获取 Spring Bean

    Ps:这里附赠一个用于获取 Spring 容器中的 Bean 工具类:

    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;
    
    import java.util.Optional;
    
    /**
     * 获取 Spring 容器中的 Bean 
     *
     * @author lizhengi
     * @version 1.0.0
     * @description
     * @date 2022-11-03 4:57 下午
     **/
    @Component
    public class SpringContextUtil implements ApplicationContextAware {
    
        private static ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            SpringContextUtil.applicationContext = applicationContext;
        }
    
        /**
         * 获取spring容器中的bean, 通过bean名称获取
         *
         * @param beanName bean名称
         * @return Object 返回Object,需要做强制类型转换
         */
        public static Object getBean(String beanName) {
            return applicationContext.getBean(beanName);
        }
    
        /**
         * 获取spring容器中的bean, 通过bean类型获取
         *
         * @param beanClass beanClass bean 类型
         * @param        beanClass bean 类型
         * @return T 返回指定类型的bean实例
         */
        public static <T> T getBean(Class<T> beanClass) {
            return applicationContext.getBean(beanClass);
        }
    
        public static <T> Optional<T> getBeanOptional(Class<T> beanClass) {
            try {
                T bean = applicationContext.getBean(beanClass);
                return Optional.of(bean);
            } catch (Exception e) {
                return Optional.empty();
            }
        }
    
        /**
         * 获取spring容器中的bean, 通过bean名称和bean类型精确获取
         *
         * @param beanName  bean 名称
         * @param beanClass bean 类型
         * @param        beanClass bean 类型
         * @return T 返回指定类型的bean实例
         */
        public static <T> T getBean(String beanName, Class<T> beanClass) {
            return applicationContext.getBean(beanName, beanClass);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
  • 相关阅读:
    Leetcode 670. 最大交换
    [附源码]Python计算机毕业设计Django房产中介管理系统
    Electron实战之环境搭建
    降噪蓝牙耳机哪个牌子好?最便宜的蓝牙主动降噪耳机推荐
    MBR30300VCT-ASEMI肖特基二极管有什么用
    查找项目中所有使用自定义属性的类
    AntDB入选《2022爱分析·信创厂商全景报告》
    【好文鉴赏】面试官说你回答的不够深入,怎么办?
    上周热点回顾(4.4-4.10)
    基于小程序的理发店预约系统
  • 原文地址:https://blog.csdn.net/weixin_45187434/article/details/127674289