Spring中的工厂类、bean的作用范围和生命周期

1.Spring中的工厂类

1.1ApplicationContext

  • ClassPathXmlApplicationContext:加载类路径下 Spring 的配置文件

  • FileSystemXmlApplicationContext:加载本地磁盘下 Spring 的配置文件

1.1.1service

ApplicationContext:只要一读取配置文件,默认情况下就会创建对象。

java 复制代码
package com.by.service;

import com.by.dao.UserDao;
import com.by.dao.UserDaoImpl;

public class UserServiceImpl implements UserService{
    private UserDao userDao;
   private String msg;


    public UserServiceImpl() {
        System.out.println("测UserServiceImpl对象创建了...");
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public UserServiceImpl(UserDao userDao, String msg) {
        this.userDao = userDao;
        this.msg = msg;
    }

    @Override
    public void adduser() {
        System.out.println(userDao+"============"+msg);
           userDao.adduser();
    }
}

1.1.2applicationContext.xml

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.xsd">

    <!--
		2、把对象交给spring来创建
       		id:给对象在容器中提供一个唯一标识。用于获取对象
		   	class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数
	-->
    <bean id="userDao" class="com.by.dao.UserDaoImpl"></bean>
    <bean id="userService" class="com.by.service.UserServiceImpl" autowire="byType">
    </bean>



</beans>

1.1.3测试

java 复制代码
package com.by.web;

import com.by.dao.UserDao;
import com.by.service.UserService;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ContextResource;

public class Client {
    public static void main(String[] args) {
 /**
         * 测试BeanFactory和ApplicationContext的区别
         */
        new ClassPathXmlApplicationContext("applicationContext.xml");
        //XmlBeanFactory xbf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
      //  UserService userService = xbf.getBean("userService", UserService.class);

        System.out.println("Spring  IOC容器被创建了...............");

    }
}

1.1.4结果

1.2BeanFactory

  • spring中工厂的类结构图

BeanFactory:是在 getBean 的时候才会创建对象。

1.2.1service

java 复制代码
package com.by.service;

import com.by.dao.UserDao;
import com.by.dao.UserDaoImpl;

public class UserServiceImpl implements UserService{
    private UserDao userDao;
   private String msg;


    public UserServiceImpl() {
        System.out.println("测UserServiceImpl对象创建了...");
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public UserServiceImpl(UserDao userDao, String msg) {
        this.userDao = userDao;
        this.msg = msg;
    }

    @Override
    public void adduser() {
        System.out.println(userDao+"============"+msg);
           userDao.adduser();
    }
}

1.2.2applicationContext.xml

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.xsd">

    <!--
		2、把对象交给spring来创建
       		id:给对象在容器中提供一个唯一标识。用于获取对象
		   	class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数
	-->
    <bean id="userDao" class="com.by.dao.UserDaoImpl"></bean>
    <bean id="userService" class="com.by.service.UserServiceImpl" autowire="byType">
    </bean>



</beans>

1.2.3测试

java 复制代码
package com.by.web;

import com.by.dao.UserDao;
import com.by.service.UserService;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ContextResource;

public class Client {
    public static void main(String[] args) {
 /**
         * 测试BeanFactory和ApplicationContext的区别
         */
        //new ClassPathXmlApplicationContext("applicationContext.xml");
        XmlBeanFactory xbf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
       UserService userService = xbf.getBean("userService", UserService.class);

        System.out.println("Spring  IOC容器被创建了...............");

    }
}

1.2.4结果

1.3BeanFactroy和ApplicationContext区别

BeanFactroy:顶级接口,getBean时才创建对象

ApplicationContext:子接口,加载配置文件时就创建对象

2.bean的作用范围

2.1概述

  • 在Spring中,bean作用域用于确定bean实例应该从哪种类型的Spring容器中返回给调用者。

2.2五种作用域

目前Spring Bean的作用域或者说范围主要有五种:

作用域 说明
singleton 默认值,Bean以单例方式存在spring IoC容器
prototype 每次从容器中调用Bean时都返回一个新的实例,相当于执行newInstance()
request WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中
session WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
application WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 ServletContext 域中

可以通过 <bean> 标签的scope 属性控制bean的作用范围,其配置方式如下所示:

<bean id="..." class="..." scope="singleton"/>

  • 需要根据场景决定对象的单例、多例模式

    单例:Service、DAO、SqlSessionFactory(或者是所有的工厂)

