不同Bean创建方式有三种:
1、大多数情况下,BeanFactory使用new关键字调用构造器
2、BeanFactory调用某个类的静态工厂方法创建Bean
3、BeanFactory调用实例工厂方法创建Bean
第一种常用不做分析,分析后二者。
BeanFactory调用某个类的静态工厂方法创建Bean
接口Being.java
package com.modellite.spring;
public interface Being {
public void testBeing();
}
实现类Dog.java
package com.modellite.spring;
public class Dog implements Being {
private String msg;
public Dog() {
}
public void testBeing() {
System.out.println(msg + " 狗爱啃骨头");
}
public void setMsg(String msg) {
this.msg = msg;
}
}
实现类Cat.java
package com.modellite.spring;
public class Cat implements Being {
private String msg;
public Cat() {
}
public void setMsg(String msg) {
this.msg = msg;
}
public void testBeing() {
System.out.println(msg + " 猫爱抓老鼠");
}
}
工厂类BeingFactory.java,存在一个静态方法getBeing(String arg)
package com.modellite.spring;
public class BeingFactory {
public static Being getBeing(String arg) {
if (arg.equalsIgnoreCase("dog")) {
return new Dog();
} else {
return new Cat();
}
}
}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 静态工厂方法创建bean -->
<!-- 此处的class并非是dog的实现类,而是产生dog的静态工厂类,采用静态工厂方法创建bean实例,必须使用factory-method指定静态工厂方法 -->
<bean id="dog" class="com.modellite.spring.BeingFactory"
factory-method="getBeing">
<!-- 调用静态工厂方法时,传入的参数使用constructor-arg元素指定 -->
<constructor-arg value="dog" />
<!-- property用于确定普通接受依赖注入的属性 -->
<property name="msg" value="我是狗" />
</bean>
<!-- 此处的class并非是cat的实现类,而是产生cat的静态工厂类,采用静态工厂方法创建bean实例,必须使用factory-method指定静态工厂方法 -->
<bean id="cat" class="com.modellite.spring.BeingFactory"
factory-method="getBeing">
<!-- 调用静态工厂方法时,传入的参数使用constructor-arg元素指定 -->
<constructor-arg>
<value>cat</value>
</constructor-arg>
<!-- property用于确定普通接受依赖注入的属性 -->
<property name="msg">
<value>我是猫</value>
</property>
</bean>
如此可以看出:
1、class属性值并非是Bean的实现类,而是静态工厂类
2、必须使用factory-method指定产生实例的静态工厂方法
3、如果静态方法需要参数,数使用constructor-arg元素指定
接下来分析,BeanFactory调用实例工厂方法创建Bean
便于对比,只在BeingFactory.java添加方法:
public Being getBing(String arg){
if (arg.equalsIgnoreCase("dog")) {
return new Dog();
} else {
return new Cat();
}
}
配置文件添加
<!-- 调用实例工厂方法创建Bean -->
<!-- 配置工厂bean,该bean负责产生其他bean实例 -->
<bean id="beingFactory" class="com.modellite.spring.BeingFactory"/>
<bean id="dogB" factory-bean="beingFactory" factory-method="getBing">
<!-- 调用工厂方法时,传入的参数也使用constructor-arg元素指定 -->
<constructor-arg value="dog" />
<!-- property用于确定普通接受依赖注入的属性 -->
<property name="msg" value="我是狗" />
</bean>
<bean id="catB" factory-bean="beingFactory" factory-method="getBing">
<!-- 调用工厂方法时,传入的参数也使用constructor-arg元素指定 -->
<constructor-arg value="cat" />
<!-- property用于确定普通接受依赖注入的属性 -->
<property name="msg" value="我是猫" />
</bean>
可以看出大同小异,只是factory-bean不同而已。
二者测试类的部分代码
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
//测试静态
Being b1 = (Being) ctx.getBean("dog");
b1.testBeing();
Being b2 = (Being) ctx.getBean("cat");
b2.testBeing();
//测试实例工厂
Being b3 = (Being) ctx.getBean("dogB");
b3.testBeing();
Being b4 = (Being) ctx.getBean("catB");
b4.testBeing();
分享到:
相关推荐
每个`@Bean`方法都会被Spring调用一次,以创建对应的Bean实例。 **依赖注入**:在Java配置中,依赖注入可以通过构造函数、setter方法或者字段注解实现。例如,如果`MyService`需要依赖`MyRepository`,可以这样修改...
自动构造Java的Bean类,暂时仅支持定义包名、类名、带参构造方法、成员变量及其对应的get和set方法,同eclipse里面该项功能,不过本项目是通过配置文件实现,可以根据自己的需要进行拓展,平时用起来省时省力。
一旦XML配置加载到Spring容器中,容器将根据配置创建Bean实例,并按照定义进行初始化、依赖注入,最后完成Bean的生命周期管理。 10. **实践操作**: 在实际开发中,我们可以使用Eclipse的Spring插件来简化Bean...
在Spring框架中,Bean的创建方式多样,其中两种常见的非XML配置方式是通过静态工厂方法和实例工厂方法来创建Bean。这些方法为Spring容器提供了更灵活的Bean实例化策略,让我们深入了解一下这两种方法。 首先,静态...
在Spring框架中,管理Bean的方式主要有三种:XML配置、注解配置和Java配置。下面将详细介绍这三种方式以及Spring的自动注入机制。 1. **基于XML的Bean定义**: 在XML配置中,我们通常在`applicationContext.xml`...
Spring提供了多种方式来创建和管理Bean,这使得我们可以根据项目需求灵活选择最佳实践。本文将详细介绍Spring中的三种主要的Bean实例化方式:XML配置、注解配置以及Java配置。 ### 1. XML配置 XML配置是Spring早期...
在Spring框架中,Bean是核心概念,它是Java对象在Spring容器中的实例,通过XML或Java配置来定义。本文将深入探讨Spring项目中的...记得实践是检验理论的最好方式,尝试在实际项目中配置Bean,以便更好地掌握这些知识。
- 执行生成命令:运行代码生成器,根据配置文件生成对应的Mapper、XML和Bean文件。 - 引入生成的文件:将生成的文件引入到项目中,进行相应的调整和测试。 7. **优势**:使用代码生成器不仅提高了开发效率,还...
在MyBatis中,我们通常会为数据库表创建对应的Java Bean,用于存储和操作数据。 三、MyBatis自动建Bean MyBatis虽然不提供自动创建Java Bean的功能,但可以通过一些第三方工具或IDE插件实现这个功能。例如,使用...
在Spring框架中,配置Bean是核心功能之一,它允许开发者声明、管理和注入应用程序...同时,随着Spring的发展,更多的配置方式,如基于注解的配置和Java配置,也逐渐成为主流,但XML配置仍然是许多场景下的基础和补充。
- 使用p名称空间,可以直接在XML配置文件中通过属性名引用对应的值或者bean对象,例如使用p:属性名="值"的方式。 在实际开发过程中,开发者可以根据具体的项目需求和环境选择合适的Bean管理方式。XML方式适合于...
在构造过程中,SpringBusFactory会搜索META-INF/cxf(包含在 CXF 的jar中)下的所有bean配置文件。 * 根据这些配置文件构建一个ApplicationContext。开发者也可以提供自己的配置文件来定制Bus。
标题"java自动生成bean 根据数据库表及字段"描述的就是这样一个功能,它可以根据数据库中的表和字段信息,自动生成对应的Java Bean源代码,同时还能根据配置的模板添加特定的注释,如MySQL的注释。 在Java世界里,...
这里的`id`属性是Bean的唯一标识符,`class`属性指定了Bean所对应的类。`property`标签用于设置Bean的属性值,`ref`属性则引用了另一个Bean。 接下来,Spring使用Java的反射机制来实例化Bean。反射允许程序在运行时...
4. **AOP代理**:如果Bean配置了AOP相关的注解或切面,Spring会创建对应的代理对象,使得在调用Bean方法时能进行拦截处理。 在容器销毁阶段,Spring Bean会经历: 1. **清理回调**:当容器关闭时,如果Bean实现了`...
**EJB3(Enterprise JavaBeans 3)**是...总之,EJB3的有状态和无状态会话Bean提供了灵活的业务逻辑处理方式,适用于不同类型的场景。理解它们的区别以及如何在Web应用程序中进行测试和部署是Java EE开发者必备的技能。
`autoconfig-demo`项目就是基于这一特性的示例,旨在教你如何利用条件Bean创建自定义的自动配置文件。本文将深入探讨Spring Boot自动配置的工作原理以及如何通过条件Bean来实现自定义配置。 首先,Spring Boot自动...
- Spring 3.1 引入了Profiles的概念,允许根据不同的环境配置不同的Bean。例如: ```xml <!-- 开发环境的Bean配置 --> <!-- 生产环境的Bean配置 --> ``` 9. **引入外部配置**: - 使用`import`标签...
在Spring Security中,我们通常在`security-config.xml`或对应的Java配置类中设置安全规则。这包括定义哪些URL需要保护、如何进行身份验证和授权。例如,我们可以使用`http`元素来配置URL过滤器链,并使用`form-...