Spring入门之Bean的相关知识

Spring入门—Bean相关知识

1 Bean的配置

1.1 为bean配置别名

只需要在配置文件里引入name属性,name里面的别名可以有多个,中间使用空格 逗号 分号分割都可以

<?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="BookDao" class="com.demo.dao.impl.BookDaoImpl"></bean>
    <bean id="BookService" name="service service2 service3" class="com.demo.service.impl.BookServiceImpl">
        <property name="bookDao" ref="BookDao"></property>
    </bean>
</beans>

配置好后,调用service2,查看运行结果

1.2 Bean的作用范围

控制bean创建的时候,对象是否为单例的

运行以下代码,看一下这两个对象的地址是不是一样的,看看是不是同一个对象。运行结果为地址相同,说明spring默认给我们创建的bean是单例的

image-20220809105418544

如何配置非单例的,在配置文件中,加入scope属性。有两个选项,分别是:propertype(非单例) singleton(单例),默认为单例

将属性设置为propertype后,再次运行,发现创建的对象是两个了

哪些bean适合单例

  1. 表现层对象(servelet)
  2. 业务层对象(service)
  3. 数据层对象(dao)
  4. 工具对象

不适合单例

  • 封装实体的域对象(domain)

2 Bean的实例化

2.1 构造方法

无参构造

在BookDao的实现类中,为其创建无参构造函数,先设置为public,发现构造函数执行了

image-20220809112132713

再设置为private,发现构造函数也执行了

image-20220809112244404

静态工厂

创建一个工厂类

image-20220809115844365

配置xml时,class配置的是工厂类名

<?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="OrderDao" class="com.demo.factory.OrderDaofactory" factory-method="getOrderDao"></bean>
</beans>

创建对象测试一下

image-20220809115956831

实例工厂

有了实例工厂类之后,就要先创建对象再去引用

实例工厂

public class UserDaofactory {
    public UserDao getUserDao() {
        return new UserDaoImpl();
    }

}

启动类

import com.demo.dao.UserDao;
import com.demo.factory.UserDaofactory;

public class AppForInstanceUser {
    public static void main(String[] args) {
        //创建实例工厂对象
        UserDaofactory userDaofactory = new UserDaofactory();
        //通过实例工厂对象创建对象
        UserDao userDao = userDaofactory.getUserDao();
        userDao.test();
    }
}

如何使用这个方法

配置文件改为

<bean id="userFactory" class="com.demo.factory.UserDaofactory"></bean>
<bean id="userDao" factory-bean="userFactory" factory-method="getUserDao"></bean>

运行结果

image-20220809195208499


这种方法的改良

创建一个FactoryBean类

并且让这个类继承FactoryBean这个接口

image-20220809195706510

配置xml,class指向FactoryBean

<!--    改良的方法配置-->
<bean id="userDao" class="com.demo.factory.UserDaoFactoryBean"></bean>

3 Bean的生命周期

  • 生命周期

    从创建到消亡的完整过程

  • bean生命周期

    bean从创建到销毁的整体过程

  • bean生命周期控制

    在bean创建后到销毁前做的一些事情

  1. 在dao的实现类里创建初始化函数和销毁函数
import com.demo.dao.BookDao;

public class BookDaoImpl implements BookDao {

    @Override
    public void test() {
        System.out.println("BookDao is running...");
    }

    //bean初始化对应的操作
    public void init() {
        System.out.println("init...");
    }

    //bean销毁前对应的操作
    public void destory() {
        System.out.println("destory...");
    }
}
  1. 在配置文件中声明初始化函数和销毁函数
<bean id="BookDao" class="com.demo.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"></bean>
  1. 运行。发现只执行了init
  1. 如何运行destory函数

    先将ApplicationContext applicationContext改为ClassPathXmlApplicationContext

    1. 注册关闭钩子

      applicationContext.registerShutdownHook();
      
    2. 暴力关闭

      applicationContext.close();
      


按照spring接口的方式实现bean的生命周期

本次操作在service层操作

  1. 在实现类里继承InitializingBean, DisposableBean两个接口,并且实现destroy()和afterPropertiesSet()两个方法
  2. 运行
为什么继承的接口实现初始化的方法不叫init,而是叫做set之后

在set的函数里写上输出内容,执行一下

import com.demo.dao.BookDao;
import com.demo.dao.impl.BookDaoImpl;
import com.demo.service.BookService;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
    //删除业务层中使用new的方式创建到对象
    private BookDao bookDao;

    @Override
    public void test() {
        System.out.println("BookService is running...");
        bookDao.test();
    }

    //提供对应的set方法
    public void setBookDao(BookDao bookDao) {
        System.out.println("set...");
        this.bookDao = bookDao;
    }

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

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Service init...");
    }
}

image-20220811103541610

总结

bean的生命周期

  • 初始化容器
    1. 创建对象(分配内存)
    2. 执行构造方法
    3. 执行属性注入(set操作)
    4. 执行bean的初始化方法
  • 使用bean
    1. 执行业务操作
  • 关闭/销毁容器
    1. 执行bean销毁方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不会挂科i

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

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

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

打赏作者

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

抵扣说明:

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

余额充值