spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。
实例工厂方法步骤如下:
定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂(xml)
定义实例工厂类
该类有实例方法返回所需bean,实例方法可以有参或无参。
package com.itheima.factory;
import com.itheima.dao.interfaces.InterfaceUserDao;
import com.itheima.service.interfaces.InterfaceUserService;
import com.itheima.service.impl.UserServiceImpl02;
/**
* @copyright 2003-2024
* @author qiao wei
* @date 2024-12-24
* @version 1.0
* @brief 实例工厂方法返回Bean。
* @history name
* date
* brief
*/
public class MyBeanFactory02 {
public InterfaceUserService getUserService() {
return new UserServiceImpl02(userDao, 20);
}
public void setUserServiceA01(InterfaceUserDao userDao) {
this.userDao = userDao;
}
public InterfaceUserDao getUserDaoABC(int value01, InterfaceUserDao userDao01) {
// System.out.println("Int:" + value01);
return userDao01;
}
private InterfaceUserDao userDao;
}
方法getUserService和方法getUserDaoABC分别返回bean对象。
定义实例工厂(xml),定义调用实例工厂(xml)
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<!-- <bean id="userDaoInstance"-->
<!-- class="com.itheima.dao.impl.UserDaoImpl">-->
<!-- </bean>-->
<import resource="../dao/userDaoImpl.xml"/>
<!--
实例工厂的实例方法(无参方法)返回第三方bean。
1:定义Bean“myBeanFactoryA002”。工厂方法通过其它设置进行设置,随后将设置好的数据传递给工厂方法。
2:定义实例工厂。该工厂绑定实例工厂类“myBeanFactoryA002”,调用无参实例方法“getUserService”返回Bean。
-->
<bean id="myBeanFactoryA002"
class="com.itheima.factory.MyBeanFactory02">
</bean>
<bean id="getBeanWithoutParam"
factory-bean="myBeanFactoryA002"
factory-method="getUserService">
</bean>
<!--
实例工厂的实例方法(有参方法)返回第三方bean。
1:factory-bean指定实例工厂类。
2:factory-method指定工厂类的实例有参方法“getUserDaoABC”,该方法返回Bean。
注:方法参数要按照方法中定义顺序赋值,改变顺序报错。
-->
<bean id="getBeanWithParam"
factory-bean="myBeanFactoryA002"
factory-method="getUserDaoABC">
<!-- 基本类型int参数 -->
<constructor-arg name="value01"
value="100">
</constructor-arg>
<!-- 引用类型"com.itheima.dao.impl.UserDaoImpl" -->
<constructor-arg name="userDao01"
ref="userDaoImpl001">
</constructor-arg>
</bean>
</beans>
可以看到,getBeanWithParam和getBeanWithoutParam都是通过调用实例工myBeanFactoryA002取得bean实例,不同之处只是一个方法无参,一个方法有参。