Spring的IOC容器实例化bean的方式总结

 更新时间:2024年01月08日 10:56:36   作者:菜鸟numberone  
IOC容器实例化bean的三种方式:构造方法、静态工厂、实例工厂,本文将通过代码示例给大家详细讲解一下这三种方式,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

IOC容器实例化bean的三种方式:构造方法、静态工厂、实例工厂。 本文章涉及工程目录如下:

IOC容器实例化bean的三种方式

构造方法

对象在new的时候通过构造方法完成实例化。bean本质是对象,也可以通过构造方法完成实例化。

涉及代码片

// applicationContext.xml
<bean id="flowService" class="com.lwb.services.impl.FlowServiceImpl">
// FlowServiceImpl.java
public class FlowServiceImpl implements FlowService {
    private FlowServiceImpl(){
        System.out.println(this.getClass() + "-----进入FlowServiceImpl" +
                "无参构造器");
    }
    @Override
    public void saveService() {
        System.out.println(this.getClass() + "-----进入FlowServiceImpl");
    }
}
// App.java
public class App {
    public static void main(String[] args){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}

执行后返回结果:

思考:

1、构造方法底层是通过反射机制实现的。注意上面无参构造方法是private,只有反射才能访问到私有方法。

2、底层使用的是无参构造方法。可以写一个带参的构造方法进行验证,会报错。

静态工厂

涉及代码片

// applicationContext.xml
<!--静态工厂实例化方法
        class为静态工厂类路径,factory-method 为方法名
    -->
    <bean id="flowDao1" class="com.lwb.factory.FlowDaoStaticFactory" factory-method="getFlowDao"/>
// FlowDaoStaticFactory.java
//注意getFlowDao是static的,所以叫静态工厂
public class FlowDaoStaticFactory {
     public static FlowDao getFlowDao(){
        System.out.println("-----进入静态工厂方法StaticFactory");
        return new FlowDaoImpl();
    }
}
// App.java
public class App {
    public static void main(String[] args){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}

执行后返回结果:

思考:

1、为什么使用静态工厂方法,而不直接去new? 静态工厂方法在返回new的对象实例之前,可以实现一些业务逻辑,如代码中的日志输出。

实例工厂

涉及代码片

// applicationContext.xml
	<bean id="flowDaoExFactory" class="com.lwb.factory.FlowDaoExFactory"/>
    <bean id="flowDao2" factory-method="getFlowDao" factory-bean="flowDaoExFactory"/>
// FlowDaoExFactory .java
//注意getFlowDao是public的,对比静态工厂
public class FlowDaoExFactory {
    public FlowDao getFlowDao(){
        System.out.println(this.getClass() + "------进入实例工厂类FlowDaoExFactory");
        return new FlowDaoImpl();
    }
}
// App.java
public class App {
    public static void main(String[] args){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}

执行后返回结果:

思考:

1、静态工厂和实例工厂的区别?

静态工厂方法是static的,是在类加载的时候就创建了,可以直接使用,不需要实例化工厂类。实例工厂是public的,需要先实例化,才能使用。静态工厂适合实时性很高的场景。实际场景中大部分使用实例工厂。

2、实例工厂的简单写法——FactoryBean

涉及代码片。

// applicationContext.xml
	<bean id="flowDao3" class="com.lwb.factory.FlowDaoFactoryBean"/>
// FlowDaoFactoryBean .java
public class FlowDaoFactoryBean implements FactoryBean<FlowDao> {
    //返回实例化对象
    @Override
    public FlowDao getObject() throws Exception{
        System.out.println(this.getClass() + "------进入实例工厂FlowDaoFactoryBean,getObject");
        return new FlowDaoImpl();
    }
    //返回class对象
    @Override
    public Class<?> getObjectType() {
        System.out.println(this.getClass() + "------进入实例工厂FlowDaoFactoryBean,getObjectType");
        return FlowDao.class;
    }
}
// App.java
public class App {
    public static void main(String[] args){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}

思考:

1、为什么只输出了getObject()里面的内容?getObject()重写了返回实例化对象的方法。getObjectType()返回的是class对象,只有在调用的时候才会执行(反射?)

2、FlowDaoFactoryBean可以通过重写isSingleton()方法声明是否是单例。

思考

1、上述例子中App.java为什么不获取bean(执行FlowDao flowDao = (FlowDao) ctx.getBean("flowDao3")),也能实例化?

IOC实例化bean对象的时机:

(1)IOC初始化的bean对象默认是单例的。单例+懒加载会在ioc容器初始化完成后直接实例化所有bean对象供使用。

(2)非单例和单例+非懒加载。在使用bean的时候才会去初始化。

以上就是Spring的IOC容器实例化bean的方式总结的详细内容,更多关于Spring IOC容器实例化bean的资料请关注脚本之家其它相关文章!

相关文章

