【Spring】 核心概念:Bean 配置 & Bean 实例化 & Bean 生命周期

新博客:https://blog.bigdataboy.cn/article/442.html

Bean基础配置

格式

<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--  管理对象  -->
    <bean id="nameDao" name="dao dao2,dao3" class="cn.bigdataboy.dao.impl.NameDaoImpl"/>
</beans>

属性列表

属性 描述
id Bean 唯一标识
name Bean 的别名,多个由逗号分号 隔开
class 该 Bean 的类路径
scope 作用范围,用于规定获取的 Bean 是否是单例的(默认是 singleton 单例)

scope 属性

singleton 单例:也就是使用的是同一个对象

mark

prototype 非单例:常用于对象内部是有属性保存状态的,该对象运行一次,内部的属性需要给下次的执行。

mark

Bean 实例化

使用 构造方法 实例化

Bean的实例化,也是从构造方法开始,容器内部是使用反射机制完成的

<bean id="nameDao" class="cn.bigdataboy.dao.impl.NameDaoImpl" scope="singleton"/>

这里有个小问题,如果是 非单例模式,会输出两次构造函数的打印

mark

使用工厂函数实例化

需要继承 FactoryBean,重写 getObject getObjectTypeisSingleton 需要再写

package cn.bigdataboy.factory;

import cn.bigdataboy.dao.NameDao;
import cn.bigdataboy.dao.impl.NameDaoImpl;
import org.springframework.beans.factory.FactoryBean;

public class NameDaoFactoryBean implements FactoryBean<NameDao> {
    @Override
    public NameDao getObject() throws Exception {
        return new NameDaoImpl();
    }

    @Override
    public Class<?> getObjectType() {
        return NameDaoImpl.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

配置文件只需要这样写

<!--    使用 FactoryBean 方式实例化 Bean-->
<bean id="nameDao" class="cn.bigdataboy.factory.NameDaoFactoryBean"></bean>

mark

Bean 生命周期

生命周期其实很好理解,就是 创建销毁 这样一个过程,既然有这样一个概念,那就可以控制相应阶段做不同的事。

Spring 的实现方式还是使用 配置属性,指定相应方法

初始化方法 和 销毁方法

import cn.bigdataboy.dao.NameDao;
import cn.bigdataboy.service.impl.NameServiceImpl;

public class NameDaoImpl implements NameDao {

    public NameDaoImpl(){
        System.out.println("NameDaoImpl constructor running ...");
    }

    public void getName() {
        System.out.println("getName: bigdataboy");
    }

    public void init(){ // 初始化方法
        System.out.println("name dao init ...");
    }

    public void destory(){ // 销毁方法
        System.out.println("name dao destory ...");
    }
}

配置文件,指定 相应方法

<bean id="nameDao" class="cn.bigdataboy.dao.impl.NameDaoImpl" init-method="init" destroy-method="destory"/>

销毁方法,需要修改成 ClassPathXmlApplicationContext 接口才有,不然是不会调用销毁的。

mark

发表评论 / Comment

用心评论~