Spring中bean的创建模式、生产原理、生命周期、使用工厂创建的好处

8. bean的创建模式

# spring工厂的相关特性

注意:工厂默认在管理对象时都是单例方式,单例方式无论在工厂中获取多少次始终获取的是同一个对象
1.spring中工厂创建对象的模式
	1). 默认spring在管理组件对象时是 单例创建 singleton
		  service dao 单例形式管理
	2). 如何修改工厂创建组件对象为多例
		  structs2 action 必须以多例形式管理

spring工厂在管理对象时默认使用的是单例模式

在这里插入图片描述

修改spring工厂创建对象的模式为多例模式

bean标签有一个scope属性,如果不写这个属性则默认scope值是singleton,也就是单例模式,如果在scope属性中写入prototype,代表创建对象的模式为多例

	<!--配置文件中-->
    <!--管理DAO组件
        scope:用来指定工厂创建对象的模式
                默认值:singleton 单例
                      prototype 多例
    -->
    <bean class="scope.TagDAOImpl" id="tagDAO" scope="prototype"></bean>

修改创建对象的方式为多例的测试结果:

在这里插入图片描述

9. bean的生产原理

# spring工厂创建对象的原理
	原理:反射 + 构造方法
	    // 工厂原理
        TagDAO tt = (TagDAO) Class.forName("scope.TagDAOImpl").newInstance();
        System.out.println(tt);

反射 + 构造方法 创建对象的测试结果

在这里插入图片描述

10. bean的生命周期

# spring工厂管理组件生命周期
	1.组件对象什么时候创建	2.组件对象什么时候销毁
	单例对象:工厂启动工厂中所有的单例的对象随之创建,工厂销毁工厂中所有单例对象随之销毁
	多例对象:每次在工厂中使用时进行创建   工厂不负责多例对象的销毁

对于单例模式和多例模式的对象来说spring中管理对象的生命周期也是不同的。

小知识

  • bean标签内部有一个init-method属性,代表在对象初始化时需要调用的方法,如果希望调用方法名为init2001的方法,就使

    init-method=“init2001”;bean标签内部还有一个destroy-method属性,代表在对象销毁时需要调用的方法,如果希望调用

    方法名为destory的方法,就使destroy-method=“destory”。

注意:init-methoddestroy-method调用的方法必须是在当前bean标签所代表的类中有的方法

10.1 对于单例模式创建的对象的生命周期的管理

需要用到的TageDAO组件的实现类TagDAOImpl

public class TagDAOImpl implements TagDAO{
    @Override
    public void save(String name) {
        System.out.println("DAO Name:" + name);
    }

    // init
    public void init2001(){
        System.out.println("组件对象初始化");
    }

    // destory
    public void destory(){
        System.out.println("组件对象销毁");
    }
}

配置文件

<!--管理DAO组件
    scope:用来指定工厂创建对象的模式
            默认值:singleton 单例
                  prototype 多例
    生命周期方法:
         init-method=""     在对象初始化时调用的方法
         destroy-method=""  在对象销毁时调用的方法

-->
<bean class="scope.TagDAOImpl" id="tagDAO" init-method="init2001" destroy-method="destory"></bean>

测试和结果

单例对象什么时候去创建呢?

  • 单例对象是在工厂启动的时候创建还是在获得的时候创建还是在真正使用的时候去创建呢?

在这里插入图片描述

在上面的代码中只有工厂的启动,却还是执行了只有在初始化对象时才执行的init2001方法(init2001方法打印出"组件对象初始化"这句话)。所以我们可以得出结论:单例模式创建的对象spring工厂启动时就被创建了。

补充

另外我们可能会疑惑,为什么没有执行对象销毁时调用的destory方法呢,这是因为只有在工厂正常关闭时才会调用destory方法,而上面代码线程停止(相当于断电了),工厂没有正常关闭,也就不会调用destory方法了。

还有:工厂的关闭方法close()方法只有在实现类中才有,在工厂抽象类中没有,因此如果我们想要调用close()方法,还必须把抽象工厂接口强转为实现类(联系多态,只有父类有的方法使用父类对象才可以调用),在强转时需要使用两个括号

正常关闭工厂的测试结果:

在这里插入图片描述

10.2 对于多例模式创建的对象的生命周期的管理

配置文件

因为是多例模式,所以bean标签scope属性需要写prototype

<!--管理DAO组件
    scope:用来指定工厂创建对象的模式
            默认值:singleton 单例
                  prototype 多例
    生命周期方法:
         init-method=""     在对象初始化时调用的方法
         destroy-method=""  在对象销毁时调用的方法

-->
<bean class="scope.TagDAOImpl" id="tagDAO" scope="prototype" init-method="init2001" destroy-method="destory"></bean>

测试和结果

在这里插入图片描述