  • 解决idea 拉取代码出现的 “ Сannot Run Git Cannot identify version of git executable: no response“的问题

    解决idea 拉取代码出现的 “ Сannot Run Git Cannot identify version of

    这篇文章主要介绍了解决idea 拉取代码出现的 “ Сannot Run Git Cannot identify version of git executable: no response“的问题,需要的朋友可以参考下
    2020-08-08
  • Java远程debug调试的操作步骤

    Java远程debug调试的操作步骤

    日常项目中,通常我们的代码都是部署到远程的服务器,有时线上出现了问题,经常需要我们增加一些日志来排查问题,但是如果是测试环境的场景下或者我们能进行远程调试的话,我们就可以使用远程的Debug方式进行远程调试,下面给大家介绍一下Java远程debug调试的操作步骤
    2025-04-04
  • Spring Boot CORS 配置方法允许跨域请求的最佳实践方案

    Spring Boot CORS 配置方法允许跨域请求的最佳实践方案

    跨域请求在现代Web开发中非常重要,特别是在涉及多个前端和后端服务时,本文详细介绍了跨域请求的背景、重要性以及如何解决跨域问题,通过SpringBoot框架的CORS配置,可以有效地处理跨域请求,确保数据传输的安全性和用户体验,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • java中的Io(input与output)操作总结(二)

    java中的Io(input与output)操作总结(二)

    这一节我们来讨论关于文件自身的操作包括:创建文件对象、创建和删除文件、文件的判断和测试、创建目录、获取文件信息、列出文件系统的根目录、列出目录下的所有文件,等等,感兴趣的朋友可以了解下
    2013-01-01
  • Java中的非对称加密算法原理与实现方式

    Java中的非对称加密算法原理与实现方式

    在当今的信息时代,数据安全已经成为了一个至关重要的问题,加密技术作为保障信息安全的重要手段,受到了广泛的应用和关注,本篇文章将详细介绍Java中的非对称加密算法原理及其实现方式,需要的朋友可以参考下
    2023-12-12
  • 浅谈为什么Java中1000==1000为false而100==100为true

    浅谈为什么Java中1000==1000为false而100==100为true

    这篇文章主要介绍了浅谈为什么Java中1000==1000为false而100==100为true,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java中Runnable和Thread的区别分析

    Java中Runnable和Thread的区别分析

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口,下面就拉分别介绍一下这两种方法的优缺点
    2013-03-03
  • 调用Process.waitfor导致的进程挂起问题及解决

    调用Process.waitfor导致的进程挂起问题及解决

    这篇文章主要介绍了调用Process.waitfor导致的进程挂起问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java中gradle项目报错org.gradle .api.plugins.MavenPlugin解决办法

    java中gradle项目报错org.gradle .api.plugins.MavenPlugin解决办法

    在使用Gradle时开发者可能会遇到org.gradle .api.plugins.MavenPlugin报错提醒,这篇文章主要给大家介绍了关于java中gradle项目报错org.gradle .api.plugins.MavenPlugin的解决办法,需要的朋友可以参考下
    2023-12-12
  • Spring事务失效的一种原因关于this调用的问题

    Spring事务失效的一种原因关于this调用的问题

    这篇文章主要介绍了Spring事务失效的一种原因关于this调用的问题,本文给大家分享问题原因及解决办法,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-10-10

最新评论