    多例:Connection、SqlSession

2.3测试单例singleton

2.3.1service

java 复制代码
package com.by.service;

import com.by.dao.UserDao;
import com.by.dao.UserDaoImpl;

public class UserServiceImpl implements UserService{
    private UserDao userDao;
   private String msg;


    public UserServiceImpl() {
        System.out.println("测UserServiceImpl对象创建了...");
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public UserServiceImpl(UserDao userDao, String msg) {
        this.userDao = userDao;
        this.msg = msg;
    }

    @Override
    public void adduser() {
        System.out.println(userDao+"============"+msg);
           userDao.adduser();
    }
}

2.3.2applicationContext.xml

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.xsd">

    <!--
		2、把对象交给spring来创建
       		id:给对象在容器中提供一个唯一标识。用于获取对象
		   	class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数
	-->
    <bean id="userDao" class="com.by.dao.UserDaoImpl"></bean>
    <bean id="userService" class="com.by.service.UserServiceImpl" scope="singleton" autowire="byType">
    </bean>



</beans>

2.3.3测试

java 复制代码
package com.by.web;

import com.by.dao.UserDao;
import com.by.service.UserService;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ContextResource;

public class Client {
    public static void main(String[] args) {
  /**
         * bean的五种作用范围
         */
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        for (int i = 0; i < 5; i++) {
            UserService userService = context.getBean("userService", UserService.class);
            System.out.println(userService);
        }
    }
}

2.3.4结果

2.4测试原型模式(多例)prototype

2.4.1service

java 复制代码
package com.by.service;

import com.by.dao.UserDao;
import com.by.dao.UserDaoImpl;

public class UserServiceImpl implements UserService{
    private UserDao userDao;
   private String msg;


    public UserServiceImpl() {
        System.out.println("测UserServiceImpl对象创建了...");
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public UserServiceImpl(UserDao userDao, String msg) {
        this.userDao = userDao;
        this.msg = msg;
    }

    @Override
    public void adduser() {
        System.out.println(userDao+"============"+msg);
           userDao.adduser();
    }
}

2.4.2 applicationContext.xml

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.xsd">

    <!--
		2、把对象交给spring来创建
       		id:给对象在容器中提供一个唯一标识。用于获取对象
		   	class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数
	-->
    <bean id="userDao" class="com.by.dao.UserDaoImpl"></bean>
    <bean id="userService" class="com.by.service.UserServiceImpl" scope="prototype" autowire="byType">
    </bean>



</beans>

2.4.3测试

java 复制代码
package com.by.web;

import com.by.dao.UserDao;
import com.by.service.UserService;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ContextResource;

public class Client {
    public static void main(String[] args) {
  /**
         * bean的五种作用范围
         */
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        for (int i = 0; i < 5; i++) {
            UserService userService = context.getBean("userService", UserService.class);
            System.out.println(userService);
        }
    }
}

2.4.4结果

3.bean的生命周期

3.1单例bean

3.1.1service

java 复制代码
package com.by.service;

import com.by.dao.UserDao;
import com.by.dao.UserDaoImpl;

public class UserServiceImpl implements UserService{
    private UserDao userDao;
   private String msg;


    public UserServiceImpl() {
        System.out.println("测UserServiceImpl对象创建了...");
    }
    /**
     *
     */

    public void setUserDao(UserDao userDao) {
        System.out.println("使用set注入....");
        this.userDao = userDao;
    }
    public void init(){
        System.out.println("初始化bean....");
    }
    public void destroy(){
        System.out.println("销毁bean....");
    }
@Override
    public void adduser() {
        System.out.println(userDao+"============"+msg);
           userDao.adduser();
    }
}

3.1.2applicationContext.xml

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.xsd">

