xml方式bean的配置---实例化bean的方式
xml方式bean的配置—实例化bean的方式
- 构造函数
- 无参构造
- 有参构造
- 工厂方法
- 静态工厂
- 实例工厂
- 实现
FactoryBean
规范延迟实例化Bean
项目结构
pom.xml
文件
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency>
</dependencies>
无参构造
默认调用无参构造
<?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>
public class UserServiceImpl implements UserService {public UserServiceImpl() {System.out.println("UserServiceImpl无参构造方法");}public void setUserDao(UserDao userDao) {System.out.println("userDao" + userDao);}
}
UserServiceImpl无参构造方法
userDaocom.kaiming.dao.impl.UserDaoImpl@319b92f3
com.kaiming.service.impl.UserServiceImpl@fcd6521
有参构造
beanx.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"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>
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);}
}
UserServiceImpl有参构造方法
userDaocom.kaiming.dao.impl.UserDaoImpl@319b92f3
com.kaiming.service.impl.UserServiceImpl@fcd6521
工厂方法实例化
静态工厂方法实例化bean
factory
包下创建一个 MyBeanFactory
,且静态方法为无参
public class MyBeanFactory {// 静态方法public static UserDao userDao() {// bean 创建前后可以做一些初始化的工作,执行一些业务逻辑return new UserDaoImpl();}
}
<?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
测试
public class ApplicationContextTest {public static void main(String[] args) {BeanFactory beanFactory = new ClassPathXmlApplicationContext("beans.xml");Object userDao1 = beanFactory.getBean("userDao1");System.out.println(userDao1);}
}
UserServiceImpl有参构造方法
com.kaiming.dao.impl.UserDaoImpl@436a4e4b
factory
包下创建的 MyBeanFactory
,且静态方法为有参 ,若有多个参数,配置多个 <constructor-arg>
public class MyBeanFactory {public static UserDao userDao(String name) {return new UserDaoImpl();}
}
<!--静态方法-->
<bean id="userDao1" class="com.kaiming.factory.MyBeanFactory" factory-method="userDao"><constructor-arg name="name" value="haohao"></constructor-arg>
</bean>
实例工厂
factory
包下创建一个 MyBeanFactory2
,且实例方法为无参
public class MyBeanFactory2 {public UserDao userDao() {return new UserDaoImpl();}
}
<?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>
<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()
方法
public interface FactoryBean<T> {String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";// 返回bean@NullableT getObject() throws Exception;// 返回对象类型@NullableClass<?> getObjectType();// 是否为单例default boolean isSingleton() {return true;}
}
factory
包下创建的 MyBeanFactory3
实现 FactoryBean
接口
public class MyBeanFactory3 implements FactoryBean<UserDao> {@Overridepublic UserDao getObject() throws Exception {return new UserDaoImpl();}@Overridepublic Class<?> getObjectType() {return UserDao.class;}
}
test
测试
public class ApplicationContextTest {public static void main(String[] args) {BeanFactory beanFactory = new ClassPathXmlApplicationContext("beans.xml");Object userDao3 = beanFactory.getBean("userDao3");System.out.println(userDao3);}
}
UserServiceImpl有参构造方法
com.kaiming.dao.impl.UserDaoImpl@3c153a1