文档章节

Spring创建bean实例

雷速
 雷速
发布于 2017/05/31 14:20
字数 606
阅读 12
收藏 0

前言

本文是博文 《Spring创建bean的几种方法》 的实例补充,创建bean的知识概念可以从上文中看到


测试环境

测试用例使用spring-maven搭建web服务,因此启动服务时,我们默认直接启动spring容器,xml里面配置<load-on-startup>,如下

  	<!-- 配置spring -->
	<servlet>
		<servlet-name>spring</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	  	<init-param>  
	    	<param-name>contextConfigLocation</param-name>  
	    	<!--默认是:<param-value>/WEB-INF/classes/[servlet-name]-servlet.xml</param-value>-->
	   		<param-value>classpath*:/spring-mvc.xml</param-value>
		</init-param>  
		<load-on-startup>1</load-on-startup>
	</servlet>

    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>  

XML配置

**构造器 +property **

基础class是**XMLCreateBean ** ,以此类创建bean

package org.create.bean.test;

import org.springframework.beans.factory.BeanNameAware;

public class XMLCreateBean implements BeanNameAware {
	
	private String field;

	public XMLCreateBean(String arg) {
		
		field = arg;
	}
	
	
	@Override
	public void setBeanName(String name) {
		
		System.out.println(name + " bean创建 , 参数field == " + field);
	}
}

xml中配置:

	<bean id="xmlBeanConstructor" class="org.create.bean.test.XMLCreateBean">
    	<constructor-arg value="xml-constructor"/>
    </bean>
    
    <bean id="xmlBeanProperty" class="org.create.bean.test.XMLCreateBean">
    	<constructor-arg value="xml-set"/>
    </bean>

启动服务器,可以看到日志结果:

构造器 +property创建bean

静态工厂方法

基础class还是上面的 **XMLCreateBean ** , static工厂方法如下:

package org.create.bean.test;

public class XMLFactoryMethodBean {
	
	public static XMLCreateBean factoryMethod(String arg) {
		
		return new XMLCreateBean(arg);
	}
}

xml配置factory-method如下:

    <bean id="xmlFactoryMethod" class="org.create.bean.test.XMLFactoryMethodBean" factory-method="factoryMethod">
    	<constructor-arg value="xml-factory-bean"/>
    </bean>

启动服务,日志结果:

静态工厂方法

实例方法

基础class还是上面的 XMLCreateBean ** ,实例方法写在XMLFactoryMethodBean ** 中, 如下:

package org.create.bean.test;

public class XMLFactoryMethodBean {
	
	public static XMLCreateBean factoryMethod(String arg) {
		
		return new XMLCreateBean(arg);
	}

	
	public XMLCreateBean beanMethod(String arg) {
		
		return new XMLCreateBean(arg);
	}
	
}

xml配置如下,调用XMLFactoryMethodBean的beanMethod()方法创建了bean:

    <bean id="factoryBean" class="org.create.bean.test.XMLFactoryMethodBean"/>
    <bean id="xmlBeanMethod" factory-bean="factoryBean" factory-method="beanMethod">
    	<constructor-arg value="xml-bean-method"/>
    </bean>

启动服务,日志结果:

实例方法

FactoryBean

生成bean的class,编写为**FactoryBeanImpl **,如下

package org.create.bean.test;

import org.springframework.beans.factory.FactoryBean;

public class FactoryBeanImpl implements FactoryBean<XMLCreateBean> {

	@Override
	public XMLCreateBean getObject() throws Exception {
		
		return new XMLCreateBean("factoryBean");
	}

	@Override
	public Class getObjectType() {
		return null;
	}

	@Override
	public boolean isSingleton() {
		return false;
	}
}

可以看到,FactoryBeanImpl 实现了FactoryBean<>的接口;最终要生成的bean,还是 **XMLCreateBean **。

为了测试,我重新写了一个类AppMain,实现ApplicationContextAware接口,完成从spring容器获取对应bean

package org.create.bean.test;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class AppMain implements ApplicationContextAware{

	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		
		XMLCreateBean xmlCreateBean = (XMLCreateBean) applicationContext.getBean("factoryBean");
		System.out.println(xmlCreateBean.getField());;
	}
}

xml配置如下

    <bean id="factoryBean" class="org.create.bean.test.FactoryBeanImpl"></bean>
    
    <bean id="appMain" class="org.create.bean.test.AppMain"/>

启动服务,日志结果

FactoryBean

我在测试时,发现使用 @Autowired 注解注入FactoryBean方式的bean,会出现类型转换错误或者null的情况,因为@Autowired 是根据byType的方式注入的,可能会出问题。因此最好使用 @Resource(name="XXX")的方式去注入

© 著作权归作者所有

共有 人打赏支持
雷速
粉丝 0
博文 15
码字总数 12115
作品 0
深圳
程序员
Spring温故而知新 - bean的装配

按条件装配bean 就是当满足特定的条件时Spring容器才创建Bean,Spring中通过@Conditional注解来实现条件化配置bean package com.sl.ioc;import org.springframework.context.annotation.Bean;...

Java-老刘
05/07
0
0
《Spring5学习》 01 装配Bean之自动化装配

Spring的自动化装配就便利性方面远远优于其他装配方法,这也是业界目前主要采用的Bean装配机制。Spring基于组建扫描和自动装配实现自动化装配,能将用户的显示配置降到最低。以下通过一段代码...

老韭菜
08/05
0
0
Spring使用静态工厂方法创建Bean

使用静态工厂方法创建Bean 使用静态工厂方法创建Bean实例时,class属性也必须指定,但此时class属性并不是指定Bean实例的实现类,而是静态工厂类。因为Spring需要知道是用哪个工厂来创建Bea...

摆渡者
2014/03/04
0
4
Spring中bean的作用域

Bean简介: 在Spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与...

Robinson_lu
2015/06/17
0
0
Spring基础知识汇总 Java开发必看

Spring简介 Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关...

像风一样i
08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux命令备忘录: jobs 显示Linux中的任务列表及任务状态命令

jobs命令用于显示Linux中的任务列表及任务状态,包括后台运行的任务。该命令可以显示任务号及其对应的进程号。其中,任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的...

开元中国2015
46分钟前
1
0
springboot Whitelabel Error Page(Not Found)解决方案

当出现上图图的错误时注意 报错信息 There was an unexpected error (type=Not Found, status=404). Not Found代表未访问到资源 解决方案:比较访问路径和代码的路径有没有写错 正确的访问路...

斩神魂
46分钟前
2
0
记一次hbase master停止服务的原因以及恢复

在Hdfs空间不足的情况下,拒绝写入,hbase会down掉。如果hdfs空间没有清理的情况下,重新启动hbase,会报splitlog失败,原因是wal日志重写过程中会写hdfs,写不进去导致的。重启不成功。 解决...

PageYi
50分钟前
1
0
如何从平面设计转行到UI设计?

时代的变迁,科技的进步,工具的发展,薪资的差距,促使许多人转行的原因,但平面与界面两者之间有着哪些的差异呢?如果,想要转行又该具备哪些条件呢? 平面、界面设计之间的差异性 平面设计...

mo311
53分钟前
4
0
线程池整理

一般在生产环境中,我们都不会直接new一个Thread,然后再去start(),因为这么做会不断频繁的创建线程,销毁线程,过大的线程会耗尽CPU和内存资源,大量的垃圾回收,也会给GC带来压力,延长GC停顿时间...

算法之名
55分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部