当前位置: 首页 > news >正文

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 ,并且存储到 FactoryBeanObjectCacheMap 当中,如果再次调用则直接从这个 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
http://www.dtcms.com/a/490552.html

相关文章:

  • 212. Java 函数式编程风格 - Java 编程风格转换:命令式 vs 函数式(以循环为例)
  • Ubuntu 24.04 修改 ssh 监听端口
  • 1千元以下做网站的公司wordpress sso插件开发
  • Pytorch神经网络工具箱
  • PyTorch DataLoader 高级用法
  • 怎么做一个网站app吗金华网站建设价格
  • 芷江建设局网站石家庄网站建设公司黄页
  • Excel表----VLOOKUP函数实现两表的姓名、身份证号码、银行卡号核对
  • XMLHttpRequest.responseType:前端获取后端数据的一把“格式钥匙”
  • office便捷办公06:根据相似度去掉excel中的重复行
  • Vue+mockjs+Axios 案例实践
  • http的发展历程
  • Python中使用HTTP 206状态码实现大文件下载的完整指南
  • AngularJS下 $http 上传文件
  • 如何弄死一个网站锡林郭勒盟建设工程造价管理网站
  • 【Node.js】为什么擅长处理 I/O 密集型应用?
  • 基于SpringBoot的无人机飞行管理系统
  • STM32的HardFault错误处理技巧
  • Tekever-固定翼无人机系统:模块化垂直起降、远程海上无人机、战术 ISR 无人机
  • Kafka Queue: 如何严格控制消息数量
  • 大兴建设网站wordpress 托管主机
  • 国外html响应式网站网站开发高级证
  • 苍穹外卖--04--Redis 缓存菜品信息、购物车
  • 大淘客网站如何做seowordpress o2o主题
  • 机器学习催化剂设计专题学习
  • (六)机器学习之图卷积网络
  • 告别刀耕火种:用 Makefile 自动化 C 语言项目编译
  • 【安卓开发】【Android】做一个简单的钢琴模拟器
  • C#控制反转
  • 【Java 开发日记】什么是线程池?它的工作原理?