Spring中bean实例化的三种方式

举报
江南一点雨 发表于 2021/08/16 23:08:54 2021/08/16
【摘要】 之前我已经有好几篇博客介绍Spring框架了,不过当时我们都是使用注解来完成注入的,具体小伙伴可以参考这几篇博客(Spring&SpringMVC框架案例)。那么今天我想来说说如何通过xml配置来实例化bean,其实也很简单。 使用xml配置来实例化bean共分为三种方式,分别是普通构造方法创建、静态工厂创建、实例工厂创建,OK,那么接下来我们来分别看看这几种...

之前我已经有好几篇博客介绍Spring框架了,不过当时我们都是使用注解来完成注入的,具体小伙伴可以参考这几篇博客(Spring&SpringMVC框架案例)。那么今天我想来说说如何通过xml配置来实例化bean,其实也很简单。
使用xml配置来实例化bean共分为三种方式,分别是普通构造方法创建、静态工厂创建、实例工厂创建,OK,那么接下来我们来分别看看这几种方式。

普通构造方法创建

这种创建方式使我们使用最多的一种创建方式,直接配置bean节点即可,比如我有一个User类,如下:

public class User { public void add() { System.out.println("add()---------"); }
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5

然后通过简单配置一个bean节点就可以获取实例了,如下:

<bean class="org.sang.User" id="user"/>
  
 
  • 1

OK,我们通过如下代码进行一个简单的测试:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = (User) context.getBean("user"); System.out.println(user);
  
 
  • 1
  • 2
  • 3

运行输出结果如下:
这里写图片描述

静态工厂创建

除了通过普通的构造方法创建之外,我们也可以通过静态构造方法来创建一个bean的实例,假设我有一个类叫做User2,如下:

public class User2 { public void add() { System.out.println("add2()---------"); }
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5

我给它创建一个静态工厂,如下:

public class User2Factory { public static User2 getInstance() { return new User2(); }
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5

该工厂中有一个静态方法,该静态方法返回一个User2的实例,在Spring的配置文件中,我们看看如何生成User2的实例:

<bean id="user2" class="org.sang.User2Factory" factory-method="getInstance"/>
  
 
  • 1

还是bean节点,只是多了一个factory-method属性,该属性指明该类中的静态工厂方法名为getInstance,这样Spring框架就知道调用哪个方法来获取User2的实例了,测试代码如下:

@Test public void test2() { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User2 user = (User2) context.getBean("user2"); user.add(); }
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

测试结果如下:
这里写图片描述

值得强调的是,这种方法并不常用。

实例工厂创建

小伙伴们看了静态工厂创建bean实例肯定都觉得很麻烦,事实上还有比静态工厂更麻烦的写法,那就是通过实例工厂来创建bean实例。实例工厂,顾名思义,就是我们工厂中的方法不是静态的,比如说,我有一个实体类叫做User3,如下:

public class User3 { public void add() { System.out.println("add3()---------"); }
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5

然后我还有一个工厂方法,如下:

public class User3Factory { public User3 getUser3() { return new User3(); }
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5

小伙伴们看到,在User3Factory类中有一个getUser3的方法,该方法返回一个User3类的实例,但是该方法不是静态的,那么我们在Spring的配置文件中要进行怎样的配置才能获取User3的一个实例呢?如下:

<bean class="org.sang.User3Factory" id="user3Factory"/> <bean id="user3" factory-bean="user3Factory" factory-method="getUser3"/>
  
 
  • 1
  • 2

第一个bean用来获取user3Factory的实例,第二个bean则根据User3Factory的实例,然后指定factory-method,通过getUser3方法来获取User3的实例。
测试代码如下:

 @Test public void test3() { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User3 user = (User3) context.getBean("user3"); user.add(); }
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

测试结果如下:
这里写图片描述

OK,以上就是bean实例化的三种方式,最最常用的是第一种。

以上。

本文案例下载:
本文案例GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test28-Spring1

文章来源: wangsong.blog.csdn.net,作者:_江南一点雨,版权归原作者所有,如需转载,请联系作者。

原文链接:wangsong.blog.csdn.net/article/details/56021922

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。