Spring基于XML装配bean的三种实例化方式

说明

好久没有写博客了,觉得一个星期至少写一篇吧,所以就动手了,而且我Spring的基础不行呀,毕竟看视频自学都是很杂的,有时候听的课都不是很系统的,所以导致有些知识点不全什么的,所以在真正实践起来发现自己的问题之后又要重新学一遍,确实没有人指导你学习的方向走的弯路会比较多。不过不怕,大不了回头重新来,而且有些知识点再听一遍跟你听第一遍的感觉完全是不一样的,会感觉轻松很多,又理解得更深刻了。

实例化方式

首先我们应该知道Spring中基于XML装配bean时有三种实例化方式,分别是

  1. 默认构造
  2. 静态工厂
  3. 实例工厂
    下面就一个个来说一下,具体说第二,三方式

service及service实现类

在这里我们先有一个UserService以及UseServiceImpl类
待会我们会通过装配bean得到UseService类的一个实例
首先是UserService的接口代码

package com.shanmu;

interface UserService{
	void saveUser();
}

下面是UseServiceImpl实现了UserService接口

package com.shanmu;

public class UseServiceImpl implements UserService{

	@Override
	public void saveUser(){
		System.out.print("i am a user");
	}
}

这里就不去写一个User类了,所以直接输出就可以了。

默认构造

我们一般采用Spring构造bean的时候都是采用在spring.xml(src目录下的配置文件,这里我取名为spring)中通过bean标签配置,一般刚入门的人会采用下面的配置方法来得到一个UseServiceImpl实例

<bean name=“userService” class="com.shanmu.UseServiceImpl"></bean>

这样的话在我们的主程序中就可以直接通过得到bean的方式来得到UseServiceImpl实例,这里写一个main函数

package com.shanmu

public class TestMain(){

	public static void main(String[] args){
		//不采用spring
		UserService userService =new UseServiceImpl();
		userService.saveUser();

	    //采用spring默认构造方法
		ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
		UserService userService =(UserService)context.getBean("userService");
		userService.saveUser();
	}
}

所以,我们知道spring就是用来帮我们创建对象的

静态工厂

静态工厂是用于生成实例对象的,工厂类中的所有方法必须是静态的
首先我们需要一个工厂类,这个工厂类中有一个静态方法帮我们得到了UseServiceImpl实例,所以我们后面只需要直接调用静态方法即可
下面是工厂类,通过这个类我们就可以得到UserService

package com.shanmu;

public class MyBeanFactory(){
	public static UserService createService(){
		return new UserServiceImpl();
	}
}

所以在spring.xml中可以这样配置

<bean name=“userService” class="com.shanmu.MyBeanFactory" factory-method="CreateService">
</bean>

下面是TestMain,同样会有使用spring以及不使用spring的对比

package com.shanmu

public class TestMain(){

	public static void main(String[] args){
		//不采用spring
		UserService userService=MyBeanFactory.createService();
		userService.saveUser();

	    //采用spring默认构造方法
		ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
		UserService userService =(UserService)context.getBean("userService");
		userService.saveUser();
	}
}

实例工厂

实例工厂一样是需要有一个工厂类,但是与静态工厂不一样的地方在于里面的方法都是“非静态的”,所以我们需要得到一个工厂类的实例才能得到一个UseServiceImpl实例
下面看一下实例工厂的代码

package com.shanmu;

public class MyBeanFactory(){
	public UserService createService(){
		return new UserServiceImpl();
	}
}

我们需要在spring.xml中这样配置

<bean name=“myBeanFactory” class="com.shanmu.MyBeanFactory">
</bean>
<bean name=“userService” factory-bean="myBeanFactory" factory-method="createService">
</bean>

下面写一个TestMain方法

package com.shanmu

public class TestMain(){

	public static void main(String[] args){
		//不采用spring
		MyBeanFactory myBeanFactory=new MyBeanFactory();
		UserService userService=myBeanFactory.createService();
		userService.saveUser();

	    //采用spring默认构造方法
		ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
		UserService userService =(UserService)context.getBean("userService");
		userService.saveUser();
	}
}

结果

i am a user

分析

会发现在我们修改bean的三种实例化方式的时候,使用spring方式的TestMain方法其实一直都没有什么变化,变化的一直都是不使用spring方式的TestMain方法。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值