在这里插入图片描述

11. bean工厂创建对象的好处

# spring工厂好处
	1. 解耦合 使用配置文件管理java类,在生产环境中更换类的实现时不需要重新部署,修改文件即可
	2. 减少jvm内存占用 spring默认使用单例的模式创建bean,减少内存的占用
	3. 通过依赖注入方式建立组件与组件|对象与对象的依赖关系,使对象之间关系更为清晰,方便进行组件代码的维护和管理

总结:

在这里插入图片描述

12. 总结

1.spring框架?

  spring 框架 项目管理框架  核心 就是用来管理项目中组件对象的创建 使用 销毁

2.spring框架第一个环境搭建

  a).引入依赖
     spring-core
     spring-context
     spring-beans
     spring-expression
     spring-jdbc
     spring-web
     .....
  b).引入spring.xml
     名字 随便  位置:resources目录下随便

  c).通过spring管理组件的创建
    interface UserDAO { void save(String name)}
    class UserDAOImpl implements UserDAO

    spring.xml

     <bean clsss="xxx.UserDAOImpl" id="userDAO" />

  d).启动工厂
    ApplicationContext  context = new ClassPathXmlApplicationContext("xxx/spring.xml");

    context.getBean("beanid");

3).spring核心思想?

    IOC&DI

        IOC:inversion of controll 控制反转
            就是将手动通过new关键字创建对象的权利交给spring,由工厂创建对象过程,
        DI: Dependency Injection 依赖注入
            Spring工厂不仅要创建对象还要在创建对象同时维护组件和组件的依赖关系

    AOP: 面前切面编程

4).spring中注入

    SET方式[重点]    构造方法   自动注入

    SET注入:
            定义: 使用set方法形式为成员变量赋值过程称之为set注入
            语法:
                 1.需要谁将谁声明为成员变量并提供公开SET方法
                 2.在spring配置文件中对应组件标签内部使用 property标签完成注入

            1.String + 八种基本类型 + 日期类型 使用 value属性进行注入
                <property name="name" value="xx">
                注意: spring中日期格式 默认为 yyyy/MM/dd HH:mm:ss

            2.对象|引用类型
                <property name="" ref="beanid">

            3.数组类型
                array   value     引用: ref bean="beanid"

            4.list set map
                list    value     引用: ref
                map  entry   key="" value=""  引用: key-ref="beanid" value-ref="beanid"

            5.properties
                props  prop  key=""   <prop key="">value</prop>


5).spring工厂细节

    1).创建方式 默认使用单例
        <bean class="" id="" scope="singleton(service dao)|prototype(struts2action)">

    2).工厂原理
        反射+构造方法
        Class.forName("xxxx").newInstance();

    3).工厂生命周期

        单例: 工厂启动工厂中单例对象随之创建   工厂正常关闭 工厂中单例对象随之销毁

        多例: 每次使用时工厂进行多例对象的创建  spring工厂不负责多例对象的销毁
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 春天是一个美好的季节,bean的创建bean的生命周期与此同样美好。Bean的创建是指在Spring容器创建bean对象的过程,而bean的生命周期指定义bean实例的生命周期,从创建到销毁的过程。 ### 回答2: Spring创建bean的过程如下: 1. 配置bean:通过XML配置文件或Java注解将要创建bean进行配置,包括bean的类、属性、依赖关系等。 2. 加载bean定义:Spring容器根据配置文件或注解信息,将bean的定义加载到内存。 3. 创建实例:Spring容器根据bean的定义,使用Java反射机制实例化bean对象。 4. 设置属性:Spring容器通过依赖注入的方式,将bean所依赖的属性注入到bean实例。 5. 调用初始化方法:如果bean实现了InitializingBean接口或在配置文件通过init-method属性指定了初始化方法,Spring容器在创建bean对象后会调用其初始化方法。 6. bean可用:经过以上步骤,Spring容器创建完成了bean,并将其放入容器,可以使用bean了。 7. 调用销毁方法:如果bean实现了DisposableBean接口或在配置文件通过destroy-method属性指定了销毁方法,当容器关闭时,会调用bean的销毁方法。 Bean的生命周期包括以下阶段: 1. 实例化:Spring容器根据bean的定义和配置,使用反射机制实例化bean对象。 2. 设置属性:将bean的依赖属性注入到bean实例。 3. 初始化:Spring容器调用bean的初始化方法,执行一些初始化逻辑。 4. 使用bean实例可以被应用程序使用。 5. 销毁:当容器关闭时,调用bean的销毁方法,执行一些清理逻辑。 在整个生命周期,开发人员可以通过配置文件或注解方式指定各个阶段的行为,如指定初始化方法、销毁方法、依赖注入等。Spring容器负责管理bean的生命周期,从而提供了更好的灵活性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值