博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring- 通过Xml的方式完成Bean的实例化
阅读量:7101 次
发布时间:2019-06-28

本文共 3358 字,大约阅读时间需要 11 分钟。

传统应用程序可以通过反射方式进行实例化Bean,而Spring Ioc 容器则需要根据Bean定义的配置元数据使用反射机制来创建Bean。在Spring Ioc 容器中主要有以下几种创建Bean实例的方式:

使用构造器实例化Bean

使用静态工厂方式实例化Bean

使用实例工厂方法实例化Bean

 

使用空构造器实例化时,该类必须含有空参构造器,如果不存在的话在实例化过程中将会抛出异常。

样例结构

 

HelloWorld接口

package com.zc.spring.chapter04.instance;public interface HelloWorld {	public void sayHello();}

接口实现类

package com.zc.spring.chapter04.instance;public class HelloWorldImpl implements HelloWorld {	private String message;		/**	 * 空构造器	 */	public HelloWorldImpl() {		this.message = "hello world!";	}	/**	 * 带参构造器	 * @param message	 */	public HelloWorldImpl(String message) {				this.message = message;	}	@Override	public void sayHello() {		System.out.println(message);	}}

src下的conf/conf-instance.xml

  静态工厂

使用静态工厂的方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean的方法,而且使用静态工厂方法也允许指定方法参数,Spring Ioc容器将调用此属性指定的方法来获取Bean。

package com.zc.spring.chapter04.instance;public class HelloWorldStaticFactory {	/**	 * 工厂方法	 * @param message	 * @return	 */	public static HelloWorld newInstance(String message) {		//返回需要的Bean实例		return new HelloWorldImpl(message);	}}

  实例工厂

使用实例工厂方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,而且使用实例化工厂方法允许指定方法参数,方式和使用构造器方式一样。

package com.zc.spring.chapter04.instance;public class HelloWorldInstanceFactory {	/**	 * 工厂方法	 * @param message	 * @return	 */	public HelloWorld newInstance(String message) {		// 返回需要的Bean实例		return new HelloWorldImpl(message);	}}

  Main

package com.zc.spring.chapter04.instance;import org.springframework.beans.factory.BeanFactory;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {	public static void main(String[] args) {		sayHelloWithNoArgs();		sayHelloWithArgs();		sayHelloStaticFactory();		helloWorldInstanceFactory();	}		//使用无参数构造器来实例化Bean	public static void sayHelloWithNoArgs() {		BeanFactory beanFactory =  new ClassPathXmlApplicationContext("conf/conf-instance.xml");		HelloWorld helloWorld = beanFactory.getBean("helloWorldWithNoArgs",HelloWorld.class);		helloWorld.sayHello();	}		//使用有参数构造器来实例化Bean	public static void sayHelloWithArgs() {		BeanFactory beanFactory =  new ClassPathXmlApplicationContext("conf/conf-instance.xml");		HelloWorld helloWorld = beanFactory.getBean("helloWorldWithArgs",HelloWorld.class);		helloWorld.sayHello();	}		//使用静态工厂方法来实例化Bean	public static void 	sayHelloStaticFactory() {		// 1.读取配置文件实例化一个IOC容器		BeanFactory beanFactory =  new ClassPathXmlApplicationContext("conf/conf-instance.xml");				// 2.从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”		HelloWorld helloWorld = beanFactory.getBean("helloWorldStaticFactory",HelloWorld.class);				// 3.执行业务逻辑		helloWorld.sayHello();	}		// 使用实例工厂方法来实例化Bean 	public static void helloWorldInstanceFactory() {		// 1.读取配置文件实例化一个IOC容器		BeanFactory beanFactory =  new ClassPathXmlApplicationContext("conf/conf-instance.xml");						// 2.从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”		HelloWorld helloWorld = beanFactory.getBean("helloWorldInstance",HelloWorld.class);						// 3.执行业务逻辑		helloWorld.sayHello();	}}

  

 

转载于:https://www.cnblogs.com/RzCong/p/9127591.html

你可能感兴趣的文章
好程序员分享如何看待CSS中BEM的命名方式?
查看>>
国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
查看>>
如何实现多云成本的管理
查看>>
切入物流分拣市场,3D机器视觉还有多长的路要走?
查看>>
度小满获南京银行三年100亿元授信额度,双方并合作共同发力消费金融
查看>>
自动化运维工具Ansible的简单使用
查看>>
zabbix添加端口监控
查看>>
基本形态学算法
查看>>
PostgreSQL 11 1Kw TPCC , 1亿 TPCB 7*24 强压耐久测试
查看>>
修改toolbar自适应报表宽度
查看>>
Linux基础命令---chkconfig
查看>>
企业网站需要什么样内容才能满足和吸引到用户?
查看>>
关于 Java NIO Buffer 使用的详细解读
查看>>
以太坊系列之十三: evm指令集
查看>>
9、MySQL函数
查看>>
Scala的类层级讲解
查看>>
微信api 源码分享
查看>>
博客计划【推荐系统】
查看>>
iptables杂记
查看>>
orm2 中文文档 3.1 模型属性
查看>>