• Spring5之IOC容器中IOC操作之Bean管理(四)之FactoryBean、bean作用域以及bean生命周期


    1、IOC操作Bean管理(FactoryBean)

    1.1 两种类型bean

    (1)普通bean
    在配置文件中定义bean类型就是返回类型
    (2)工厂bean
    在配置文件定义bean类型可以和返回类型不一样

    1.2 工厂bean

    (1)创建类,让这个类作为工厂bean,实现接口FactoryBean
    (2)实现接口里面的方法,在实现的方法中定义返回的bean类型
    (3)样例
    工厂bean

    package com.example.spring5.factorybean;
    
    import com.example.spring5.collectiontype.Course;
    import org.springframework.beans.factory.FactoryBean;
    
    public class MyBean implements FactoryBean<Course> {
    
        //定义返回bean
        @Override
        public Course getObject() throws Exception {
            Course course = new Course();
            course.setCname("abc");
            return course;
        }
    
        @Override
        public Class<?> getObjectType() {
            return null;
        }
    
        @Override
        public boolean isSingleton() {
            return FactoryBean.super.isSingleton();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    配置类

    
    <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="myBean" class="com.example.spring5.factorybean.MyBean">
    
        bean>
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    测试类

    package com.example.spring5;
    
    import com.example.spring5.collectiontype.Course;
    import com.example.spring5.factorybean.MyBean;
    import com.example.spring5.service.UserService;
    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:bean1.xml")
    class MyBeanTest {
    
        @Test
        public void testAdd(){
            //1 加载spring配置文件
            ApplicationContext context = new ClassPathXmlApplicationContext("mybean.xml");
    
            //2 获取配置创建的对象
           Course course = context.getBean("myBean", Course.class);
            System.out.println(course);
    
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    2、IOC操作Bean管理(bean作用域

    2.1 在Spring里面,设置创建bean实例是单实例还是多实例

    默认情况下,bean是单实例对象

      @Test
       public void testCollection3() {
            ApplicationContext context = new ClassPathXmlApplicationContext("util.xml");
            Book book1 = context.getBean("book", Book.class);
            Book book2 = context.getBean("book", Book.class);
            System.out.println(book1);
            System.out.println(book2);
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    结果是
    在这里插入图片描述

    2.2 设置单实例还是多实例(scope)

    属性scope用于设置单实例还是多实例
    (1)singleton(表示单实例对象)
    (2)prototype(表示多实例对象)

    
    <bean id="book" class="com.example.spring5.collectiontype.Book" scope="prototype">
         <property name="list" ref="bookList">property>
    bean>
    
    • 1
    • 2
    • 3
    • 4

    结果
    在这里插入图片描述

    2.3 singleton 和 prototype区别

    (1)singleton单实例,prototype多实例
    (2)设置scope值是singleton时候,加载spring配置文件时候就会创建单实例对象。
    设置scope值是prototype时候,不是在加载spring配置文件时候创建对象,在调用getBean方法时候创建多实例对象。

    3、IOC操作Bean管理(bean生命周期

    3.1 生命周期

    (1)从对象创建到对象销毁的过程

    3.2 bean生命周期

    (1)通过构造器创建bean实例(无参数构造)
    (2)为bean的属性设置值和对其他bean引用(调用set方法)
    (3)调用bean的初始化的方法(需要进行配置初始化的方法)
    (4)bean可以使用(对象获取到了)
    (5)当容器关闭时候,调用bean的销毁方法(需要进行配置销毁的方法)

    3.3 演示bean生命周期

    实体类

    package com.example.spring5.bean;
    
    public class Orders {
    
        //无参数构造
        public Orders(){
            System.out.println("第一步 执行无参数构造创建bean实例");
        }
    
        private String oname;
    
        public void setOname(String oname) {
            this.oname = oname;
            System.out.println("第二步 调用set方法设置属性的值");
        }
    
        //创建执行的初始化方法
        public void initMethod(){
            System.out.println("第三步 执行初始化的方法");
        }
    
        //创建执行的销毁的方法
        public void destroyMethod(){
            System.out.println("第五步 执行销毁的方法");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    配置类

    
    <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="orders" class="com.example.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
               <property name="oname" value="电脑"/>
           bean>
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    测试类

    package com.example.spring5;
    
    import com.example.spring5.bean.Orders;
    import com.example.spring5.service.UserService;
    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:bean1.xml")
    class OrderBeanTest {
    
        @Test
        public void testAdd(){
            //1 加载spring配置文件
    //        ApplicationContext context = new ClassPathXmlApplicationContext("bean7.xml");
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean7.xml");
    
            //2 获取配置创建的对象
            Orders orders = context.getBean("orders", Orders.class);
            System.out.println("第四步 获取创建bean实例对象");
            System.out.println(orders);
    
            //手动让bean实例销毁
            context.close();
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    结果
    在这里插入图片描述

    3.4 如果bean生命周期加上bean的后置处理器,bean生命周期有七步

    (1)通过构造器创建bean实例(无参数构造)
    (2)为bean的属性设置值和对其他bean引用(调用set方法)
    (3)把bean实例传递bean后置处理器的方法
    (4)调用bean的初始化的方法(需要进行配置初始化的方法)
    (5)把bean实例传递bean后置处理器的方法
    (6)bean可以使用(对象获取到了)
    (7)当容器关闭时候,调用bean的销毁方法(需要进行配置销毁的方法)
    实体类

    package com.example.spring5.bean;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.lang.Nullable;
    
    public class MyBeanPost implements BeanPostProcessor {
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("在初始化之前执行的方法");
            return bean;
        }
    
        @Override
       public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("在初始化之前执行的方法");
            return bean;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    配置类

    
    <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="orders" class="com.example.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
               <property name="oname" value="电脑"/>
           bean>
    
           
           <bean id="myBeanPost" class="com.example.spring5.bean.MyBeanPost">
    
           bean>
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    测试样例

    package com.example.spring5;
    
    import com.example.spring5.bean.Orders;
    import com.example.spring5.service.UserService;
    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:bean1.xml")
    class OrderBeanTest {
    
        @Test
        public void testAdd(){
            //1 加载spring配置文件
    //        ApplicationContext context = new ClassPathXmlApplicationContext("bean7.xml");
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean7.xml");
    
            //2 获取配置创建的对象
            Orders orders = context.getBean("orders", Orders.class);
            System.out.println("第四步 获取创建bean实例对象");
            System.out.println(orders);
    
            //手动让bean实例销毁
            context.close();
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    结果
    在这里插入图片描述

  • 相关阅读:
    H5\CSS\JS 盒子拖动mousedown、mousemove、mouseup、pageX、pageY、offsetLeft、offsetTop
    Pytorch详细教程——11.CNN Flatten Operation Visualized
    MySQL事务篇
    DSP28335学习记录(五)——eCAP、eQEP
    Model Fusion of Heterogeneous Neural Networks via Cross-Layer Alignment论文阅读
    月销破30万辆后,比亚迪整了波大的
    Centos7.4重启提示gurb2/i386-pc/normal.mod not found
    突然发现柚子租车v1.42的小程序后端代码竟然内核文件全加密了!记录我的解密过程
    Serverless之Knative部署应用实例;
    信息的浏览
  • 原文地址:https://blog.csdn.net/qq_46106857/article/details/126156229