    <!--
		2、把对象交给spring来创建
       		id:给对象在容器中提供一个唯一标识。用于获取对象
		   	class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数
	-->
    <bean id="userDao" class="com.by.dao.UserDaoImpl"></bean>
<!--    <bean id="userService" class="com.by.service.UserServiceImpl" scope="prototype" autowire="byType">-->
    <bean id="userService" class="com.by.service.UserServiceImpl" scope="singleton"
          init-method="init" destroy-method="destroy" autowire="byType">
   </bean>



</beans>

3.1.3测试

java 复制代码
package com.by.web;

import com.by.dao.UserDao;
import com.by.service.UserService;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ContextResource;

public class Client {
    public static void main(String[] args) { 
 /**
         * bean的生命周期
         * 单例模式的周期:[容器启动时]--》set方法注入-->构造方法(实例化对象)--->init(初始化)---》[关闭容器]---》destory(销毁)
         * 多例模式的周期:使用对象时---》set方法注入---》构造方法(实例化对象)---->init(初始化)----》jvm销毁对象,释放内存----》destroy(销毁)
         */
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 关闭容器
        context.close();
        // context.getBean("userService", UserService.class);


    }
}

3.1.4结果

3.2原型模式、多例bean

3.2.1service

java 复制代码
package com.by.service;

import com.by.dao.UserDao;
import com.by.dao.UserDaoImpl;

public class UserServiceImpl implements UserService{
    private UserDao userDao;
   private String msg;


    public UserServiceImpl() {
        System.out.println("测UserServiceImpl对象创建了...");
    }
    /**
     *
     */

    public void setUserDao(UserDao userDao) {
        System.out.println("使用set注入....");
        this.userDao = userDao;
    }
    public void init(){
        System.out.println("初始化bean....");
    }
    public void destroy(){
        System.out.println("销毁bean....");
    }
@Override
    public void adduser() {
        System.out.println(userDao+"============"+msg);
           userDao.adduser();
    }
}

3.2.2applicationContext.xml

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.xsd">

    <!--
		2、把对象交给spring来创建
       		id:给对象在容器中提供一个唯一标识。用于获取对象
		   	class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数
	-->
    <bean id="userDao" class="com.by.dao.UserDaoImpl"></bean>
<!--    <bean id="userService" class="com.by.service.UserServiceImpl" scope="prototype" autowire="byType">-->
    <bean id="userService" class="com.by.service.UserServiceImpl" scope="prototype"
          init-method="init" destroy-method="destroy" autowire="byType">
   </bean>



</beans>

3.2.3测试

java 复制代码
package com.by.web;

import com.by.dao.UserDao;
import com.by.service.UserService;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ContextResource;

public class Client {
    public static void main(String[] args) { 
 /**
         * bean的生命周期
         * 单例模式的周期:[容器启动时]--》set方法注入-->构造方法(实例化对象)--->init(初始化)---》[关闭容器]---》destory(销毁)
         * 多例模式的周期:使用对象时---》set方法注入---》构造方法(实例化对象)---->init(初始化)----》jvm销毁对象,释放内存----》destroy(销毁)
         */
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 关闭容器
       // context.close();
        context.getBean("userService", UserService.class);


    }
}

3.2.4结果

3.3总结

spring bean的生命周期

1、单例

容器启动---->构造方法(实例化)----->set方法(注入)----->init方法(初始化)---->容器关闭---->destroy方法(销毁)

2、多例

使用对象---->构造方法(实例化)----->set方法(注入)----->init方法(初始化)---->jvm垃圾回收--->destroy方法(销毁)

相关推荐
ScilogyHunter15 分钟前
Hercules系列安全MCU功能安全原理详解
java·单片机·安全·hercules
IT_陈寒16 分钟前
JavaScript实战技巧总结:深挖数组遍历的性能陷阱与实战解法
前端·人工智能·后端
博风34 分钟前
eclipse中配置maven,以及在本地使用maven。
java·eclipse·maven
云-缩影35 分钟前
实际项目中怎么选排序算法:从面试题到工程落地
java·算法·排序算法
追星星の人37 分钟前
java web项目(eclipse软件)全流程备份
java·servlet
OxYGC37 分钟前
[工程] PHP2Shell 漏洞解析:两条 PHP 内核 RCE,为什么应用层的防护全部失效
android·开发语言·php
小徐不徐说40 分钟前
数据库存储基础:理解表结构、主键、事务与 BLOB
开发语言·数据库·c++·qt·程序设计
草莓熊Lotso1 小时前
【C++ 基于微服务的即时通讯系统】网关基建:cpp-httplib 与 WebSocketpp 从入门到实战
linux·开发语言·数据库·c++·redis·微服务·云原生
李纲明1 小时前
WordPress 媒体库上传失败或一直转圈:先核 PHP 上传限制与目录权限,再查安全插件与对象存储
运维·开发语言·安全·php·wordpress·媒体库·devdiy
文丑颜不良啊2 小时前
LeetCode1461~1480题目解析
java·leetcode