首页 > 其他分享 >BeanFactery实现IOC,DI思想

BeanFactery实现IOC,DI思想

时间:2024-09-26 19:48:04浏览次数:8  
标签:UserDao Service DI Spring beanFactory BeanFactery bean 创建 IOC

一. 三种思想(Ioc,DI,AOP)
Ioc

inversion of control,控制反转,强调的是原来在程序中创建bean的权利反转给第三方。

DI

depency injection,依赖注入,强调的是bean之间的关系,由第三方负责设置。

AOP

aspect oriented programming,面向切面编程,功能的横向抽取,主要的实现方式就是Proxy。


这里一直都在提到bean,那么bean到底指的是什么,它和我们之前学的Javabean又有什么区别呢?

在Spring官方文档中对Bean的解释如下:

In Spring, the objects that form the backbone of your application and that are managed by the Spring loC container are called beans. A bean

is an object that is instantiated.

assembled. and otherwise managed by a Spring IoC container

译文:

在 Spring 中,构成应用程序主干并由Spring IoC容器管理的对象称为bean,bean是一个由Spring IoC容器实例化、组装和管理的对象。

简单来说,spring bean是由Spring Ioc容器自动管理的对象。

而java bean是符合java 规范的一种特殊类,提供get,set,hashcode,toString等方法,它需要手动创建和控制。

二. beanFactory获取bean对象

为了易于开发和维护,当我们想获取bean对象时,通常由第三方来控制,也就是这里的beanFactory,实现IOCDI思想。

步骤如下:

1.创建maven工程,引入Spring.context依赖。

Spring.context依赖:maven官网上这样说:Spring 上下文。“Spring Context 提供对已配置对象的访问,例如注册表(上下文)。 它从 Spring Beans 继承了其功能,并增加了对国际化、事件传播、资源加载和上下文透明创建的支持。”

2.创建Service接口及其实现类ServiceImpl(及一个涉及UserDao的方法),和UserDao接口和实现。(Bean),这里创建俩个bean,为了展示一下如何配置xml文件来让beanFactory处理他们之间的联系。也就是DI。

3.创建xml配置文件,如bean.xml。(取名随意)

这个文件就是专门用来配置Javabean的,以后我们需要用到什么就找beanFactory要,而beanFactory就从配置里找来用。

4.创建text类来实现

具体实现如下:

关于配置文件

<?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">
​
    //name="userDao",这里引用的是UserDao接口实现类中的方法setUserDao,要求u小写
    //而ref="UserDao"指的是id="UserDao"中的UserDao,这样就绑定了UserDao接口实现
    <bean id="Service" class="com.demo.impl.ServiceImpl">
        <property name="userDao" ref="UserDao"></property>
    </bean>
        
    <bean id="UserDao" class="com.demo.impl.UserDaoImpl"></bean>
​
​
</beans>

ServiceImpl中的方法

package com.demo.impl;
​
import com.demo.Service;
import com.demo.UserDao;
​
public class ServiceImpl implements Service {
    public void setUserDao(UserDao userDao){
        System.out.println("beanFactory调用该方法,从bean中获取设置到这里"+userDao);
    }
}
关于text类,即工厂来控制创建实例对象
import com.demo.Service;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
​
public class beanFactoryText {
    public static void main(String[] args) {
        //创建工厂对象
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        //创建读取器
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
        //读取配置文件给工厂
        reader.loadBeanDefinitions("bean.xml");
        //根据id获取bean实例对象
        ServiceImpl serviceimpl = (ServiceImpl) beanFactory.getBean("Service");
        UserDaoImpl UserDaoimpl = (UserDaoImpl) beanFactory.getBean("UserDao");
        //查看是否创建成功
        System.out.println(serviceimpl);
        System.out.println(UserDaoimpl);
​
        System.out.println("---------");
        
        //根据id获取bean实例对象
        Service service = (Service) beanFactory.getBean("Service");
        UserDao UserDao = (UserDao) beanFactory.getBean("UserDao");
        //查看是否创建成功
        System.out.println(service);
        System.out.println(UserDao);
    }
}
输出结果

哎我们发现,为什么创建的明明是两对不一样的实例对象,为什么返回的地址却对应相等呢?而又为什么只输出了一回“beanFactory调用该方法........”呢?

在我的理解下,应该是这样:

1.在我们进行配置bean的时候,”class“就指明了创建的实例对象的类型。

剩下一个问题呢,求问大佬解答,小白现在也不懂为什么。。

------------分割线啦-------------------

哦,有大佬讲到了一个新名词,单例模式。

