Spring三种实力化bean方法和bean的生命周期

110 阅读1分钟

配置

<?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
            配置一个bean-->
        <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>

    <!--    静态工厂实例化bean
    class 传入静态工厂的路径
    再指定创建对象的工厂方法 factory-method="getBookDao"
    -->
    <bean id="bookDao" class="com.itheima.factory.BookDaoFactory" factory-method="getBookDao"/>

    <!--    实例工厂实例化bean
      先配置一个工厂bean -->
    <bean id="brandFactory" class="com.itheima.factory.BrandDaoFactory"/>
    <!--    然后配置实例化bean
       这里就不需要写class属性了
       使用factory-bean="brandFactory"将刚刚创建的bean的id传入
       再使用 factory-method="getBrandDao"指定创建对象的工厂方法-->
    <bean id="brandDao" factory-bean="brandFactory" factory-method="getBrandDao"/>

    <!-- 使用FactoryBean实例化bean
           class将FactoryBean的路径传入即可-->
    <bean id="brandDaoFactoryBean" class="com.itheima.factory.BranDaoFactoryBean"/>
</beans>

FactoryBean

package com.itheima.factory;

import com.itheima.dao.BrandDao;
import com.itheima.dao.impl.BrandDaoImpl;
import org.springframework.beans.factory.FactoryBean;

//实现接口 泛型需要创建什么类型对象就写什么
public class BranDaoFactoryBean implements FactoryBean<BrandDao> {

    @Override
    public BrandDao getObject() throws Exception {
        return new BrandDaoImpl();//将对象return回去
    }

    @Override
    public Class<?> getObjectType() {
        return BrandDao.class;//return 对象的类型,要什么类型将类型的class传过去
    }
    @Override
    public boolean isSingleton() {
        return true;//true表示单例模式 false表示非单例模式
    }
}

获取Bean

package com.itheima;

import com.itheima.dao.BookDao;
import com.itheima.dao.BrandDao;
import com.itheima.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class main {
    public static void main(String[] args) {
        // 使用构造方法实例化bean,是最常见的方式 其配置也跟平常配置一致
        ApplicationContext text = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) text.getBean("userDao");
        userDao.userDao();

        //使用静态工厂实力化bean(了解即可)
        BookDao bookDao = (BookDao) text.getBean("bookDao");
        bookDao.bookDao();

        //使用实例工厂实力化bean(了解即可)
        BrandDao brandDao = (BrandDao) text.getBean("brandDao");
        brandDao.brandDao();

        //使用FactoryBean实例化bean(必须掌握)
        BrandDao brandFactoryBean = (BrandDao) text.getBean("brandDaoFactoryBean");
        brandFactoryBean.brandDao();

    }
}

bean的生命周期

  • bean生命周期控制方式一

1、提供生命周期的控制方法

package com.itheima.service.impl;

import com.itheima.dao.BookDao;
import com.itheima.service.BookService;

public class BookServiceImpl implements BookService {
    private BookDao bookDao;
    @Override
    public void bookService() {
        System.out.println("bookService");
        bookDao.bookDao();
    }
    //初始化方法
    public void init(){
        System.out.println("init...");
    }
    //销毁方法
    public void destroy(){
        System.out.println("destroy...");
    }
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

2、配置生命周期的控制方法

<!--   配置bean的控制方法
    init-method="init" 配置初始化方法
    destroy-method="destroy 配置销毁方法-->
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" init-method="init" destroy-method="destroy/">

方式二

接口控制bean的生命周期(一步到位,了解即可)

1、实现InitializingBean, DisposableBean接口

2、重写destroy(销毁方法),afterPropertiesSet(初始化方法)

package com.itheima.service.impl;

import com.itheima.dao.BookDao;
import com.itheima.service.BookService;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
    private BookDao bookDao;
    @Override
    public void bookService() {
        System.out.println("bookService");
        bookDao.bookDao();
    }

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("destroy");//销毁方法
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet");//初始化方法

    }
}

image.png

image.png