热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spring的学习二(SpringIoc和DI,AOP简介)

一:SpringIoc,DI,AOP简介IOC控制反转:将原本在程序中手动创建对象的控制权,交由Spring框架来管理IOC控制反转:将原本在程序中手动创建对象的控制权,交由Spr
一:Spring Ioc,DI,AOP简介
  • IOC控制反转:将原本在程序中手动创建对象的控制权,交由Spring框架来管理

            原理:

  1. 读取标注或者配置文件,看看Shoe依赖的是哪个Source,拿到类名
  2. 使用反射的API,基于类名实例化对应的对象实例
  3. 将对象实例,通过构造函数或者 setter,传递给 ShoeShop
  4. 以前是我们自己new对象(自己买材料,工具自己做鞋子),现在只要告诉IOC这个容器(鞋店),他自动给你new好,你直接取对象就好了,省去了我们自己new对象的过程
  5. 技术图片
  • DI:依赖注入:指 Spring 创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象

  • AOP:面向切面编程

  1. 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。
  2. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
  3. 所谓的周边功能,比如性能统计,日志,事务管理等等
  4. 周边功能在 Spring 的面向切面编程AOP思想里,即被定义为切面
  5. 在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP
  • DI注入两种方法:基于xml方式和基于注解方式

  1. 基于xml方式(有三种方法)
    1. set注入
    2. 构造器注入
    3. p命名空间注入

    (1)基于set方式注入(注意,这个原理是我们类中的set方法,也就是说我们必须在那个类中写set方法,你可以试一下,将set方法删除,这将会报错)首先在src目录下新建xml文件,取名为applicationContext.xml

技术图片



       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">
    

以上为自动生成的applicationContext.xml的代码,这里将是我们配置Spring的地方,我们将相应的包建好,在entity包中建好Shoe.java代码如下(注意,这个原理是我们类中的set方法,也就是说我们必须在那个类中写set方法,你可以试一下,将set方法删除,这将会报错)

package com.blog.entity;

public class Shoe {
    private int size;//尺码
    private String name;//鞋子名字
    private int price;//鞋子价格
  //重写tostring方法
  @Override
  public String toString() {
  return this.name+":"+this.size+":"+this.price;
  }
public int getSize() { return size; } public void setSize(int size) { this.size = size; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } }

 我们怎么将我们Shoe这个类放到IOC中,让IOC这个容器给我们初始化好呢?在applicationContext.xml中加入下面这段代码(注意,这个原理是我们类中的set方法,也就是说我们必须在那个类中写set方法,你可以试一下,将set方法删除,这将会报错)

 
        
        
        
        
    

 这段代码就把Shoe这个类放到了IOC容器中了,那么怎么从里面拿呢?我们新建一个Test类用来测试

 //拿到了context上下文对象,我们通过这个对象去获取IOC中的bean
        ApplicationContext cOntext=new ClassPathXmlApplicationContext("applicationContext.xml");//这个参数就是我xml的位置
        Shoe shoe=(Shoe)context.getBean("shoe");//这个参数是我们在bean里面的id值,通过这个,我们去IOC里找id为shoe,返回一个Object,用Shoe接受
        System.out.println(shoe);//通过之前的tostring方法,打印Shoe

 我们可以看到,我们拿到了Shoe这个对象及其属性(注意,这个原理是我们类中的set方法,也就是说我们必须在那个类中写set方法,你可以试一下,将set方法删除,这将会报错)技术图片

   (2)基于构造器方式注入(注意,这个原理是我们类中的构造器,也就是说我们必须在那个类中写有参数的构造器,你可以试一下,将有的参数构造器删除,这将会报错)

  在applicationContext.xml中新加bean,在bean中配置如下

 
        
        
        

    
    
    
        
        
        
        
    

test中代码和set方式注入一样,最终结果如下

技术图片

    2.基于注解方式

      这时候我们就不用去配置xml文件了,Shoe.java文件和上面一样,在类前加上 @Component  在属性前加@Value("值")技术图片

测试类中:之前的代码也都注释掉,因为我们获取bean的方法变了,(因为我们都没有去配置xml了)

package com.blog.test;

import com.blog.entity.Shoe;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestShoe {
    public static void main(String[] args){
        //拿到了context上下文对象,我们通过这个对象去获取IOC中的bean
       // ApplicationContext cOntext=new ClassPathXmlApplicationContext("applicationContext.xml");//这个参数就是我xml的位置
       // Shoe shoe=(Shoe)context.getBean("shoe");//这个参数是我们在bean里面的id值,通过这个,我们去IOC里找id为shoe,返回一个Object,用Shoe接受
       // System.out.println(shoe);
    
        ApplicationContext cOntext=new AnnotationConfigApplicationContext(Shoe.class);//通过Shoe.class,反射拿到Shoe所在的包和类名
        Shoe shoe=(Shoe)context.getBean("shoe");
        System.out.println(shoe);

    }
}

 结果如下

技术图片

当然,现在我们都是基本类型的注入,还有List Array Map 等等集合的注入,大家可以去百度怎么去注入,接下来还有一个引用类型的注入,我新建一个包,在包内新建shoeShop;(为了说明注解的其他配置项不在同一个包需要在xml文件配置扫描器 )

  <context:component-scan base-package="com.blog.service">context:component-scan>

set方法1配置引用类型:用ref

 
        
        
        

    
    
   
    
        
        
        //只改这里,没错,引用类型只要将valueg改为ref即可,ref的属性为其他对应的bean的id值,比如我这里有shop内需要一个shoe的对象,我们找到前面有一个bean的class为xxx.shoe,其id为shoe
     

 set方法2配置引用类型:用autowire="byName/byType/constructor"=====通过id//通过类型//通过构造器===========》自动装入,也就是IOC会根据我们的byName去找bean是否有id为shoe的//是否有类型为Shoede//是否构造器的参数一致的(也可以在头信息中一次性将所有的bean统一设置为自动装配 default-autowire="byName")

注解方法配:置引用类型(未完)2019年3月9日22:18:41

 

Spring的学习二(Spring Ioc和DI,AOP简介)


推荐阅读
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
author-avatar
dmcm0009
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有