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

    一、简介

      Spring 实例化 Bean有三种方式:构造函数实例化、工厂方法实例化以及静态工厂方法实例化。两种 Bean类型:一种是普通的Bean,另一种则是工厂Bean。其中,工厂Bean中返回的不是指定的Class的实例,而是其内部方法 getObject 的返回对象。在Spring的内部实现中,存在很多的工厂方法bean。

    二、实例化Bean的三种方式

      1、新建bean对象 Human

    package com.cfang.prebo.spring;
    
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.NonNull;
    import lombok.RequiredArgsConstructor;
    
    @Data
    @NoArgsConstructor
    @RequiredArgsConstructor
    public class Human {
    
        @NonNull
        private Integer id;
        @NonNull
        private String name;
        private String text;
    }

      2、新建工厂类 HumanFactory

    package com.cfang.prebo.spring;
    
    public class HumanFactory {
    
        /**
         * 工厂方法实例化bean
         */
        public Human initHuman() {
            return new Human();
        }
        
        public Human initHuman(int id, String name) {
            return new Human(id, name);
        }
        
        /**
         * 静态工厂方法实例化bean
         */
        public static Human staticInitHuman() {
            return new Human();
        }
    }

      3、新建配置文件 applicationContext.xml

    <?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:p="http://www.springframework.org/schema/p"  
        xmlns:context="http://www.springframework.org/schema/context"  
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    
            <!-- 无参构造 -->
            <bean id="human" class="com.cfang.prebo.spring.Human"></bean>
            <!-- 有参构造 -->
            <bean id="human2" class="com.cfang.prebo.spring.Human">
                <constructor-arg index="0" value="1"/>
                <constructor-arg index="1" value="huah"/>
            </bean>
            <!-- 工厂方法 -->
            <bean id="humanFactory" class="com.cfang.prebo.spring.HumanFactory"></bean>
            <bean id="human3" factory-bean="humanFactory" factory-method="initHuman"></bean>
            <!-- 静态工厂方法 -->
            <bean id="human4" class="com.cfang.prebo.spring.HumanFactory" factory-method="staticInitHuman"></bean>
    </beans>

      4、单元测试类 TestBeanLoad

    package com.cfang.prebo.spring;
    
    import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;
    
    import lombok.extern.slf4j.Slf4j;
    
    @Slf4j
    public class TestBeanLoad {
        
        private ApplicationContext context;
        
        @Before
        public void initXml() {
            log.info("test init...");
    //        context = new FileSystemXmlApplicationContext("src/test/resources/applicationContext.xml");
            context = new ClassPathXmlApplicationContext("applicationContext.xml");
        }
        
        @After
        public void closeXml() {
            log.info("test complete...");
        }
        
        /**
         *     无参构造实例化bean
         */
        @Test
        public void test1() {
            Human human = (Human) context.getBean("human");
            log.info("无参构造实例化bean : {}", human);
        }
        
        /**
         *     有参构造实例化bean
         */
        @Test
        public void test2() {
            Human human2 = (Human) context.getBean("human2");
            log.info("有参构造实例化bean : {}", human2);
        }
        
        /**
         *     工厂方法实例化bean
         */
        @Test
        public void test3() {
            Human human3 = (Human) context.getBean("human3");
            log.info("工厂方法实例化bean : {}", human3);
        }
        
        /**
         *     静态工厂方法实例化bean
         */
        @Test
        public void test4() {
            Human human4 = (Human) context.getBean("human4");
            log.info("静态工厂方法实例化bean : {}", human4);
        }
        
    }
  • 相关阅读:
    Git简介
    Git之 git status、git diff 的基本使用
    Git之撤销修改 git checkout file、git reset HEAD file 的使用
    git连接gitlab远程仓库
    Git版本回退及 git log 、 git reset hard commit_id 的基本使用
    Git创建版本库及git init 、add 和 commit m 的基本使用
    Git之工作区和暂存区
    Git的由来及分布式版本控制和集中式版本控制的区别
    MariaDB 主从同步与热备
    MariaDB 用户与权限管理
  • 原文地址:https://www.cnblogs.com/eric-fang/p/11718672.html
Copyright © 2011-2022 走看看