xml方式bean的配置---实例化bean的方式
- 构造函数
- 无参构造
- 有参构造
- 工厂方法
- 静态工厂
- 实例工厂
- 实现
FactoryBean
规范延迟实例化Bean
项目结构

pom.xml
文件
java
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
无参构造
默认调用无参构造
java
<?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 id="userDao" class="com.kaiming.dao.impl.UserDaoImpl"></bean>
<!-- userService中注入userDao-->
<bean id="userService" class="com.kaiming.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
java
public class UserServiceImpl implements UserService {
public UserServiceImpl() {
System.out.println("UserServiceImpl无参构造方法");
}
public void setUserDao(UserDao userDao) {
System.out.println("userDao" + userDao);
}
}
java
UserServiceImpl无参构造方法
userDaocom.kaiming.dao.impl.UserDaoImpl@319b92f3
com.kaiming.service.impl.UserServiceImpl@fcd6521
有参构造
beanx.xml
文件
java
<?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 id="userDao" class="com.kaiming.dao.impl.UserDaoImpl"></bean>
<!-- userService中注入userDao-->
<bean id="userService" class="com.kaiming.service.impl.UserServiceImpl">
<!-- 有参构造,不指定默认调用无参构造-->
<constructor-arg name="name" value="haohao"></constructor-arg>
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
java
public class UserServiceImpl implements UserService {
public UserServiceImpl() {
System.out.println("UserServiceImpl无参构造方法");
}
public UserServiceImpl (String name) {
System.out.println("UserServiceImpl有参构造方法");
}
public void setUserDao(UserDao userDao) {
System.out.println("userDao" + userDao);
}
}
java
UserServiceImpl有参构造方法
userDaocom.kaiming.dao.impl.UserDaoImpl@319b92f3
com.kaiming.service.impl.UserServiceImpl@fcd6521
工厂方法实例化
静态工厂方法实例化bean
factory
包下创建一个 MyBeanFactory
,且静态方法为无参
java
public class MyBeanFactory {
// 静态方法
public static UserDao userDao() {
// bean 创建前后可以做一些初始化的工作,执行一些业务逻辑
return new UserDaoImpl();
}
}
java
<?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 id="userDao1" class="com.kaiming.factory.MyBeanFactory" factory-method="userDao"></bean>
<bean id="userDao" class="com.kaiming.dao.impl.UserDaoImpl"></bean>
<!-- userService中注入userDao-->
<bean id="userService" class="com.kaiming.service.impl.UserServiceImpl">
<constructor-arg name="name" value="haohao"></constructor-arg>
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
test
测试
java
public class ApplicationContextTest {
public static void main(String[] args) {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("beans.xml");
Object userDao1 = beanFactory.getBean("userDao1");
System.out.println(userDao1);
}
}
java
UserServiceImpl有参构造方法
com.kaiming.dao.impl.UserDaoImpl@436a4e4b
factory
包下创建的 MyBeanFactory
,且静态方法为有参 ,若有多个参数,配置多个 <constructor-arg>
java
public class MyBeanFactory {
public static UserDao userDao(String name) {
return new UserDaoImpl();
}
}
java
<!--静态方法-->
<bean id="userDao1" class="com.kaiming.factory.MyBeanFactory" factory-method="userDao">
<constructor-arg name="name" value="haohao"></constructor-arg>
</bean>
实例工厂
factory
包下创建一个 MyBeanFactory2
,且实例方法为无参
java
public class MyBeanFactory2 {
public UserDao userDao() {
return new UserDaoImpl();
}
}
java
<?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 id="MyBeanFactory" class="com.kaiming.factory.MyBeanFactory2"></bean>
<bean id="userDao2" factory-bean="MyBeanFactory" factory-method="userDao"></bean>
<bean id="userDao1" class="com.kaiming.factory.MyBeanFactory" factory-method="userDao"></bean>
<bean id="userDao" class="com.kaiming.dao.impl.UserDaoImpl"></bean>
<!-- userService中注入userDao-->
<bean id="userService" class="com.kaiming.service.impl.UserServiceImpl">
<constructor-arg name="name" value="haohao"></constructor-arg>
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
factory
包下创建的 MyBeanFactory2
,且静态方法为有参 ,若有多个参数,配置多个 <constructor-arg>
java
<bean id="MyBeanFactory" class="com.kaiming.factory.MyBeanFactory2"></bean>
<bean id="userDao2" factory-bean="MyBeanFactory" factory-method="userDao">
<constructor-arg name="name" value="haha"></constructor-arg>
</bean>
实现 FactoryBean
规范延迟实例化 Bean
对
bean
的创建有延迟加载的功能,只有用到时,才调用getObject()
返回bean
,并且存储到FactoryBeanObjectCache
的Map
当中,如果再次调用则直接从这个Map
中获取并返回,而不会调用getObject()
方法
java
public interface FactoryBean<T> {
String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
// 返回bean
@Nullable
T getObject() throws Exception;
// 返回对象类型
@Nullable
Class<?> getObjectType();
// 是否为单例
default boolean isSingleton() {
return true;
}
}
factory
包下创建的 MyBeanFactory3
实现 FactoryBean
接口
java
public class MyBeanFactory3 implements FactoryBean<UserDao> {
@Override
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
@Override
public Class<?> getObjectType() {
return UserDao.class;
}
}
test
测试
java
public class ApplicationContextTest {
public static void main(String[] args) {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("beans.xml");
Object userDao3 = beanFactory.getBean("userDao3");
System.out.println(userDao3);
}
}
java
UserServiceImpl有参构造方法
com.kaiming.dao.impl.UserDaoImpl@3c153a1