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 基于 ...
随机推荐
- Spring 学习笔记(2) Spring Bean
一.IoC 容器 IoC 容器是 Spring 的核心,Spring 通过 IoC 容器来管理对象的实例化和初始化(这些对象就是 Spring Bean),以及对象从创建到销毁的整个生命周期.也就是管 ...
- 如何使用odoo的compute方法,自动计算odoo字段
前言 在odoo的ORM创建数据字段的过程中,我们会经常需要定义一些字段用来计算某一些字段只和或其他计算结果. 今天介绍一个很好用的方法compute计算属性,这个方法其实是属于写在odoo fiel ...
- DNS Bind日志详述
简介 在默认情况下,BIND9 把日志消息写到 /var/log/messages 文件中,而这些日志消息是非常少的,主要就是启动,关闭的日志记录和一些严重错误的消息:而将调试日志信息写入 BIND ...
- 线程Thread中的方法详解(二)
1.start() start()方法的作用讲得直白点就是通知"线程规划器",此线程可以运行了,正在等待CPU调用线程对象得run()方法,产生一个异步执行的效果.通过start( ...
- [编译] 8、在Linux下搭建 stm8 单片机的开发烧写环境(makefile版)
目录 一.SDCC(Small Device C Compiler)编译环境搭建 1.1.下载 1.2.编译 1.3.测试 二.Hex2Bin+命令行烧写工具配置使用 2.1.下载工具安装配置 2.2 ...
- jvm源码解读--16 cas 用法解析
CAS的意思是campare and sweep比较交换 这个如果不用代码会比较抽象,那么在源码中进行解释 void ATTR ObjectMonitor::enter(TRAPS) { // The ...
- java垃圾回收机制学习总结
最近学习了一下java垃圾回收机制,将其主要内容大致总结一下: 1.什么是垃圾回收机制 java GC机制(garbage collection,垃圾收集,垃圾回收),是java特有的机制,作为jav ...
- ifix 在切换菜单按钮弹出”已打开该画面“bug修复
在ifix项目中,实际上会用到点击按钮弹出按钮菜单,点击另一按钮弹出另一按钮菜单的情况.一般在使用过程中切换菜单可有如下两种普遍做法: 1.使用ClosePicture "Middle&qu ...
- PHP:字符串转数组,数组转字符串;字符串截取、替换、查找
字符串转数组$str = 'one|two|three|four'; print_r(explode('|', $str)); //explode 以字符串分割字符串到数组 $str = 'one t ...
- 【GCC编译器】Swing Modulo Scheduling
1. SMS 在 GCC 中的实现 1.1. 一些基本概念 (1)软流水(Software pipelining )是一种通过重叠不同迭代的指令,使其并行执行,从而改进循环中指令调度的技术.关键思想是 ...