`
zhaojian0910
  • 浏览: 47700 次
社区版块
存档分类
最新评论

Spring笔记之Bean实例的创建方式以及依赖配置

阅读更多

Bean实例的创建通常有如下3中方式:

1、通过构造方法创建Bean

package com.test;
public class Person {
	public Person() {
		System.out.println("Person 构造方法");
	}

	private Hobby hobby;

	public void setHobby(Hobby hobby) {
		System.out.println("通过依赖关系注入");
		this.hobby = hobby;
	}

	public void singASong() {
		System.out.println(hobby.doIt());
	}
}

interface Hobby {
	public String doIt();
}

class Sing implements Hobby {
	public Sing() {
		System.out.println("Sing 构造方法");
	}

	public String doIt() {
		return "I am singing.";
	}
}

 

package com.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
		Person p = ctx.getBean("person", Person.class);
		p.singASong();
	}
}

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<bean id="person" class="com.test.Person">
	<property name="hobby" ref="hobbySing"></property>
</bean>

<bean id="hobbySing" class="com.test.Sing"></bean>
	
</beans>

 2、使用静态工厂方法创建Bean

 

package com.test2;

public class PersonCreator {
	public static People createPerson(String type) {
		if (type.equals("chn")) {
			return new Chinese();
		}
		if (type.equals("jpn")) {
			return new Japanese();
		}

		return null;
	}
}

 

package com.test2;

public interface People {
	public void say();
}

class Chinese implements People {

	public void say() {
		System.out.println("I am Chinese.");
	}

}

class Japanese implements People {

	public void say() {
		System.out.println("I am Japanese.");
	}

}

 工厂方法一定要static

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

	<!-- 静态工厂方法 -->
	<bean id="chinese" class="com.test2.PersonCreator" factory-method="createPerson">
		<constructor-arg value="chn" />
	</bean>
	<bean id="japanese" class="com.test2.PersonCreator" factory-method="createPerson">
		<constructor-arg value="jpn" />
	</bean>

</beans>

 

package com.test2;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		
		ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
		People chn = ctx.getBean("chinese", People.class);
		chn.say();
		People jpn = ctx.getBean("japanese", People.class);
		jpn.say();
		
	}
}

 输出:I am Chinese.

I am Japanese.

3、调用实例工厂方法创建Bean

注:实例工厂方法与静态工厂方法只有一点不同

静态工厂方法:只需使用工厂类即可,工厂方法必须static

实例工厂方法:必须使用工厂类的实例,工厂方法必须non-static

package com.test2;

public class PersonCreator {
	public People createPerson(String type) {
		if (type.equals("chn")) {
			return new Chinese();
		}
		if (type.equals("jpn")) {
			return new Japanese();
		}

		return null;
	}
}

 

package com.test2;

public interface People {
	public void say();
}

class Chinese implements People {

	public void say() {
		System.out.println("I am Chinese.");
	}

}

class Japanese implements People {

	public void say() {
		System.out.println("I am Japanese.");
	}

}

 

package com.test2;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		
		ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
		People chn = ctx.getBean("chinese", People.class);
		chn.say();
		People jpn = ctx.getBean("japanese", People.class);
		jpn.say();
		
	}
}

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
	
	<!-- 实例工厂方法 -->
	<bean id="creator" class="com.test2.PersonCreator"/>
	
	<bean id="chinese" factory-bean="creator" factory-method="createPerson">
		<constructor-arg value="chn" />
	</bean>
	
	<bean id="japanese" factory-bean="creator" factory-method="createPerson">
		<constructor-arg value="jpn" />
	</bean>

</beans>

 输出:

I am Chinese.

I am Japanese.

 

总结:大多数情况下,BeanFactory直接通过new关键字调用构造器来创建Bean实例,而class属性指定了Bean实例的实现类。因此,<bean .../>元素必须指定Bean实例的class属性,但这并不是唯一的实例化Bean的方法。

使用实例工厂方法创建Bean实例,以及使用子Bean方法创建Bean实例时,都可以不指定class属性。

 

分享到:
评论

相关推荐

    SSH笔记-静态/实例工厂方法配置bean

    在Spring框架中,Bean的创建方式多样,其中两种常见的非XML配置方式是通过静态工厂方法和实例工厂方法来创建Bean。这些方法为Spring容器提供了更灵活的Bean实例化策略,让我们深入了解一下这两种方法。 首先,静态...

    Spring笔记整理.zip

    构造注入通过构造函数注入依赖,确保在bean实例化时所有依赖都已就绪。setter注入则通过setter方法注入依赖,更加灵活,可以在bean实例化后进行调整。Spring支持两者,开发者可以根据需求选择合适的方式。 5. **...

    Spring学习笔记(6)----编码剖析Spring依赖注入的原理

    在具体实现中,Spring的`DefaultListableBeanFactory`类是Bean工厂的主要实现,它负责读取配置、创建Bean实例。在处理`@Autowired`时,`AutowiredAnnotationBeanPostProcessor`起着关键作用。这个类实现了Bean后...

    Sping学习笔记(2)----实例化Bean的三种方式

    在Spring框架中,实例化Bean是其核心功能之一,它为开发者提供了多种方式来创建和管理对象。这篇“Spring学习笔记(2)----实例化Bean的三种方式”着重讲解了如何在Spring应用上下文中初始化Bean。以下是这三种方式...

    Spring_IOC-v(上)笔记

    Spring_IOC-v(上)笔记是关于 Spring 框架中的 IoC(控制反转)技术的笔记,主要介绍了 IoC 的概念、依赖注入、Bean 的设置、Spring 组件的管理等知识点。 IoC 技术是 Spring 框架的核心概念之一,它的主要思想...

    spring学习之路(黑马课程笔记)

    Spring学习之路(黑马课程笔记) Spring学习之路是指通过学习Spring框架来掌握IOC反转控制的关键技术。IOC反转控制的关键在于获取bean的创建权。当service需要bean时,在自己的文件下创建setBean(Bean bean)函数,...

    Spring全家桶知识笔记.pdf

    在Spring中,bean的注入与装配是核心概念之一,有多种方式可以实现,例如XML配置、通过get和set方法、构造函数或是注解。使用注解是一种简洁的方法,Spring提供了大量注解来简化开发,如@Autowired、@Component、@...

    Spring学习笔记.doc

    - **Bean的创建方式**: - **通过构造器直接创建**:直接指定Bean的类名即可。 - **通过静态工厂方法创建**:使用静态工厂方法创建Bean实例。 - **通过非静态工厂方法创建**:使用非静态工厂方法创建Bean实例。 -...

    spring笔记

    Spring 笔记 Spring 是 Java 企业版(Java EE)应用程序的框架,提供了结构化的配置文件,实现了控制反转(IoC)和面向切面编程(AOP),支持表现层、业务逻辑层和持久层。Spring 的核心是 IoC 和 AOP,能够与主流...

    Spring IOC 笔记

    依赖注入是 IOC 的具体实现方式,它通过容器将一个对象所依赖的其他对象实例传递给该对象,而不是让对象自行创建依赖。这样,对象无需知道依赖的具体实现,只需声明其依赖即可,提高了代码的可测试性和可维护性。 #...

    SSH笔记-bean的作用域

    当设置`scope="singleton"`时,Spring容器会保证在整个应用中只有一个Bean实例。每次请求该Bean时,都会返回同一个实例。这种方式适用于无状态的Bean,例如服务层的业务对象。 2. **原型(Prototype)**:与单例...

    马士兵老师spring框架学习笔记

    2. **IoC(控制反转)**:Spring的核心特性之一是依赖注入(Dependency Injection,简称DI),它是控制反转的一种实现方式。DI允许我们不直接在类内部创建对象,而是通过配置文件或注解来管理对象及其依赖关系,降低...

    Spring.NET 学习笔记—对象的创建

    本文将详细介绍 Spring.NET 中创建对象的三种主要方式:构造器创建、静态工厂创建以及实例工厂创建。 #### 二、构造器创建对象 构造器创建是创建对象最常见的方式之一。这种方式要求对象必须具有至少一个无参的构造...

    spring5框架学习笔记

    Spring 纯注解实现方式是指使用纯注解的方式来配置 Bean 对象的创建和依赖关系,不需要使用 XML 文件。 Spring 整合 Junit Spring 整合 Junit 是指使用 Spring 框架来整合 Junit 测试框架,实现自动化测试。 ...

    Spring学习笔记,精华摘要

    容器通过读取配置元数据来创建bean实例,并且管理bean之间的依赖关系。开发者可以使用`containsBean(String name)`这样的方法来检查Spring容器是否包含特定ID的bean。 总的来说,Spring通过工厂模式和单例模式实现...

    Spring学习笔记(5)----依赖注入的简单实现

    本篇笔记将探讨Spring如何实现依赖注入,并通过实例进行详细解析。 首先,理解依赖注入的基本思想:对象的依赖关系不再由对象自身管理,而是由外部容器(如Spring应用上下文)负责注入。这样做的好处是降低了对象间...

    韩顺平Spring笔记.pdf

    《韩顺平Spring笔记》详述了Spring框架的核心概念、主要功能及其实现机制。Spring是一个容器框架,不同于Web框架如Struts(处理JSP、Action、ActionForm)或ORM框架Hibernate(处理持久层),它关注于管理和维护应用...

    Java相关课程系列笔记之十五Spring学习笔记

    通过构造函数注入依赖,Spring会在创建Bean实例时传入依赖对象。 这些笔记内容涵盖了Spring的基本概念、容器的应用以及IoC特性,为学习Spring框架提供了基础。深入学习Spring还包括AOP、数据访问、Web层支持等多个...

    spring--day02笔记.doc

    BeanPostProcessor是Spring框架提供的一个接口,允许开发者在Bean实例化和销毁阶段执行自定义的逻辑。BeanPostProcessor可以用于实现AOP机制,例如日志记录、安全检查等。 Spring核心API Spring框架提供了一些...

Global site tag (gtag.js) - Google Analytics