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属性。
相关推荐
在Spring框架中,Bean的创建方式多样,其中两种常见的非XML配置方式是通过静态工厂方法和实例工厂方法来创建Bean。这些方法为Spring容器提供了更灵活的Bean实例化策略,让我们深入了解一下这两种方法。 首先,静态...
构造注入通过构造函数注入依赖,确保在bean实例化时所有依赖都已就绪。setter注入则通过setter方法注入依赖,更加灵活,可以在bean实例化后进行调整。Spring支持两者,开发者可以根据需求选择合适的方式。 5. **...
在具体实现中,Spring的`DefaultListableBeanFactory`类是Bean工厂的主要实现,它负责读取配置、创建Bean实例。在处理`@Autowired`时,`AutowiredAnnotationBeanPostProcessor`起着关键作用。这个类实现了Bean后...
在Spring框架中,实例化Bean是其核心功能之一,它为开发者提供了多种方式来创建和管理对象。这篇“Spring学习笔记(2)----实例化Bean的三种方式”着重讲解了如何在Spring应用上下文中初始化Bean。以下是这三种方式...
Spring_IOC-v(上)笔记是关于 Spring 框架中的 IoC(控制反转)技术的笔记,主要介绍了 IoC 的概念、依赖注入、Bean 的设置、Spring 组件的管理等知识点。 IoC 技术是 Spring 框架的核心概念之一,它的主要思想...
Spring学习之路(黑马课程笔记) Spring学习之路是指通过学习Spring框架来掌握IOC反转控制的关键技术。IOC反转控制的关键在于获取bean的创建权。当service需要bean时,在自己的文件下创建setBean(Bean bean)函数,...
在Spring中,bean的注入与装配是核心概念之一,有多种方式可以实现,例如XML配置、通过get和set方法、构造函数或是注解。使用注解是一种简洁的方法,Spring提供了大量注解来简化开发,如@Autowired、@Component、@...
- **Bean的创建方式**: - **通过构造器直接创建**:直接指定Bean的类名即可。 - **通过静态工厂方法创建**:使用静态工厂方法创建Bean实例。 - **通过非静态工厂方法创建**:使用非静态工厂方法创建Bean实例。 -...
Spring 笔记 Spring 是 Java 企业版(Java EE)应用程序的框架,提供了结构化的配置文件,实现了控制反转(IoC)和面向切面编程(AOP),支持表现层、业务逻辑层和持久层。Spring 的核心是 IoC 和 AOP,能够与主流...
依赖注入是 IOC 的具体实现方式,它通过容器将一个对象所依赖的其他对象实例传递给该对象,而不是让对象自行创建依赖。这样,对象无需知道依赖的具体实现,只需声明其依赖即可,提高了代码的可测试性和可维护性。 #...
当设置`scope="singleton"`时,Spring容器会保证在整个应用中只有一个Bean实例。每次请求该Bean时,都会返回同一个实例。这种方式适用于无状态的Bean,例如服务层的业务对象。 2. **原型(Prototype)**:与单例...
2. **IoC(控制反转)**:Spring的核心特性之一是依赖注入(Dependency Injection,简称DI),它是控制反转的一种实现方式。DI允许我们不直接在类内部创建对象,而是通过配置文件或注解来管理对象及其依赖关系,降低...
本文将详细介绍 Spring.NET 中创建对象的三种主要方式:构造器创建、静态工厂创建以及实例工厂创建。 #### 二、构造器创建对象 构造器创建是创建对象最常见的方式之一。这种方式要求对象必须具有至少一个无参的构造...
Spring 纯注解实现方式是指使用纯注解的方式来配置 Bean 对象的创建和依赖关系,不需要使用 XML 文件。 Spring 整合 Junit Spring 整合 Junit 是指使用 Spring 框架来整合 Junit 测试框架,实现自动化测试。 ...
容器通过读取配置元数据来创建bean实例,并且管理bean之间的依赖关系。开发者可以使用`containsBean(String name)`这样的方法来检查Spring容器是否包含特定ID的bean。 总的来说,Spring通过工厂模式和单例模式实现...
本篇笔记将探讨Spring如何实现依赖注入,并通过实例进行详细解析。 首先,理解依赖注入的基本思想:对象的依赖关系不再由对象自身管理,而是由外部容器(如Spring应用上下文)负责注入。这样做的好处是降低了对象间...
《韩顺平Spring笔记》详述了Spring框架的核心概念、主要功能及其实现机制。Spring是一个容器框架,不同于Web框架如Struts(处理JSP、Action、ActionForm)或ORM框架Hibernate(处理持久层),它关注于管理和维护应用...
通过构造函数注入依赖,Spring会在创建Bean实例时传入依赖对象。 这些笔记内容涵盖了Spring的基本概念、容器的应用以及IoC特性,为学习Spring框架提供了基础。深入学习Spring还包括AOP、数据访问、Web层支持等多个...
BeanPostProcessor是Spring框架提供的一个接口,允许开发者在Bean实例化和销毁阶段执行自定义的逻辑。BeanPostProcessor可以用于实现AOP机制,例如日志记录、安全检查等。 Spring核心API Spring框架提供了一些...