Spring三种创建bean对象的方式/作用范围/生命周期

Spring三种创建bean对象的方式/作用范围/生命周期

项目结构

在这里插入图片描述

配置文件

  1. pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.xiaoge</groupId>
        <artifactId>bean</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.0.2.RELEASE</version>
            </dependency>
        </dependencies>
    
    </project>
    
  2. bean.xml**(创建bean对象的方式/作用范围/生命周期)**

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- 把对象的创建交给spring来管理 -->
        <!--
            spring对bean的管理细节
                1. 创建bean的三种方式
                2. bean对象的作用范围
                3. bean对象的生命周期
        -->
    
        <!-- 创建Bean的三种方式 -->
        <!-- 第一种方式: 使用默认构造函数创建.
                早spring的配置文件中使用bean标签. 配以id和class属性之后. 且没有其他属性和标签时.
                采用的就是默认构造函数创建bean对象. 此时如果类中没有默认构造函数. 则对象无法创建.
    
        <bean id="accountService" class="com.xiaoge.service.impl.AccountServiceImpl"></bean>
        -->
    
    
    
    
        <!-- 第二种方式: 使用普通工厂中的方法创建对象 (使用某个类中的方法创建对象, 并存入spring容器)
        <bean id="instanceFactory" class="com.xiaoge.factory.InstanceFactory"></bean>
    
            factory-bean: 指定工厂Bean
            factory-method: 指定工厂方法来获取对象
    
        <bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>
        -->
    
    
    
        <!-- 第三种方式: 使用工厂中的静态方法创建对象 (使用某个类中的静态方法创建对象, 并存入spring容器)
        <bean id="accountService" class="com.xiaoge.factory.StaticFactory" factory-method="getAccountService"></bean>
        -->
    
    
    
        <!-- bean的作用范围调整
    
             bean标签的scope属性:
                作用: 用于指定bean的作用范围
                取值: 常用的就是单例的和多例的
                    singleton: 单例的(默认值)
                    prototype: 多例的
                    request: 作用于web应用的请求范围
                    session: 作用于web应用的会话范围
                    global-session: 作用于集群环境的会话范围(全局会话范围), 当不是集群环境时, 它就是session
    
        <bean id="accountService" class="com.xiaoge.service.impl.AccountServiceImpl" scope="prototype"></bean>
        -->
    
    
        <!-- bean对象的生命周期
             单例对象
                出生: 当容器创建时对象出生
                活着: 只要容器还在, 对象一直活着
                死亡: 容器销毁, 对象消亡
                总结: 单例对象的生命周期和容器相同
             多例对象
                出生: 当我们使用对象时spring框架为我们创建
                活着: 对象只要是在使用过程中就一直活着.
                死亡: 当对象长时间不用, 且没有别的对象引用时, 由Java的垃圾回收器回收
         -->
        <bean id="accountService" class="com.xiaoge.service.impl.AccountServiceImpl" scope="prototype" init-method="init" destroy-method="destroy"></bean>
    
    </beans>
    

工厂

  1. InstanceFactory

    package com.xiaoge.factory;
    
    import com.xiaoge.service.AccountService;
    import com.xiaoge.service.impl.AccountServiceImpl;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/3/26 下午9:32
     * @Description: 模拟一个工厂类(该类可能是存在于jar包中的, 我们无法通过修改源码的方式来提供默认构造函数)
     */
    public class InstanceFactory {
    
        public AccountService getAccountService(){
            return new AccountServiceImpl();
        }
    
    }
    
  2. StaticFactory

    package com.xiaoge.factory;
    
    import com.xiaoge.service.AccountService;
    import com.xiaoge.service.impl.AccountServiceImpl;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/3/26 下午9:32
     * @Description: 模拟一个工厂类(该类可能是存在于jar包中的, 我们无法通过修改源码的方式来提供默认构造函数)
     */
    public class StaticFactory {
    
        public static AccountService getAccountService(){
            return new AccountServiceImpl();
        }
    
    }
    

业务层接口

  1. AccountService

    package com.xiaoge.service;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/3/19 下午7:26
     * @Description: 账户业务层接口
     */
    public interface AccountService {
    
        /**
         * 模拟保存
         */
        public void saveAccount();
    
    }
    
    

业务层实现类

  1. AccountServiceImpl

    package com.xiaoge.service.impl;
    
    import com.xiaoge.service.AccountService;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/3/19 下午7:28
     * @Description: 账户业务层实现类
     */
    public class AccountServiceImpl implements AccountService {
    
    
    
        public AccountServiceImpl(){
            System.out.println("对象已创建");
        }
    
        public void saveAccount() {
            System.out.println("service中的saveAccount方法执行了");
        }
    
        public void init() {
            System.out.println("对象初始化...");
        }
    
        public void destroy() {
            System.out.println("对象销毁...");
        }
    }
    
    

main

  1. Client

    package com.xiaoge.ui;
    
    import com.xiaoge.service.AccountService;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/3/19 下午7:35
     * @Description: 模拟表现层, 调用业务层
     */
    public class Client {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // 1. 获取核心容器对象
            ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
    
            // 2. 获取对象
            AccountService as = (AccountService)applicationContext.getBean("accountService");
    
            // 3. 执行方法
            as.saveAccount();
    
            // 4. 手动释放容器
            applicationContext.close();
          
          
           // 运行结果
           对象已创建
    			 对象初始化...
    			 service中的saveAccount方法执行了
    
        }
    
    
    
    }
    
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章