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(四),三种实例化方式:默认构造、静态工厂、实例工厂的更多相关文章

  1. Bean的三种实例化方式

    在面向对象程序中,如要使用某个对象,就需要先实例化这个对象.同样的,在Spring中,要想使用容器中的Bean,也需要实例化Bean.实例化Bean有三种方式,分别是:构造器实例化.静态工厂实例化.实 ...

  2. Spring bean的bean的三种实例化方式

     Bean 定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的.bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象.这些 bean ...

  3. Java开发学习(四)----bean的三种实例化方式

    一.环境准备 准备开发环境 创建一个Maven项目 pom.xml添加依赖 resources下添加spring的配置文件applicationContext.xml 最终项目的结构如下:    二. ...

  4. Spring容器装配Bean的三种方式

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  5. spring Bean的三种配置方式

    Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java Config 添加spring的maven repository <dependency> ...

  6. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring基于XML装配Bean

    Bean 的装配可以理解为依赖关系注入,Bean 的装配方式也就是 Bean 的依赖注入方式.Spring 容器支持多种形式的 Bean 的装配方式,如基于 XML 的 Bean 装配.基于 Anno ...

  7. spring 装配bean的三种方式

    这段时间在学习Spring,依赖注入DI和面向切面编程AOP是Spring框架最核心的部分.这次主要是总结依赖注入的bean的装配方式. 什么是依赖注入呢?也可以称为控制反转,简单的来说,一般完成稍微 ...

  8. spring装配bean的三种方式及其混合装配

    在spring容器中装配bean有三种基本方式和混合装配方式: 隐式的bean自动发现机制和自动装配 在java中进行显式配置 在xml中配置 混合装配(在多个java文件中配置.在JavaConfi ...

  9. Spring装配Bean的三种方式+导入和混合配置

    目录 Spring IoC与bean 基于XML的显式装配 xml配置的基本结构 bean实例的三种创建方式 依赖注入的两种方式 构造器注入方式 setter方法注入方式 利用命名空间简化xml 基于 ...

随机推荐

  1. Long类型框架自动序列化成String失效问题排查

    目录 问题描述 猜想 1. 写错了 2. 重新使用 验证猜想 1.验证猜想 2.继续猜想 3.再次猜想 4.再次验证 5.疑惑 6.找到原因,解决疑惑 7.解决 问题描述 微服务架构下进行业务模块开发 ...

  2. TypeScript——原始数据类型

    TypeScript原始数据类型 原始数据类型包括:布尔值.数值.字符串.null.undefined. Symbol.BigInt. 布尔值: let isDone: boolean = false ...

  3. ajax请求对返回数据data的处理

    1,ajax请求会根据响应头的返回数据类型对返回的数据data变量进行不同的处理 $.get("data/user-permission-submit-" + ddo.manipu ...

  4. 在Python中执行普通除法

    如果希望Python只执行普通的除法,那么可以在程序前加上以下语句: 1 from _future_ import division 如果通过命令行(比如在Linux系统上)运行Python,可以使用 ...

  5. 深入刨析tomcat 之---第13篇 tomcat的三种部署方法

    writedby 张艳涛 一般我们都知道将web 应用打成war包,放到tomcat的webapp目录下,就是部署了,这是部署方法1 第2种部署方法我们也知道,就是讲web应用的文件夹拷贝到webap ...

  6. SpringData JPA 使用原生 SQL

    在实现个人博客系统的归档功能的时候,遇上这样的需求: 先把数据库中所有条目的时间按照年月分组,并查询出年月(String)的列表 根据年月字符串查询符合条件的博客,并返回博客列表 由于数据访问层使用的 ...

  7. koa踩坑记录

    1.koa热更新用nodemon 2.koa中暂不支持import/export 3.只发送options请求,没有后续请求   当ctx.set('Access-Control-Allow-Cred ...

  8. 只是想虐下春丽,一不当心玩了下serverless...感觉还不错哟!

    事情是这样的-- 前天下午天太热,我在家看电视,换台突然就看到了正在播<西游记>,窗外蝉声特别响,我一下就有种穿越回小学暑假的感觉.当时,我就特别想把我那台小霸王翻出来,玩两盘街霸--虐一 ...

  9. [源码解析] 机器学习参数服务器ps-lite 之(3) ----- 代理人Customer

    [源码解析] 机器学习参数服务器ps-lite 之(3) ----- 代理人Customer 目录 [源码解析] 机器学习参数服务器ps-lite 之(3) ----- 代理人Customer 0x0 ...

  10. HCIA-网络层IP地址

    TCP/IP 每一层关联性 网络接口层-->TYPE 上层的网络层 --> Protocol -->不同的传输层协议 DSAP SSAP IP地址 剩下的8个字节 IPV4地址 4个 ...