就是说,“Spring的bean默认是单例模式,可以通过scope作用域去配置。”

什么是Spring的bean单例模式

1.一个类只能有一个实例

2.这个实例自己创建

3.整个系统都用这个实例

这样我们就知道了哦我们只能创建一个实例对象,调用其接口方法。再创建的话就无法实现。

更多关于单例模式的知识,写另外一个笔记上。

欧克,那我们这样就大概了解了IOC和DI的思想是如何体现的。

标签:UserDao,Service,DI,Spring,beanFactory,BeanFactery,bean,创建,IOC
From: https://blog.csdn.net/Ggjvhsjsj/article/details/142570293

相关文章

  • C# Linq.FirstOrDefault、Linq.Where、Linq.AsParallel、List.Exists、List.Find、Dic
    C#Linq.FirstOrDefault、Linq.Where、Linq.AsParallel、List.Exists、List.Find、Dictionar.TryGetValue、HashSet.Contains性能的比较 今天我们来比较一下集合检索方法性能更优问题,测试代码publicclassEntity{publicintId{get;set;}publicintNo{......
  • codeforces round 971(div4)E(二分答案,禁用数学方法)
    解题历程:开始想的是用数学公式的方法,利用公式推出二次函数,再求出根,再用根求出答案,检查了一个小时,结果怎么改都有细微的偏差,最后发现答案先单调递减在单调递增,那么可以用二分答案的方法查找最小的答案,二分对细节的处理要求比较高,于是在二分中加入了一个限制,当二分的区间小于5时,就......
  • 交替方向乘子法(Alternating Direction Method of Multipliers,简称ADMM)
    ADMMADMM简介交替方向乘子法(AlternatingDirectionMethodofMultipliers)通常用于解决存在两个优化变量的只含等式约束的优化类问题,其一般形式为:min⁡......
  • linux 操作系统下dig命令的使用和介绍
    linux操作系统下dig命令的使用和介绍dig(DomainInformationGroper)是一个强大的命令行工具,用于查询DNS(域名系统)服务器,获取有关域名及其相关记录的信息。它广泛用于网络管理和故障排除dig命令的基本功能查询DNS信息:dig可以查询各种类型的DNS记录,包括A记录(IP地址)、MX记......
  • [ABC234G] Divide a Sequence
    [ABC234G]DivideaSequence给定长度为\(N\)的序列\(A\),我们定义一种将\(A\)划分为若干段的方案的价值为每一段的最大值减去最小值的差的乘积,你需要求出所有划分方案的价值的总和,答案对\(998244353\)取模。$1\\leq\N\\leq\3\\times\10^5$$1\\leq\A_i\\leq......
  • redis自身查询很慢 排查redis-benchmark
    redis-benchmark 是一个用于测试Redis性能的基准测试工具,可以帮助开发人员评估和比较Redis在不同配置或负载情况下的吞吐量和延迟。通过 redis-benchmark 的测试结果,你可以获得qps、平均延迟、错误率等性能指标,从而根据需要进行调优和优化,确保Redis在实际生产环境中具有良......
  • Codeforces Round 971 (Div. 4)题解记录(G3待补)
    A.Minimize!暴力模拟一遍即可#include<iostream>#include<queue>#include<deque>#include<map>#include<set>#include<stack>#include<vector>#include<bitset>#include<math.h>#include<random>#include&l......
  • 无径之林DirectX组件报错大起底:原因、影响及修复步骤
    一、报错原因无径之林游戏在运行过程中,如果DirectX组件出现报错,通常是由以下几个原因造成的:DirectX版本问题:DirectX版本过低、损坏或未正确安装,都可能导致游戏无法正确调用DirectX的功能,从而引发报错。显卡驱动问题:显卡驱动程序过时、不兼容或安装不正确,会直接影响DirectX......
  • Docker容器启动Redis设置密码并持久化
    启动命令dockerrun--namewh-redis-p6379:6379-v/root/RedisData:/data-d--restartunless-stoppedredis--appendonlyyes--requirepass'Your-password'dockerrun:启动一个新的Docker容器。--namewh-redis:给容器指定一个名称,容器名为wh-redis。指定名......
  • 2 Redis实现分布式锁
    用Redis实现分布式锁的原理主要基于Redis提供的原子操作命令(如SETNX、EXPIRE等)和一些高级特性(如Lua脚本、RedLock算法等),来确保在分布式环境中对共享资源的互斥访问。以下是用Redis实现分布式锁的具体原理:一、分布式锁的基本步骤分布式锁的基本原理可以分为以下几个步骤:请求锁......