Spring---bean的实例化
Spring IoC容器如何实例化Bean呢?传统应用程序可以通过new和反射方式进行实例化Bean。而Spring IoC 容器则需要根据Bean定义里的配置元数据使用反射机制来创建Bean。在Spring IoC 容器中主要有以下几种创建Bean实例的方式:
- 使用构造器实例化Bean
- 使用静态工厂方式实例化Bean
- 使用实例工厂方法实例化Bean
构造器实例化
构造器实例化 Bean 是最简单的方式,Spring IoC容器既能使用默认空构造器也能使用有参数构造器两种方式创建Bean
空构造器实例化:要求java Bean必须要有构造方法
- 空构造器实例化:
<bean id="helloServiceNoWithArgs" class="com.jike.***.HelloWorldImpl" />
- 有参数构造器实例化:
<bean id="helloServiceWithArgs" class="com.jike.***.HelloWorldmpl">
<!-- 指定构造器参数,index指定位置 -->
<constructor-arg index="0" value="Hello Spring!"/>
</bean>
静态工厂实例化
使用静态工厂的方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean的方法,而且使用静态工厂方法也允许指定方法参数,Spring IoC容器将调用此属性指定的方法来获取Bean
- <!--使用有参数构造参数-->
<bean id="helloServiceStaticFactory" class="com.jike.***.HelloWorldStaticFactory" factory-method="newInstance">
<!-- 指定构造器参数 -->
<constructor-arg index="0" value="Hello Static Factory!"/>
</bean>
实例工厂实例化
使用实例工厂方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样,配置如下:
<!-- 1、定义实例工厂Bean -->
<bean id="beanInstanceFactory" class="com.jike.***.HelloWorldInstanceFactory" />
<!-- 2、使用实例工厂Bean创建Bean -->
<bean id=“helloWorldInstance" factory-bean="beanInstanceFactory" factory-method="newInstance">
<constructor-arg index="0" value="Hello Instance Factory!"></constructor-arg>
</bean>
实例化示例
配置文件配置见上文
基础类HelloWord.java
public interface HelloWorld {
public void sayHello();
}
基础类HelloWordImpl.java
public class HelloWorldImpl implements HelloWorld {
private String message;
/**
* 空构造器
*/
public HelloWorldImpl() {
this.message = "Hello World!";
}
/**
* 带参构造器
*
* @param message
*/
public HelloWorldImpl(String message) {
this.message = message;
}
public void sayHello() {
System.out.println(message);
}
}
静态工厂实例化类HelloWorldInstanceFactory.java
public class HelloWorldStaticFactory {
/**
* 工厂方法
*
* @param message
* @return
*/
public static HelloWorld newInstance(String message) {
// 返回需要的Bean实例
return new HelloWorldImpl(message);
}
}
实例工厂实例化类HelloWorldStaticFactory.java
public class HelloWorldInstanceFactory {
/**
* 工厂方法
*
* @param message
* @return
*/
public HelloWorld newInstance(String message) {
// 返回需要的Bean实例
return new HelloWorldImpl(message);
}
}
程序入口类Main.java
public class Main {
public static void main(String[] args) {
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 helloWorldStaticFactory() {
// 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();
}
}
Spring---bean的实例化的更多相关文章
- 【Spring】Spring bean的实例化
Spring实现HelloWord 前提: 1.已经在工程中定义了Spring配置文件beans.xml 2.写好了一个测试类HelloWorld,里面有方法getMessage()用于输出" ...
- Spring源码解析(四)Bean的实例化和依赖注入
我们虽然获得了Bean的描述信息BeanDefinition,但是什么时候才会真正的实例化这些Bean呢.其实一共有两个触发点,但是最后实际上调用的是同一个方法. 第一个:在AbstractAppli ...
- Spring bean的bean的三种实例化方式
Bean 定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的.bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象.这些 bean ...
- Spring8:一些常用的Spring Bean扩展接口
前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...
- Spring bean的作用域以及生命周期
一.request与session的区别 request简介 request范围较小一些,只是一个请求. request对象的生命周期是针对一个客户端(说确切点就是一个浏览器应用程序)的一次请求,当请 ...
- Spring中Bean的实例化
Spring中Bean的实例化 在介绍Bean的三种实例化的方式之前,我们首先需要介绍一下什么是Bean,以及Bean的配置方式. 如果 ...
- spring三种实例化bean的方式
1构造函数实例化 2静态工厂方法实例化 3实例工厂方法实例化 service接口: package service; public interface PersonService { public v ...
- Spring学习笔记之Bean的实例化
一.bean的实例化方法有3种, 1.构造器实例化 2.静态工厂方法实例化 3.实例工厂方法实例化 二.用构造器来实例化 <bean id="ShunDao" class=& ...
- Spring三种实例化Bean的方法
1.实例化bean的三种方法:(1) 构造器<!-- 体验1 --><bean id="personService" class="com.persia ...
- spring IOC容器实例化Bean的方式与RequestContextListener应用
spring IOC容器实例化Bean的方式有: singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在. prototype 每次从容器中调用Bean时, ...
随机推荐
- selenium googleDrive
http://chromedriver.storage.googleapis.com/index.html?path=2.1/下载地址 把googledriver.exe 放到google浏览器下目录 ...
- myVision云服务商业数据分析解决方案
类型: 定制服务 软件包: business intelligence internet retailing solution collateral 联系服务商 产品详情 解决方案 概要 2014年, ...
- 关于java中的hashcode和equals方法原理
关于java中的hashcode和equals方法原理 1.介绍 java编程思想和很多资料都会对自定义javabean要求必须重写hashcode和equals方法,但并没有清晰给出为何重写此两个方 ...
- mysql一些常用的查询语句总结
工作中会遇到一些比较有用的mysql查询语句,有了它,可以对mysql进行更全面的维护和管理,下面就写一下我记录的 1.按照字段ru_id查询dsc_order_goods表中ru_id出现次数由多到 ...
- PHP : url中出现乱码问题
例子: 在html中,将数据传到url中 当我点击“提交回复”后,跳转页面中将显示: 我们获取这个参数: 但是由于传过来的参数是中文,url会进行自动的解析成二进制的代码,那我们后台接受到的数据是解析 ...
- Illegal access:this web application instance has been stopped already
七月 23, 2014 2:34:35 下午 org.apache.catalina.loader.WebappClassLoader loadClass信息: Illegal access: thi ...
- 【HHHOJ】ZJOI2019模拟赛(十四)03.12 解题报告
点此进入比赛 得分: \(50+5+24=79\) 排名: \(Rank\ 2\) \(Rating\):\(+79\) \(T1\):[HHHOJ197]古明地(点此看题面) 基本上全部时间都用来想 ...
- 2018年Linux运维人员必会开源运维工具体系总结
操作系统:Centos,Ubuntu,Redhat,suse,Freebsd 网站服务:nginx,apache,lighttpd,php,tomcat,resin数据库:MySQL,MariaDB, ...
- 20145238-荆玉茗 《Java程序设计》第8周学习总结
20145238 <Java程序设计>第8周学习总结 教材学习内容总结 第15章 通用API 15.1.1 ·java.util.logging包提供了日志功能相关类与接口,使用日志的起点 ...
- ceph-对象存储
ceph对象存储 作为文件系统的磁盘,操作系统不能直接访问对象存储.相反,它只能通过应用程序级别的API访问.ceph是一种分布式对象存储系统,通过ceph对象网关提供对象存储接口,也称为RADOS网 ...