Spring复习 day(1)Bean的创建方式及生命周期

人走茶凉 提交于 2020-01-23 21:21:01

一、 创建Bean的三种方式

1.1 使用默认构造函数创建

使用Bean标签,配以ID和class属性,且没有其他属性和标签时,采用的就默认的构造函数创建Bean对象,此时如果类中无默认构造函数,则对象无法创建。

  • bean.xml
<?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-3.0.xsd">
    <bean id="studao" class="com.example.demo.Service.stuDao"></bean>

</beans>
  • bean.xm所在路径
    在这里插入图片描述* 测试
package com.example.demo;

import com.example.demo.Service.stuDao;
import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Controller {
    //取到Spring的核心ioc容器,根据ID获取对象
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        stuDao studao = (stuDao) ac.getBean("studao");
        System.out.println(studao);
    }
}
  • 结果
创建了默认的对象实例
com.example.demo.Service.stuDao@5faeada1

1.2 使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)

  • bean.xml
<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-3.0.xsd">
    <bean id="Stu_factory" class="com.example.demo.Service.StuFactory"></bean>
    <bean id="stuDao" factory-bean="Stu_factory" factory-method="getInstance" class="com.example.demo.Service.stuDao"></bean>
</beans>
  • test
public class Controller {
    //取到Spring的核心ioc容器,根据ID获取对象
    public static void main(String[] args) {
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
      applicationContext.getBean("stuDao");
    }
}

  • 结果
16:37:42.417 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@311d617d
16:37:42.588 [main] DEBUG org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loaded 2 bean definitions from class path resource [bean.xml]
16:37:42.638 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Stu_factory'
16:37:42.655 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'stuDao'
通过工厂创建对象
创建了默认的对象实例

可能我们需要创建的对象是从其他jar来的,不能直接获得对应类的默认构造方法。

1.3 使用静态工厂中的方法创建对象

  • bean.xml
<?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-3.0.xsd">
    <bean id="stuDao" class="com.example.demo.Service.StuFactory" factory-method="getInstance"></bean>
</beans>
  • 其他一样的

二、spring的配置文件简单演示

2.1 applicationcontext的常用实现类

  • ClassPathXmlApplicationContext
    用于加载类路径下的配置文件
  • FileSystemXmlApplicationContext
    加载任意路径下的配置文件
  • AnnotationConfigApplicationContext
    读取注解创建容器的

2.2 查看接口的实现类

ctrl + H

2.3 ApplicationContext和BeanFactory的区别

打断点再读取配置文件那一行,发现ApplicationContext一读取完配置文件,立即创建配置文件中的对象,而BeanFactory只有当调用getBean(“xx”)方法时,才创建对象。

  • ApplicationContext立即加载,一读取完配置文件,立即创建配置文件中的对象

单例对象使用

public class Controller {
    //取到Spring的核心ioc容器,根据ID获取对象
    public static void main(String[] args) {
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
      applicationContext.getBean("studao");
    }
}

  • BeanFactory延迟加载,只有当调用getBean(“xx”)方法时,才创建对象。

多例对象使用

public class Controller {
    //取到Spring的核心ioc容器,根据ID获取对象
    public static void main(String[] args) {
        Resource resource = new ClassPathResource("bean.xml");
        BeanFactory bf = new XmlBeanFactory(resource);
        stuDao stuDao = (stuDao) bf.getBean("studao");
    }
}

2.4 什么时候使用延迟加载,什么时候使用立即加载?

  • 单例模式适合立即加载
  • 多例模式适合延迟加载,即使用什么样的对象实例,再创建。

2.5 bean的作用范围

  • 默认是单例的
public class Controller {
    //取到Spring的核心ioc容器,根据ID获取对象
    public static void main(String[] args) {
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        stuDao stuDao = (stuDao) applicationContext.getBean("stuDao");
        stuDao stuDao1 = (stuDao) applicationContext.getBean("stuDao");
        System.out.println(stuDao == stuDao1);
    }
}
  • 结果
true
  • sinleton: 单例的
  • prototype: 多例的
  • request: 作用于web应用的请求范围
  • response: 作用于web应用的会话范围
  • global-session: 作用于集群的会话范围(当不是集群环境时),就是session范围

三、bean对象的生命周期

3.1 单例对象

随着容器的创建而创建,随着容器的销毁而销毁。

  • bean.xml
<?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-3.0.xsd">
    <bean id="stuDao" class="com.example.demo.Service.StuFactory" factory-method="getInstance" init-method="init" destroy-method="destroy"></bean>
</beans>
  • test类
public class Controller {
    //取到Spring的核心ioc容器,根据ID获取对象
    public static void main(String[] args) {
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        stuDao stuDao = (stuDao) applicationContext.getBean("stuDao");
    }
}
  • 结果

未调用销毁方法,原因,main函数结束,容器内存释放,还未来得及调用destroy方法。需要手动调用。

对象创建了
对象初始化了
  • 手动调用容器销毁方法
public class Controller {
    //取到Spring的核心ioc容器,根据ID获取对象
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        stuDao stuDao = (stuDao) applicationContext.getBean("stuDao");
        applicationContext.close();
    }
}
  • 结果
对象创建了
对象初始化了
17:45:38.519 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Closing org.springframework.context.support.ClassPathXmlApplicationContext@311d617d, started on Thu Jan 23 17:45:38 CST 2020
对象销毁了

3.2 多例对象

  • 使用对象时spring框架创建对象,使用过程中对象一直存在,直到对象长时间没有被使用,并且没有被其他地方引用时,会被java垃圾回收机制进行回收。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!