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

一:Spring Ioc,DI,AOP简介

  • IOC控制反转:将原本在程序中手动创建对象的控制权,交由Spring框架来管理

原理:

  1. 读取标注或者配置文件,看看Shoe依赖的是哪个Source,拿到类名
  2. 使用反射的API,基于类名实例化对应的对象实例
  3. 将对象实例,通过构造函数或者 setter,传递给 ShoeShop
  4. 以前是我们自己new对象(自己买材料,工具自己做鞋子),现在只要告诉IOC这个容器(鞋店),他自动给你new好,你直接取对象就好了,省去了我们自己new对象的过程
  • 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

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

</beans>

以上为自动生成的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方法删除,这将会报错)

 <bean id="shoe" class="com.blog.entity.Shoe"><!--这就相当于我们  Shoe show=new Shoe()-->
        <property name="name" value="安踏"></property><!--鞋子牌子  赋值-->
        <property name="price" value="300"></property><!--鞋子价格 赋值-->
        <property name="size" value="40"></property><!--鞋子尺码 赋值-->

    </bean>

这段代码就把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中配置如下

 <bean id="shoe" class="com.blog.entity.Shoe"><!--这就相当于我们  Shoe show=new Shoe()-->
        <property name="name" value="安踏"></property><!--鞋子牌子-->
        <property name="price" value="300"></property><!--鞋子价格-->
        <property name="size" value="40"></property><!--鞋子尺码-->

    </bean>
    <!--=====上是set=================宇宙无敌分界线=======下是构造器==================-->
    <bean id="shoe1" class="com.blog.entity.Shoe">
        <constructor-arg name="name" value="安踏"></constructor-arg><!--鞋子牌子-->
        <constructor-arg name="price" value="300"></constructor-arg><!--鞋子价格-->
        <constructor-arg name="size" value="40"></constructor-arg><!--鞋子尺码-->

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

 <bean id="shoe" class="com.blog.entity.Shoe"><!--这就相当于我们  Shoe show=new Shoe()-->
        <property name="name" value="安踏"></property><!--鞋子牌子-->
        <property name="price" value="300"></property><!--鞋子价格-->
        <property name="size" value="40"></property><!--鞋子尺码-->

    </bean>
    <!--======================宇宙无敌分界线=========================-->

    <bean id="shoeshop" class="com.blog.service.ShoeShop">
        <property name="id" value="1001"></property>
        <property name="name" value="安踏旗舰店"></property>
        <property name="shoe" ref="shoe"></property>//只改这里,没错,引用类型只要将valueg改为ref即可,ref的属性为其他对应的bean的id值,比如我这里有shop内需要一个shoe的对象,我们找到前面有一个bean的class为xxx.shoe,其id为shoe
    </bean>

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

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

    

原文地址:https://www.cnblogs.com/lixiang-nq/p/10503411.html

时间: 2024-11-07 00:18:00

Spring的学习二(Spring Ioc和DI,AOP简介)的相关文章

[原创]java WEB学习笔记97:Spring学习---Spring 中的 Bean 配置:IOC 和 DI

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Spring入门(一)— IOC、DI

一.Spring介绍 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架.简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架. Spring是2003年兴起的一个轻量级的java框架, 由 Rod Johnson 在其编著的<Expert one on one J2EE design and development

Spring入门(二)— IOC注解、Spring测试AOP入门

一.Spring整合Servlet背后的细节 1. 为什么要在web.xml中配置listener <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> 配置listener主要是为了捕获项目发布 | 服务器启动的契机 ,为了解析xml , 创建工厂. 这个listener是spring官方提供

Spring(三):IOC和DI

一.概述 IOC(Inversion of Controller):控制反转 “控制”指的是在我们的应用程序中创建对象的控制权 “反转”指的是原先在我们应用程序中创建对象都是我们手动去new一个对象,而现在我们将这个创建对象的权利交给spring容器. DI(Dependency Injection):依赖注入 “依赖”指的是在我们应用程序的开发过程中,Person类中的age属性和name属性 “注入”指的是在创建Person类的过程中,Spring容器根据配置帮助我们将Person类中的ag

Spring框架学习02——Spring IOC 详解

1.Spring IOC的基本概念 IOC(Inverse of Control)反转控制的概念,就是将原本在程序中手动创建对象的控制权,交由Spring框架管理.当某个Java对象(调用者)需要调用另一个Java对象(被调用者)时,在传统编程模式下,调用者通常会采用“new 被调用者”的代码方式来创建对象.这种方式会增加调用者与被调用者之间的耦合性,不利于后期代码的升级与维护.当Spring框架出现后,对象的实例不再由调用者来创建,而是由Spring容器来创建.Spring容器会负责控制程序之

Spring.Net学习笔记一(IOC第一个实例)

最近,即将要去新加坡出差,所以在签证这段时间比较空闲,所以想起学习点东西,由于接触过Unity,Autofac等IOC容器,没有接触Spring.Net,故想揭开它神奇的面纱.任何东西都是纸老虎! 首先还是来一个简单创建对象的例子. 第一步:我现在推荐使用Nuget来下载最新的程序集,这个能及时更新,而且能自动引起程序集所依赖的项. 第二步:增加配置文件,按照Sprint.Net手册增加配置文件. 第三步,进行测试运行. 代码如下: 新建的类库代码:Dao 1 namespace Dao 2 {

Spring核心技术(一)——IoC容器和Bean简介

IoC容器和Bean简介 这章包括了Spring框架对于IoC规则的实现.Ioc也同DI(依赖注入).而对象是通过构造函数,工厂方法,或者一些Set方法来定义对象之间的依赖的.容器在创建这些Bean对象的时候同时就会注入这些依赖.这个过程是根本上的反转了,不再由Bean本身来控制实例化和定位依赖,而是通过服务定位来控制这个过程,也是IoC(控制反转)的由来. org.springframework.beans和org.springframework.context包是Spring框架IoC容器的

&lt;Spring Data JPA&gt;二 Spring Data Jpa

1.pom依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4

[spring源码学习]二、IOC源码——配置文件读取

一.环境准备 对于学习源码来讲,拿到一大堆的代码,脑袋里肯定是嗡嗡的,所以从代码实例进行跟踪调试未尝不是一种好的办法,此处,我们准备了一个小例子: package com.zjl; public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void sayHello