zoukankan      html  css  js  c++  java
  • Spring中bean实例化的三种方式

    之前我已经有好几篇博客介绍Spring框架了,不过当时我们都是使用注解来完成注入的,具体小伙伴可以参考这几篇博客(Spring&SpringMVC框架案例)。那么今天我想来说说如何通过xml配置来实例化bean,其实也很简单。
    使用xml配置来实例化bean共分为三种方式,分别是普通构造方法创建、静态工厂创建、实例工厂创建,OK,那么接下来我们来分别看看这几种方式。

    普通构造方法创建

    这种创建方式使我们使用最多的一种创建方式,直接配置bean节点即可,比如我有一个User类,如下:

    public class User {
        public void add() {
            System.out.println("add()---------");
        }
    }

    然后通过简单配置一个bean节点就可以获取实例了,如下:

    <bean class="org.sang.User" id="user"/>

    OK,我们通过如下代码进行一个简单的测试:

    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            User user = (User) context.getBean("user");
            System.out.println(user);

    运行输出结果如下:
    这里写图片描述

    静态工厂创建

    除了通过普通的构造方法创建之外,我们也可以通过静态构造方法来创建一个bean的实例,假设我有一个类叫做User2,如下:

    public class User2 {
        public void add() {
            System.out.println("add2()---------");
        }
    }

    我给它创建一个静态工厂,如下:

    public class User2Factory {
        public static User2 getInstance() {
            return new User2();
        }
    }

    该工厂中有一个静态方法,该静态方法返回一个User2的实例,在Spring的配置文件中,我们看看如何生成User2的实例:

    <bean id="user2" class="org.sang.User2Factory" factory-method="getInstance"/>

    还是bean节点,只是多了一个factory-method属性,该属性指明该类中的静态工厂方法名为getInstance,这样Spring框架就知道调用哪个方法来获取User2的实例了,测试代码如下:

    @Test
        public void test2() {
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            User2 user = (User2) context.getBean("user2");
            user.add();
        }

    测试结果如下:
    这里写图片描述

    值得强调的是,这种方法并不常用。

    实例工厂创建

    小伙伴们看了静态工厂创建bean实例肯定都觉得很麻烦,事实上还有比静态工厂更麻烦的写法,那就是通过实例工厂来创建bean实例。实例工厂,顾名思义,就是我们工厂中的方法不是静态的,比如说,我有一个实体类叫做User3,如下:

    public class User3 {
        public void add() {
            System.out.println("add3()---------");
        }
    }

    然后我还有一个工厂方法,如下:

    public class User3Factory {
        public User3 getUser3() {
            return new User3();
        }
    }

    小伙伴们看到,在User3Factory类中有一个getUser3的方法,该方法返回一个User3类的实例,但是该方法不是静态的,那么我们在Spring的配置文件中要进行怎样的配置才能获取User3的一个实例呢?如下:

    <bean class="org.sang.User3Factory" id="user3Factory"/>
        <bean id="user3" factory-bean="user3Factory" factory-method="getUser3"/>

    第一个bean用来获取user3Factory的实例,第二个bean则根据User3Factory的实例,然后指定factory-method,通过getUser3方法来获取User3的实例。
    测试代码如下:

        @Test
        public void test3() {
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            User3 user = (User3) context.getBean("user3");
            user.add();
        }

    测试结果如下:
    这里写图片描述

    OK,以上就是bean实例化的三种方式,最最常用的是第一种。

    以上。

    本文案例下载:
    本文案例GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test28-Spring1

    关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!

  • 相关阅读:
    51nod1331 狭窄的通道
    noip2016 提高组
    noip2016 普及组
    noip车站分级 拓扑排序
    【NOIP1999】邮票面值设计 dfs+dp
    视频智能分析平台EasyCVR衍生版视频管理平台网页导航栏activeNav的背景照片异常的处理方式
    TSINGSEE青犀视频智能分析平台EasyCVR中性版本如何自定义平台内信息的变更?
    人脸识别/车牌识别视频智能分析系统EasyCVR通过接口GetApiV1Devices调用获取设备信息不成功原因分析
    超低延迟直播系统Webrtc编译android报错The installation of the Chrome OS default fonts failed问题
    超低延时安防直播系统webrtc-client测试推送多路视频流关闭其中一路后所有推流都关闭问题解决
  • 原文地址:https://www.cnblogs.com/lenve/p/7530967.html
Copyright © 2011-2022 走看看