spring创建bean的三种方式

简介: spring创建bean的三种方式

引言



近几年在java web项目中到处都是spring的身影,的确spring的出现给我的编程带来了翻天覆地的变化,尤其是在AOP出现以后spring的地位更是独占鳌头了,所以对于java小白的小编来说spring是个学习的必经之路,下面就现在总结一些,spring 创建bean的三种方式


1、调用构造器来创建bean


首先在在application.xml文件中配置下面代码

<bean id="helloWorld" class="com.itheima.spring.helloword.Helloword"></bean>

具体类中的代码

package com.itheima.spring.helloword;
public class Helloword {
  public Helloword() {
    System.out.println("new instance");
  }
  public void hello() {
    System.out.println("hello word");
  }
}

测试代码:


  @Test
  public void springCreateObject_default() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    Helloword helloword = (Helloword) context.getBean("helloWorld");
    helloword.hello();
  }

代码的执行过程如下:


  1、程序创建BeanFactory实例


  2、调用Helloword.java类默认的构造器创建默认实例


  3、根据配置文件注入依赖关系,先实例化依赖bean,然后将依赖bean注入


  4、返回一个完整的javabean实例


2、调用静态工厂创建bean


application.xml文件配置:

          <bean id="helloWorld2" 
    class="com.itheima.spring.helloword.HelloWordFactory" 
    factory-method="getInstance"></bean>

静态工厂代码:

package com.itheima.spring.helloword;
public class HelloWordFactory {
  public static Helloword getInstance() {
    return new Helloword();
  }
}

测试代码:

        @Test
  public void springCreateObject_factory() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    Helloword helloword = (Helloword) context.getBean("helloWorld2");
    helloword.hello();
  }

代码的执行过程:


使用静态工厂方法创建bean实例时,class属性确定静态工厂类,而不是该bean的类。spring需要知道哪个静态工厂方法创建的bean实例,使用factory-method属性来确定方法名。Spring调用工厂方法(也包含一组参数),并返回一个有效的对象。之后,bean实例的使用与采用其他方法创建的完全一样。如果静态工厂方法需要参数,使用<constructor-arg>元素传入。class元素不再是bean的实现类,而是静态工厂类; 必需有factory-method属性确定产生实例的静态工厂方法; 静态工厂方法需要参数,则使用<constructor -arg>元素确定静态工厂方法.


 3、调用实例工厂创建bean application.xml配置代码:


         <bean id="helloWorldFactory" class="com.itheima.spring.helloword.HelloWordFactory2"></bean>  
  <bean id="helloWorld3" factory-bean="helloWorldFactory" factory-method="getInstance" ></bean>


实例工厂代码:

package com.itheima.spring.helloword;
public class HelloWordFactory2 {
  public Helloword getInstance() {
    return new Helloword();
  }
}

测试代码:

       @Test
  public void springCreateObject_instanceFactory() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    Helloword helloword = (Helloword) context.getBean("helloWorld3");
    helloword.hello();
  }

代码执行过程:


通过实例工厂方法创建bean时,bean元素不能含有class属性.因为BeanFactory不再直接实例化该bean,BeanFactory仅仅执行工厂的方法,工厂的方法返回bean实例.采用实例工厂方法创建bean应指定如下两个属性.工厂bean的id,该id属性应该对应spring容器中的一个bean 工厂方法名,该方法可产生bean实例. 与静态工厂方法相似,如果需要在调用工厂方法时传入参数,使用<constructor-arg>元素确定参数值



小结


 一、使用类构造器实例化:通过bean的缺省构造函数

(org.springframework.beans.factory.support.DefaultListableBeanFactory)默认创建,当各个bean的业务逻辑相互比较独立的时候或者和外界关联较少的时候可以使用。


二、静态工厂方法实例化:


利用静态factory方法创建,可以统一管理各个bean的创建,如各个bean在创建之前需要相同的初始化处理,则可用这个factory方法险进行统一的处理等等。


三、实例工厂方法实例化:


利用实例化factory方法创建,即将factory方法也作为了业务bean来控制,觉得1可用于集成其他框架的bean创建管理方法,2能够使bean和factory的角色互换。

目录
相关文章
|
6天前
|
安全 Java Spring
Spring框架中的单例Bean是线程安全的吗?
Spring框架中的单例Bean是线程安全的吗?
10 1
|
6天前
|
XML 前端开发 Java
【JavaEE】深入了解Spring中Bean的可见范围(作用域)以及前世今生(生命周期)
【JavaEE】深入了解Spring中Bean的可见范围(作用域)以及前世今生(生命周期)
10 0
|
6天前
|
存储 缓存 Java
【JavaEE】Spring中注解的方式去获取Bean对象
【JavaEE】Spring中注解的方式去获取Bean对象
3 0
|
6天前
|
存储 Java 对象存储
【JavaEE】Spring中注解的方式去存储Bean对象
【JavaEE】Spring中注解的方式去存储Bean对象
9 0
|
6天前
|
存储 Java 对象存储
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
9 0
|
6天前
|
消息中间件 安全 Java
在Spring Bean中,如何通过Java配置类定义Bean?
【4月更文挑战第30天】在Spring Bean中,如何通过Java配置类定义Bean?
22 1
|
6天前
|
XML Java 数据格式
Spring Bean
【4月更文挑战第30天】Spring Bean
17 0
|
6天前
|
前端开发 Java 数据格式
【Spring系列笔记】定义Bean的方式
在Spring Boot应用程序中,定义Bean是非常常见的操作,它是构建应用程序的基础。Spring Boot提供了多种方式来定义Bean,每种方式都有其适用的场景和优势。
37 2
|
6天前
|
XML Java 数据格式
谈谈 Spring 中 Bean 的生命周期?
谈谈 Spring 中 Bean 的生命周期?
20 1
|
6天前
|
XML Java 数据格式
Spring Bean的定义(含创建Bean的三种方式)
Spring Bean的定义(含创建Bean的三种方式)