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 基于 ...
随机推荐
- [刘阳Java]_美团点评2018届校招面试总结_Java后台开发【转载】
美团喜欢一口气把三轮技术面和HR面一起面完,虽然身心比较累(每一面差不多一个小时),不过也算是一个好事,不像某些公司一天就一面然后让回去等消息,等面试通知也等得让人很焦虑,而且还容易出现面试时间冲突. ...
- Flyway使用说明
Flyway简介 Flyway是源自Google的数据库版本控制插件.项目开发中,数据库往往需要随着软件版本进行变化,相比起手动执行SQL脚本,flyway可以实现自动化的数据库版本修改,让开发/测试 ...
- SpringBoot总结之属性配置
一.SpringBoot简介 SpringBoot是spring团队提供的全新框架,主要目的是抛弃传统Spring应用繁琐的配置,该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配 ...
- springMVC-3-获取参数
RequestMapping修饰类 源码: 根据源码可以知道,requestmapping既可以修饰方法也可以修饰类 @Target({ElementType.METHOD, ElementType. ...
- 最小覆盖问题-POJ3041-P1129
POJ3041 这道题正解对于像我这种蒟蒻来说比较难以想到. 我们发现每次覆盖的只是一条线上的所有点.那么我们可以把它想象成一个二分图,两个集合分别是横轴和纵轴. 想一想,这实际上是不是就是x轴轴和纵 ...
- 单点登录详解(token简述)(七)
前言 为什么整理单点登录? 主要的原因还是自己以前学习的时候曾经用过,但是时间太久,忘记了里面用到了哪些技术.及如何实现的,每次想到单点登录总是感觉即会又不会,这次整理session时,又涉及到了单点 ...
- python基础问题
包安装相关问:如何安装Python三方包?在命令行如何检查一个包是否已安装?答:安装用pip install 卸载用 pip uninstall 直接import 这个包问:环境变量PATH的作用是什 ...
- 第四篇--Beyond Compare4 试用期30天后
30天后删除BCUnrar.dll这个文件,继续使用30天.还有就是注册表中regedit-->HEKY_CURRENT_USER-->Software-->Scooter Soft ...
- Python - 详解 range()
介绍 range 是一个类,不是函数 表示不可变的数字序列,通常用于在 for 循环中循环指定的次数 两种语法格式 range(stop) 表示区间 [0, stop) 内的整数序列 该区间从 0 开 ...
- MetaBase使用iframe内嵌到Vue页面样式优化
Matebase是一个开源,易上手的BI工具,这里不做太多介绍了. 官网地址:https://www.metabase.com/ 解决问题描述: 使用iframe内嵌Metabase公开链接之后,页面 ...