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. CSAPP:bomblab

    BOMBLAB实验总结 CSAPP实验BOMB,很头疼,看不懂,勉强做完了. 答案是这样的: Border relations with Canada have never been better. ...

  2. Leetcode:1008. 先序遍历构造二叉树

    Leetcode:1008. 先序遍历构造二叉树 Leetcode:1008. 先序遍历构造二叉树 思路 既然给了一个遍历结果让我们建树,那就是要需要前序中序建树咯~ 题目给的树是一颗BST树,说明中 ...

  3. vue3.0使用ant-design-vue进行按需加载原来这么简单

    下载 ui库 yarn add ant-design-vue 默认是全局引入,打包后体积很大, 非常影响首屏加载速度, 按需加载 下载按需加载的插件;推荐使用cnpm cnpm install bab ...

  4. 流畅的python学习1

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Mon Apr 20 21:08:08 202 ...

  5. 插入排序(insertion_sort)——Python实现

      # 插入排序 # 作用:对给出的n个顺序不定的数进行排序 # 输入:任意数组A # 输出:按顺序排列的数组A # 时间复杂度 n(n-1) 至 (n(n-1))/2   # 插入排序过程 # 第一 ...

  6. Android开发在Activity外申请权限调用相机打开相册

    问题描述: 最近在项目中遇到一个需要调用相册和打开相机的需求,但是,在Android 6.0以后,调用相册属于危险权限,需要开发者动态获取,这就意味着我们申请权限是与Activity绑定的,但如果一个 ...

  7. mysql采坑笔记

    mysqld --initialize-insecure // 初始化数据 mysql -u root -p // 登录 navicat for mysql 1251错误解决方法 ALTER USER ...

  8. transform——转换

    ① 位移 transform:translate(x,y);     同时x轴和y轴的位移 translate(x);        在x轴上的位移 同 translateX(x) translate ...

  9. switch-case例题

    根据订单的状态码打印对应的汉字状态(使用switch-case)1-等待付款 2-等待发货 3-运输中 4-已签收 5-已取消 其它-无法追踪 var n='2' switch(n){ case 1: ...

  10. 什么是 RFC 2544

    什么是 RFC 2544? 如果您从事网络工作,您可能听说过它,但 RFC 2544 究竟是什么呢? RFC 的全称是 Request for comment ,请求注解.是一系列收录了互联网国际标准 ...