• 2-3、bean的作用域生命周期,以及xml自动装配


    2.10、bean的作用域

    bean的作用域有两种,一种是单例模式,一种是多例模式。利用scope属性来设置。

    <bean id="user" class="com.lu.Spring.pojo.User" scope="singleton">bean>
    
    <bean id="user" class="com.lu.Spring.pojo.User" scope="prototype">bean>
    
    • 1
    • 2
    • 3
    属性值含义创建对象时机
    singleton单例模式,只创建唯一一个对象IOC容器初始化时
    prototype多例模式,可以创建多个对象。获取bean时

    2.11、bean的生命周期

    bean的具体生命周期:

    1. bean对象创建(调用无参构造)
    2. 给bean对象属性赋值(依赖注入)
    3. bean初始化之前的操作(bean的后置处理器负责)
    4. bean对象初始化(需指定初始化方法)
    5. bean初始化之后的操作(bean的后置处理器负责)
    6. bean对象就绪
    7. bean对象销毁(需指定销毁方法)
    8. IOC容器关闭

    可以看到一个bean对象初始化到销毁要经过8个步骤,注意当IOC容器关闭时触发对象将其销毁。

    当bean的作用域为prototype时,IOC容器关闭时对象也不会销毁。

    2.12、FactoryBean

    FactoryBean是一个接口,包含三个方法,其他类实现该方法后可以直接配置bean当作工厂类使用。

    public class UserFactory implements FactoryBean<User> {
        public User getObject() throws Exception {
            return new User();
        }
    
        public Class<?> getObjectType() {
            return User.class;
        }
    
    //    public boolean isSingleton() {
    //        return true;
    //    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    方法作用
    getObject()返回工厂对应的类实例
    getObjectType()返回工厂对应的类类型
    isSingleton()返回的bean是否为单例模式,默认为true

    在Spring配置文件中配置UserFactory则会将User类交给IOC容器

    <bean id="UserFactory" class="com.lu.Spring.factory.UserFactory">bean>
    
    • 1
    @Test
    public void test() throws SQLException {
        //1.获取ApplicationContext
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.获取指定类对象
        User user = applicationContext.getBean(User.class);
    
        System.out.println(user);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.13、基于xml的自动装配问题

    1、什么是自动装配

    根据制定策略,在IOC匹配某一个bean自动为其类类型或者接口类型的属性赋值。

    先来看看之前我们是怎么为其类类型或者接口类型的属性赋值的:

    在这里插入图片描述

    <bean id="userController" class="com.lu.Spring.controller.UserController" >
        <property name="userService" ref="userServiceImpl">property>
    bean>
    
    <bean id="userServiceImpl" class="com.lu.Spring.service.Impl.UserServiceImpl" >bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    可以看到我们通过ref属性手动为其装配。

    我么接下来对xml文件中提供的两种常用的自动装配进行说明:autowire="byType"autowire="byName"

    2、自动装配–autowire=“byType”

    <bean id="userController" class="com.lu.Spring.controller.UserController" autowire="byType">bean>
    
    <bean id="userServiceImpl" class="com.lu.Spring.service.Impl.UserServiceImpl" >bean>
    
    • 1
    • 2
    • 3

    为UserController类对应的bean配置autowire="byType"属性,则会自动在IOC容器中查找对应的bean为其类类型或者接口类型的属性赋值。

    3、自动装配–autowire=“byName”

    <bean id="userController" class="com.lu.Spring.controller.UserController" autowire="byName">bean>
    
    <bean id="userService" class="com.lu.Spring.service.Impl.UserServiceImpl" autowire="byName">bean>
    
    • 1
    • 2
    • 3

    通过autowire="byName"自动装配有一个注意点,自动装配时将会通过属性名作为id在IOC容器中自动装配对应的bean。所以要注意IOC容器中对应bean的id要和属性名一致。

  • 相关阅读:
    java 从零开始手写 RPC (00) 概览 overview
    这Java核心知识+1000页面试题,绝对不能私藏,大家一起学习!
    MAC-设置mysql开机自启动
    从双非硕士到大厂工作,优秀
    第三部分—数据结构与算法基础_1. 数据结构理论
    【node进阶】深入浅出websocket即时通讯(二)-实现简易的群聊&私聊
    寻找两个正序数组的中位数
    MyBatis初级
    【100天精通Python】Day72:Python可视化_一文掌握Seaborn库的使用《二》_分类数据可视化,线性模型和参数拟合的可视化,示例+代码
    【Vue】路由vue-Router
  • 原文地址:https://blog.csdn.net/weixin_48312484/article/details/126026499