Spring——Spring IOC(2)

1.Spring中的工厂类

1.1 ApplicationContext

  • ApplicationContext的实现类,如下图:

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

1.2 BeanFactory

  • spring中工厂的类结构图

  • 区别:

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

      java 复制代码
      /**
       * 业务层实现类
       */
      public class UserServiceImpl implements UserService {
      
          private UserDao userDao;
      
          public UserServiceImpl() {
              System.out.println("UserServiceImpl对象创建了...");
          }
      
          public void setUserDao(UserDao userDao) {
              this.userDao = userDao;
          }
      
          public void addUser(){
              userDao.addUser();
          }
      }
      java 复制代码
      /**
       * 模拟表现层
       */
      public class Client {
          public static void main(String[] args) {
              new ClassPathXmlApplicationContext("applicationContext.xml");
              System.out.println("Spring IOC容器创建好了");
          }
      }
    复制代码
  • BeanFactory:是在 getBean 的时候才会创建对象。

    java 复制代码
    /**
     * 业务层实现类
     */
    public class UserServiceImpl implements UserService {
    
        private UserDao userDao;
    
        public UserServiceImpl() {
            System.out.println("UserServiceImpl对象创建了...");
        }
    
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    
        public void addUser(){
            userDao.addUser();
        }
    }
    java 复制代码
    /**
    * 模拟表现层
    */
    public class Client {
      public static void main(String[] args) {
          new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
          System.out.println("Spring IOC容器创建好了");
      }
    }

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的作用范围,其配置方式如下所示:

    xml 复制代码
    <bean id="..." class="..." scope="singleton"/>
  • 需要根据场景决定对象的单例、多例模式

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

    多例:Connection、SqlSession

3 bean的生命周期

3.1 单例bean

  • 案例

    xml 复制代码
    <bean id="userService" class="com.wt.service.UserServiceImpl"
          			scope="singleton" init-method="init" destroy-method="destroy">
    java 复制代码
    /**
     * 业务层实现类
     */
    public class UserServiceImpl implements UserService {
    
        private UserDao userDao;
    
        public UserServiceImpl() {
            System.out.println("调用构造方法创建bean...");
        }
    
        public void setUserDao(UserDao userDao) {
            System.out.println("调用set方法注入值...");
            this.userDao = userDao;
        }
    
        public void init(){
            System.out.println("调用init方法初始化bean...");
        }
    
        public void destroy(){
            System.out.println("调用destroy方法销毁bean...");
        }
    
        public void addUser(){
            userDao.addUser();
        }
    }
    java 复制代码
    /**
     * 模拟表现层
     */
    public class Client {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext ac = 
            	new ClassPathXmlApplicationContext("applicationContext.xml");
            //关闭容器
            ac.close();
        }
    }
  • 生命周期:

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

3.2 多例bean

  • 案例

    xml 复制代码
    <bean id="userService" class="com.wt.service.UserServiceImpl"
          			scope="prototype" init-method="init" destroy-method="destroy">
    java 复制代码
    /**
     * 业务层实现类
     */
    public class UserServiceImpl implements UserService {
    
        private UserDao userDao;
    
        public UserServiceImpl() {
            System.out.println("调用构造方法创建bean...");
        }
    
        public void setUserDao(UserDao userDao) {
            System.out.println("调用set方法注入值...");
            this.userDao = userDao;
        }
    
        public void init(){
            System.out.println("调用init方法初始化bean...");
        }
    
        public void destroy(){
            System.out.println("调用destroy方法销毁bean...");
        }
    
        public void addUser(){
            userDao.addUser();
        }
    }
    java 复制代码
    /**
     * 模拟表现层
     */
    public class Client {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext ac = 
                	new ClassPathXmlApplicationContext("applicationContext.xml");
            //使用对象
            ac.getBean("userService");
        }
    }
  • 生命周期:

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

相关推荐
MageGojo4 小时前
天气 API 接入实战:基于 ApiZero 实现实时天气、分钟级降水和 15 天预报查询
java·后端·spring·api 接口接入·接口实战
☆cwlulu5 小时前
Linux系统调用与C库I/O的底层奥秘
java·spring boot·spring
IT空门:门主7 小时前
Java AI 开发框架终极对比:Spring AI vs Spring AI Alibaba vs AgentScope-Java
java·人工智能·spring·spring ai·ai alibaba·agentscope-java
zzz_23688 小时前
【Spring】面试突击系列(三):Spring Web MVC 深度解析
前端·spring·面试
biubiubiu07068 小时前
SpringBoot 3.5.4 整合Quartz 定时任务
java·spring boot·spring
用户3983461612010 小时前
Go-Spring 实战第 18 课 —— App 使用:启动、配置与运行期扩展
spring·go
zzz_236810 小时前
【Spring】面试突击系列(一):IoC 与 DI 深度解析
java·spring·面试
RemainderTime10 小时前
Spring Boot脚手架集成 Spring Security实现生产级RBAC鉴权
spring boot·后端·spring
宸津-代码粉碎机10 小时前
Spring AI企业级Agent实战|多工具自动规划+并行调度落地,彻底解决复杂业务AI任务编排问题
java·大数据·人工智能·spring boot·python·spring
lixia0417mul211 小时前
flink接入spring体系
java·spring·flink