SSM框架学习——Spring之bean学习

本文详细介绍了Spring框架中Bean的配置,包括基础配置、别名配置、作用范围配置以及三种实例化方式。此外,还探讨了Bean的生命周期,包括初始化方法、销毁方法及容器关闭时的销毁时机。内容深入浅出,适合Spring框架初学者和开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

bean基本配置

bean基础配置

bean别名配置

bean作用范围配置

bean实例化

第一种:构造方法(常用)

第二种:静态工厂

第三种:实例工厂        

第三种改良(掌握)

bean生命周期

生命周期控制方法

bean销毁时机


bean基本配置

bean基础配置

类别描述
名称bean
类型标签
所属beans标签
功能定义Spring核心容器管理的对象<beans>
格式
 

<beans>

        <bean/>
        <bean>< / bean>

</beans>

属性列表

id : bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id值唯一

class : bean的类型,即配置的bean的全路径类名

范例

<bean id="Dao" class="dao.impl.DaoImpl"/>

<bean id="Service" class="service.impl.ServiceImpl"></bean>

bean别名配置

类别描述
名称name
类型属性
所属bean标签
功能定义bean的别名,可定义多个,使用逗号(,)分号( ;)空格()分隔
范例

<bean id="Dao" name="dao DaoImpl" class="dao.impl.DaoImpl" />

<bean id="Service" name="service,ServiceImpl" class="service.impl.ServiceImpl" />

注意事项:
获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常NoSuchBeanDefinitionExceptionNoSuchBeanDefinitionException: No bean named 'XXX' available

bean作用范围配置

类别描述
名称scope
类型属性
所属bean标签

功能
 

定义bean的作用范围,可选范围如下:

singleton:单例(默认)
prototype : 非单例

范例<bean id="Dao" class=" dao.impl.DaoImpl" scope=" prototype" />

bean作用范围说明:

(1)为什么bean默认为单例?

        ①为了提高性能

        ②少创建实例

        ③减少垃圾回收

        ④缓存快速获取

(2)适合交给容器进行管理的bean表

        ①现层对象

        ②业务层对象

        ③数据层对象
        ④工具对象
(3)不适合交给容器进行管理的bean
        ①封装实体的域对象

bean实例化

bean本质上就是对象,创建bean使用构造方法完成。

实例化bean的三种方式:①构造方法②静态工厂③实例工厂

第一种:构造方法(常用)

①提供可访问的构造方法

public class DaoImpl1 implements Dao1 {
    public DaoImpl1(){
        System.out.println("Dao初始化..");
    }
    public void show() {
        System.out.println("Dao...");
    }
}

②配置

<bean id="Dao1" class="Dao.impl.DaoImpl1"/>

注意:

共有私有都可以访问到

②无参构造方法如果不存在,将抛出异常BeanCreationException

第二种:静态工厂

 ①静态工厂

public class DaoFactory {
    public static Dao1 getDao1(){
        System.out.println("Factory setup...");
        return new DaoImpl1();
    }
}

②配置

<!--使用静态工厂实例化bean-->
<bean id="Dao1" class="Factory.DaoFactory" factory-method="getDao1"/>

第三种:实例工厂        

①实例工厂

public class DaoFactory2 {
    public Dao1 getDao1(){
        return new DaoImpl1();
    }
}

②配置

<!--使用实例工厂实例化bean-->
<bean id="DaoFactory2" class="Factory.DaoFactory2"/>
<bean id="Dao1" factory-bean="DaoFactory2" factory-method="getDao1"/>

第三种改良(掌握)

①FactoryBean

public class DaoFactoryBean implements FactoryBean<Dao1> {
    //代替原始实例工厂中创建对象的方法
    public Dao1 getObject() throws Exception {
        return new DaoImpl1();
    }

    public Class<?> getObjectType() {
        return Dao1.class;
    }
    //构建bean是否为单例,true就为单例
    @Override
    public boolean isSingleton() {
        return true;
    }
}

②配置

<!--使用实例工厂实例化bean改良-->
<bean id="Dao1" class="Factory.DaoFactoryBean"/>

bean生命周期

生命周期:从创建到消亡的完整过程
bean生命周期: bean从创建到销毁的整体过程

bean生命周期分段:
        ①初始化容器
                1.创建对象(内存分配)

                2.执行构造方法
                3.执行属性注入( set操作)

                4.执行bean初始化方法

        ②使用bean
                1.执行业务操作

        ③关闭/销毁容器

                1.执行bean销毁方法
bean生命周期控制︰在bean创建后到销毁前做一些事情 

生命周期控制方法

第一种:

①提供生命周期控制方法

public class DaoImpl1 implements Dao1 {
    public DaoImpl1(){
        System.out.println("Dao初始化..");
    }
    public void show() {
        System.out.println("Dao...");
    }

    //表示bean初始化进行的操作
    public void init(){
        System.out.println("init..");
    }
    public void save(){

    }
    //表示bean被销毁前对应的操作
    public void destory(){
        System.out.println("destory...");
    }
}

②配置生命周期控制方法

<bean id="Dao1" class="Dao.impl.DaoImpl1" init-method="init" destroy-method="destory"/>

第二种(接口控制,不需再配置):

①实现InitializingBean, DisposableBean接口

public class ServiceImpl1 implements Service1, InitializingBean, DisposableBean {
    //删除业务层中使用new方式创建的dao对象
    private Dao1 dao1;

    @Override
    public void show() {
        System.out.println("Service...");
        dao1.show();
    }
    //提供对应的set方法
    public void setDao1(Dao1 dao1) {
        System.out.println("set...");
        this.dao1 = dao1;
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("service destroy...");
    }

    //属性配置之后运行
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("service init...");
    }
}

bean销毁时机

容器关闭前触发bean的销毁

关闭容器方式:
①手工关闭容器
        ConfigurableApplicationcontext接口close()操作

public class App{
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Dao1 dao1 = (Dao1) context.getBean("Dao1");
        dao1.show();
        context.close();  //close()放在最后
    }
}

②注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机
        ConfigurableApplicationContext接口registerShutdownHook()操作 

public class App4 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        context.registerShutdownHook();   //registerShutdownHook()方法放前放后都不影响使用
        Dao1 dao1 = (Dao1) context.getBean("Dao1");
        dao1.show();
        //context.registerShutdownHook(); 
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Lyle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值