Spring第一课:基于XML装配bean(四),三种实例化方式:默认构造、静态工厂、实例工厂
Spring中基于XML中的装配bean有三种方式:
1.默认构造
2.静态工厂
3.实例工厂
1.默认构造
在我们在Spring的xml文件中直接通过:
<bean id="名字" class="全限定类名" ></bean>
来写的时候,默认走的是类的默认构造,当我们写了自己的构造方法(就算是无参的)
也是会覆盖默认的构造的,在这种情况下,这种
默认构造实例化bean的方式就不能够使用了!
2.静态工厂
同样是解耦中的service层和serviceImpl:
service
package com.d_inject.b_static_factory;
public interface UserService {
boolean addUser();
}
serviceImpl
package com.d_inject.b_static_factory;
public interface UserService {
boolean addUser();
}
提供一个静态工厂:
package com.d_inject.b_static_factory;
/**
* 注意静态工厂的方法是静态的。
*
* @author mzy
*
*/
public class MyBeanFactory {
/**
* 创建实例
* @return
*/
public static UserService createService() {
return new UserServiceImpl();
}
}
Spring的xml配置文件中写的关于使用静态工厂去创建serviceImpl对象的配置:
<?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">
<!--
将静态工厂创建的实例交予Spring去做,
class 确定静态工厂的全限定名称
factory-method:确定静态方法
-->
<bean id="userService" class="com.d_inject.b_static_factory.MyBeanFactory" factory-method="createService"></bean>
</beans>
在我们没有学习Spring之前的时候手动使用静态工厂,创建对象:
package com.d_inject.b_static_factory;
import org.junit.jupiter.api.Test;
public class TestStaticFactory {
/**
* 在没有学习Spring之前,我们创建一个对象的方式
* 自定义静态工厂去做创建的事情实现解耦。
*/
@Test
public void testMyBeanFactoryByCustom() {
UserService service = MyBeanFactory.createService();
service.addUser();
}
}
测试通过ClassPathXmlApplicationContext,进行getBean:
package com.d_inject.b_static_factory;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestStaticFactory {
/**
* Spring工厂
*/
@Test
public void testMyBeanFactoryBySpring() {
String xmlPath = "com/d_inject/b_static_factory/beans.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
// UserService service = (UserService) applicationContext.getBean("userService");
UserService service = applicationContext.getBean("userService", UserService.class);
service.addUser();
}
}
3.实例工厂:
同样也是如上的service和serviceImpl:
只是上面的静态工厂被改成了实例工厂,实例工厂中只能通过工厂对象来调用方法,不能使用静态方法:
实例工厂:
package com.d_inject.c_factory;
/**
* 实例工厂:
* 必须要有工厂实例对象,通过实例对象创建对象。
* 提供所有的方法都是非静态的。
*
* @author mzy
*
*/
public class MyBeanFactory {
/**
* 创建实例
* @return
*/
public UserService createService() {
return new UserServiceImpl();
}
}
Spring的配置文件:
就先要通过bean配置能够获得工厂对象,再通过factory-bean和factory-method来确定具体的通过实例工厂的哪个方法获得对象:
<?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.d_inject.c_factory.MyBeanFactory"></bean>
<!--
获得userService:
factory-bean:确定工厂实例< 从该配置文件的bean中找 >
factory-method:确定通过工厂实例调用的方法。
-->
<bean id="userService" factory-bean="myBeanFactory" factory-method="createService"></bean>
</beans>
最后,在没有学Spring之前,通过实例工厂创建对象的方式:
/**
* 实例工厂
*
* 在没有学习Spring之前,我们创建一个对象的方式 自定义工厂
* 实例工厂,实现解耦。
*/
@Test
public void testMyBeanFactoryByCustom() {
MyBeanFactory factory = new MyBeanFactory();
UserService service = factory.createService();
service.addUser();
}
Spring通过实例工厂的方式:
/**
* Spring工厂
*/
@Test
public void testMyBeanFactoryBySpring() {
String xmlPath = "com/d_inject/c_factory/beans.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
// UserService service = (UserService)
// applicationContext.getBean("userService");
UserService service = applicationContext.getBean("userService", UserService.class);
service.addUser();
}
Spring第一课:基于XML装配bean(四),三种实例化方式:默认构造、静态工厂、实例工厂的更多相关文章
- Bean的三种实例化方式
在面向对象程序中,如要使用某个对象,就需要先实例化这个对象.同样的,在Spring中,要想使用容器中的Bean,也需要实例化Bean.实例化Bean有三种方式,分别是:构造器实例化.静态工厂实例化.实 ...
- Spring bean的bean的三种实例化方式
Bean 定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的.bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象.这些 bean ...
- Java开发学习(四)----bean的三种实例化方式
一.环境准备 准备开发环境 创建一个Maven项目 pom.xml添加依赖 resources下添加spring的配置文件applicationContext.xml 最终项目的结构如下: 二. ...
- Spring容器装配Bean的三种方式
欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...
- spring Bean的三种配置方式
Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java Config 添加spring的maven repository <dependency> ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring基于XML装配Bean
Bean 的装配可以理解为依赖关系注入,Bean 的装配方式也就是 Bean 的依赖注入方式.Spring 容器支持多种形式的 Bean 的装配方式,如基于 XML 的 Bean 装配.基于 Anno ...
- spring 装配bean的三种方式
这段时间在学习Spring,依赖注入DI和面向切面编程AOP是Spring框架最核心的部分.这次主要是总结依赖注入的bean的装配方式. 什么是依赖注入呢?也可以称为控制反转,简单的来说,一般完成稍微 ...
- spring装配bean的三种方式及其混合装配
在spring容器中装配bean有三种基本方式和混合装配方式: 隐式的bean自动发现机制和自动装配 在java中进行显式配置 在xml中配置 混合装配(在多个java文件中配置.在JavaConfi ...
- Spring装配Bean的三种方式+导入和混合配置
目录 Spring IoC与bean 基于XML的显式装配 xml配置的基本结构 bean实例的三种创建方式 依赖注入的两种方式 构造器注入方式 setter方法注入方式 利用命名空间简化xml 基于 ...
随机推荐
- 痞子衡嵌入式:了解i.MXRTxxx系列ROM中灵活的串行NOR Flash启动硬复位引脚选择
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRTxxx系列ROM中灵活的串行NOR Flash启动硬复位引脚选择. 关于 i.MXRT 系列 BootROM 中串行 NOR ...
- SpringBoot总结之Spring Data Jpa
一.Spring Data Jpa简介 JPA(Java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate.TopLink等. Spring D ...
- SpringCloud学习之【Eureka实现服务注册与发现】
这段时间开始整理之前的SpringCloud实践笔记,这里感谢翟永超大佬的文章SpringCloud从入门到精通的指导. 项目结构 服务注册中心 注意: 1.SpringCloud与SpringBoo ...
- python基础之读取xml
python怎么操作xml文件详细介绍链接:https://www.jb51.net/article/50812.htm 从结构上来说,xml很像常见的HTML超文本标记语言.不过超文本语言被设计用来 ...
- Python开发篇——如何在Flask下编写JWT登录
首先,HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息)--每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求 ...
- 数据结构和算法学习笔记十五:多路查找树(B树)
一.概念 1.多路查找树(multi-way search tree):所谓多路,即是指每个节点中存储的数据可以是多个,每个节点的子节点数也可以多于两个.使用多路查找树的意义在于有效降低树的深度,从而 ...
- 2021qwb [强网先锋]赌徒 Writeup + 环境复现
2021 qwb [强网先锋]赌徒 Writeup + 环境复现(win10) 1.本地环境复现(win10+phpStudy2018) 将比赛文件复制到phpStudy的\phpStudy\PHPT ...
- Dapr 客户端 搭配 WebApiClientCore 玩耍服务调用
使用Dapr 客户端 处理服务调用,需要遵循的他的模式,通常代码是这个样子的: var client = DaprClient.CreateInvokeHttpClient(appId: " ...
- 承载童年的游戏机,已停产!但我在 GitHub 找到了它们
那些年,上网用的是电话线,小企鹅也只会笨拙地左右摇晃,手机还只是打电话的工具.虽然那些年没有互联网,但游戏机承载了我的童年. 小时候我老是追着我的两个哥哥,他们带我玩了好多种游戏机,比如街机.红白机. ...
- dio框架访问云函数参数传递问题(以腾讯云中的云函数为例子)第一部
dd云函数其实比较普及,这里以腾讯云的云函数为例,传递参数完成简单的账号注册. 一.第一步先注册腾讯云账号,这里不过多阐述,接着点击 控制台 进入开发者界面.(注意提前进行实名认证) 二.开发者界面如 ...