spring 通过工厂来创建bean

本文介绍了如何在Spring框架中利用工厂模式获取Bean实例。通过示例代码展示了SpringContextSupport类初始化上下文并获取Bean的过程,同时提供了DAOFactory和服务工厂的具体实现。
[color=blue] 1: 这个例子中我们使用工厂模式来取的bean。首先我们来获取context

public class SpringContextSupport implements ServletContextAware {

private static Object initObj = null;

private static int count = 0;

private static ApplicationContext context;

public static void init(Object o) {
initObj = o;
count++;
}

/**
*
* gets the instance from the beanId
*
* @param object
* @return void
*/
public static Object getBean(String beanName) {
return getApplicationContext().getBean(beanName);
}

/**
*
* returns applicationContext based on initObj
*
* @return ApplicationContext
*/
public static ApplicationContext getApplicationContext() {
if (initObj == null) {
throw new IllegalStateException(
"Application context not initialized");
} else if (initObj instanceof ServletContext) {
ServletContext servletContext = (ServletContext) initObj;
return WebApplicationContextUtils
.getRequiredWebApplicationContext(servletContext);

} else if (initObj instanceof String) {
if (context == null) {
context = new FileSystemXmlApplicationContext(
Constants.FILE_CONTEXT_PATH);
}
return context;
} else {
throw new IllegalStateException(
"You must initialize the context with a String");
}
}

/**
*
* initializes servletContext
*
* @param context
* @return void
*/
public void setServletContext(ServletContext context) {
init(context);
}

public static void initializeStandalone() {
init("StandAlone");
}


/**
*
* initializes servletContext for bid board batch
*
* @param context
* @return void
*/
public static void initBidBoardBatch() {
init( Constants.BB_BATCH_STARTUP);
}
}

备注: String FILE_CONTEXT_PATH = "WEB-INF/conf/user-services.xml";
那么在这个文件中就是我们配置的bean
2: 具体通过工厂是方法来取得我们所需要的bean
public class DAOFactory {
public UserDAO getUserDAO() throws Exception {
UserDAO userDAO = null;
try {
userDAO = (UserDAO) SpringContextSupport
.getBean(DAOConstants.USER_DAO);
} catch (Exception exception) {
throw exception;
}
return userDAO;
}
}

3: 那么我们想对应的service工厂模式的创建也类似:如下:
public class CommonServiceFactory {
public CommonService getCommonService() throws BBSystemException {
CommonService commonService = null;

commonService =
(CommonService) SpringContextSupport
.getBean(BBServiceConstants.COMMON_SERVICE);

if (null == commonService) {
throw BBUtil.getBBSystemException(BBMessageConstants.OBJECTS_NULL);
}
return commonService;
}
}
[/color]
Spring框架中,创建Bean工厂的核心方法主要依赖于Spring容器的工厂模式,包括通过反射机制、构造方法以及FactoryBean接口等方式创建Bean实例。以下是几种常见且有效的Bean工厂创建方式: ### 1. 使用默认构造方法通过反射创建Bean Spring容器可以通过类的全限定名使用`Class.forName()`加载类,并调用默认构造方法创建对象实例。这种方式是Spring默认创建Bean的基础机制之一。 ```java TagDAO tt = (TagDAO) Class.forName("scope.TagDAOImpl").newInstance(); System.out.println(tt); ``` 此方法依赖于类具有无参构造函数,若类中没有无参构造函数,则会抛出异常[^1]。 ### 2. 使用FactoryBean接口创建Bean `FactoryBean`是Spring框架中的一个特殊接口,允许通过实现该接口来自定义Bean创建逻辑,而不完全依赖于Spring的默认Bean生命周期。它提供了更高的灵活性,适用于需要根据特定条件创建不同类型的Bean的场景。 ```java public class MyFactoryBean implements FactoryBean<MyClass> { @Override public MyClass getObject() throws Exception { return new MyClass(); } @Override public Class<?> getObjectType() { return MyClass.class; } @Override public boolean isSingleton() { return true; } } ``` 在配置文件中,通过以下方式注册: ```xml <bean id="myFactoryBean" class="com.gql.factory.MyFactoryBean"></bean> ``` 该方式适用于需要自定义Bean创建逻辑的场景,例如动态创建代理对象或根据配置条件生成不同类型的Bean[^2]。 ### 3. 使用静态工厂方法创建Bean Spring支持通过指定类的静态方法创建Bean实例。在这种方式中,需要在配置文件中明确指定`factory-method`属性来调用静态方法。 ```java public class MyStaticFactory { public static MyClass createInstance() { return new MyClass(); } } ``` 对应的配置文件内容如下: ```xml <bean id="myClass" class="com.gql.factory.MyStaticFactory" factory-method="createInstance"/> ``` 这种方式适用于无需依赖Spring容器生命周期管理即可创建Bean的场景,适用于已有静态工厂方法的类[^3]。 ### 4. 使用实例工厂方法创建Bean 除了静态工厂方法外,Spring还支持通过一个已有工厂对象的实例方法创建Bean。这允许更灵活的工厂逻辑实现。 ```java public class MyFactory { public MyClass createInstance() { return new MyClass(); } } ``` 在配置文件中,首先定义工厂Bean,然后指定其方法创建目标Bean: ```xml <bean id="myFactory" class="com.gql.factory.MyFactory"/> <bean id="myClass" factory-bean="myFactory" factory-method="createInstance"/> ``` 该方式适用于需要通过实例方法动态创建Bean的场景,例如基于运行参数创建不同对象[^3]。 ### 5. 使用注解方式创建Bean Spring还支持通过注解方式自动注册Bean,例如使用`@Component`或`@Service`注解标记类,然后通过组件扫描自动将其纳入Spring容器管理。 ```java @Component public class MyService { // 业务逻辑 } ``` 在配置文件中启用组件扫描: ```xml <context:component-scan base-package="com.gql"/> ``` 这种方式适用于现代Spring项目,简化了配置并提升了开发效率[^4]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值