怎么做电脑端网站设计稿,建筑工程公司名字起名大全,网站建设 通知,wordpress在后台去掉链接Spring IOC  DI 文章目录 Spring IOC  DI一、Spring是什么#xff1f;二、IOC(控制反转)2.1 通俗理解2.2 造汽车的例子理解IOC2.3 IOC详解1. 获取Bean2. 方法注解——Bean1. 应用场景#xff1a;2. 应用方法#xff1a;3. 注意要点#xff1a; 特别注意: 四、DI4…Spring IOC  DI 文章目录 Spring IOC  DI一、Spring是什么二、IOC(控制反转)2.1 通俗理解2.2 造汽车的例子理解IOC2.3 IOC详解1. 获取Bean2. 方法注解——Bean1. 应用场景2. 应用方法3. 注意要点  特别注意: 四、DI4.1 属性注入使用方法 4.2 构造方法注入使用方法 4.3 在setter方法注入使用方法 4.4三种注⼊优缺点分析4.5 Autowired出现多个同类型Bean的情况原因解决方法1. 使用 Primary 指定默认匹配的项目2. 使用autowireCandidate  false去除默认匹配3. 使用 Resource(name**)对于特定名称的Bean进行注入  4.6 Autowired和Rescource的区别   一、Spring是什么 
Spring是一个开发的框架包含了很多的依赖比如Spring MVC Spring Boot等这些让我们开发变得容易可以说Spring是一个包含很多工具方法的容器。 
二、IOC(控制反转) 
2.1 通俗理解 
Inversio of Control 也就是说Spring是一个 “控制反转” 的容器。 控制反转就是让一个事物的控制权交由其他人。 2.2 造汽车的例子理解IOC 
造汽车的流程 代码 汽车类 
package com.example.springioc.v1;public class Car {// 汽车依赖于框架private Frame frame;public Car() {frame  new Frame();System.out.println(汽车安装框架中...);}
} 
框架类 
package com.example.springioc.v1;public class Frame {// 框架依赖于底盘private Bottom bottom;public Frame() {bottom  new Bottom();System.out.println(框架安装底盘中...);}
} 
底盘类 
package com.example.springioc.v1;import jdk.jfr.Frequency;public class Bottom {// 底盘依赖于轮胎private Tire tire;// 有了尺寸的需求需要进行传参public Bottom(int size) {tire  new Tire(size);System.out.println(底盘安装轮胎中...);}
} 
轮胎类 
package com.example.springioc.v1;public class Tire {public Tire() {System.out.println(打造默认尺寸轮胎中...);}
} 
运行结果 这种代码架构每个类的控制权都在调用他的那一方中调用的一方创造了怎样的他那他就是怎样的。 如果想要更换任意尺寸的轮胎那就需要传递一个size参数此时要依次对于代码做修改。 
首先是轮胎类需要增加 size 属性但是这样最上层的 Car 类并不能够选择自己想要的尺寸仍然需要对于控制着 Tire 的Bottom进行添加参数以便Frame能够添加参数这样依赖Frame也得添加size参数Car 也需要。 
最终代码对于每一级都添加了size参数 
汽车类 
package com.example.springioc.v1;public class Car {// 汽车依赖于框架private Frame frame;// 对于汽车类添加了size参数构造public Car(int size) {frame  new Frame(size);System.out.println(汽车安装框架中...);}
} 
框架类 
package com.example.springioc.v1;public class Frame {// 框架依赖于底盘private Bottom bottom;public Frame(int size) {bottom  new Bottom(size);System.out.println(框架安装底盘中...);}
} 
底盘类 
package com.example.springioc.v1;import jdk.jfr.Frequency;public class Bottom {// 底盘依赖于轮胎private Tire tire;public Bottom(int size) {tire  new Tire(size);System.out.println(底盘安装轮胎中...);}
} 
轮胎类 
package com.example.springioc.v1;public class Tire {// 轮胎的大小private Integer size;public Tire() {System.out.println(打造默认尺寸轮胎中...);}public Tire(int size) {System.out.println(打造size号的轮胎中...);}
} 显而易见这样的代码架构维护起来非常臃肿 每一下级的控制权都由上一级保管如果对于下一级的需求发生了变化那么这就需要改动所有的类。比如如果现在用户需要对于轮胎的轮毂进行制定那就还需要给Tire的构造函数增添一个 style 属性如果还有颜色等的需求那就还得一直加只加Tire一个类的还好因为每一上级都直间或者间接依赖于这个Tire每一个类都需要进行修改耦合度非常高。 所以就需要 “控制反转” 思想将整个控制反转  修改后的代码 
package com.example.springioc.v2;import com.example.springioc.v1.Frame;public class Main {static class Tire {int size;public Tire(int size) {this.size  size;System.out.println(打造size号轮胎...);}}static class Bottom{Tire tire;public Bottom(Tire tire) {this.tire  tire;System.out.println(打造底盘...);}}static class Framework {Bottom bottom;public Framework(Bottom bottom) {this.bottom  bottom;System.out.println(打造框架...);}}static class Car {Framework framework;public Car(Framework framework) {this.framework  framework;System.out.println(打造汽车...);}}public static void main(String[] args) {Tire tire  new Tire(1);Bottom bottom  new Bottom(tire);Framework framework  new Framework(bottom);Car car  new Car(framework);}
} 这样一来如果用户对于轮胎有新的需求那也只需要修改轮胎这一个类完成了整个代码的解耦。 也就是说我们将控制权转让给了Tire自己Tire的上级类不再享有控制权传来什么Tire就用什么。 2.3 IOC详解 
控制反转之后对象进入Spring容器就会变成Bean也就是说Spring中的对象都叫做Bean。 
1. 获取Bean 
注册Bean使用五大注解让Spring Boot能够发现Bean主要方法使用 context 的 getBean() 进行获取得到的Bean就相当于从Spring Boot中取到了这个对象 2. 方法注解——Bean 
1. 应用场景 当对于外部类的方法无法通过修改源码进行注册Bean所以可以使用Spring的Import注解来导入一个配置类在这个配置类中你可以使用Bean注解来声明这个外部类作为一个Bean并对其进行配置。  如果一个类中需要多个实例可以使用Bean对于实例进行别名命名value和name以示区分。  
2. 应用方法 /*** 使用Bean的演示*/// 使用类获得整个类的BeanUser bean1  context.getBean(User.class);System.out.println(bean1);// li4是使用name属性定的别名User bean2  (User) context.getBean(li4);System.out.println(bean2);// user3是方法的名字User bean3  (User) context.getBean(user3);System.out.println(bean3);3. 注意要点 
Bean是方法级的注解需要配合类注解进行使用使用value和name属性可以命名别名Bean的名字就是方法的名字autowireCandidate 可以消除当有多个能够匹配的实例的时候排除这个实例 
特别注意: 
ComponentScan 可以定义Spring的扫描路径。 
使用方法 
ComponentScan({com.example.springioc.bean_test})直接在()中使用{}定义路径。 四、DI 
DI就是依赖注入。 
4.1 属性注入 
使用 Autowired 注入。 
使用方法 
package com.example.springioc.di_test.controller;import com.example.springioc.di_test.service.TireSeervice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;Controller
public class TireController {AutowiredTireSeervice tireSeervice;public void doTire() {System.out.println(成功调用轮胎控制器...);tireSeervice.doTire();}
} 使用 Autowired 将service属性注入到控制器中。 package com.example.springioc.di_test.service;import com.example.springioc.di_test.model.Tire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;Service
public class TireService {AutowiredTire tire;public void doTire() {tire.setSize(12);tire.setColor(红);System.out.println(制作tire.getSize()号tire.getColor()色的轮胎);}
} 同时在服务类中将需要的轮胎对象注入。 4.2 构造方法注入 
将构造方法使用 Autowired 注入。 
使用方法 
package com.example.springioc.di_test2.service;import com.example.springioc.di_test2.model.Tire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;Service
public class TireService {Tire tire;Autowired //构造函数上注入public TireService(Tire tire) {this.tire  tire;tire.setSize(12);tire.setColor(红);}public void doTire() {System.out.println(制作tire.getSize()号tire.getColor()色的轮胎);}} 在服务类的构造方法中使用Autowired 中注入。 package com.example.springioc.di_test2.controller;import com.example.springioc.di_test2.service.TireService;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;Controller
public class TireController {TireService tireService;Autowired //构造函数上注入public TireController(TireService tireService) {this.tireService  tireService;}public void doTire() {System.out.println(成功调用轮胎控制器...);tireService.doTire();}} 在控制类的构造方法使用Autowired 中注入。 4.3 在setter方法注入 
将构造方法使用 Autowired 注入。 
使用方法 
package com.example.springioc.di_test3.service;import com.example.springioc.di_test3.model.Tire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;Service
public class TireService {Tire tire;Autowired //set方法上注入public void setTire(Tire tire) {this.tire  tire;tire.setSize(1);tire.setColor(green);}public void doTire() {System.out.println(制作tire.getSize()号tire.getColor()色的轮胎);}} 在服务类的setter方法中使用Autowired 中注入。 package com.example.springioc.di_test3.controller;import com.example.springioc.di_test3.model.Tire;
import com.example.springioc.di_test3.service.TireService;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;Controller
public class TireController {private TireService tireService;Autowired //set方法上注入public void setTireService(TireService tireService) {this.tireService  tireService;}public void doTire() {System.out.println(成功调用轮胎控制器...);tireService.doTire();}} 在控制类的setter方法使用Autowired 中注入。 4.4三种注⼊优缺点分析 属性注⼊ ◦ 优点: 简洁使⽤⽅便 ◦ 缺点: ▪ 只能⽤于 IoC 容器如果是⾮ IoC 容器不可⽤并且只有在使⽤的时候才会出现 NPE空指 针异常 ▪ 不能注⼊⼀个Final修饰的属性  构造函数注⼊(Spring 4.X推荐) ◦ 优点: ▪ 可以注⼊final修饰的属性 ▪ 注⼊的对象不会被修改 ▪ 依赖对象在使⽤前⼀定会被完全初始化因为依赖是在类的构造⽅法中执⾏的⽽构造⽅法 是在类加载阶段就会执⾏的⽅法. ▪ 通⽤性好, 构造⽅法是JDK⽀持的, 所以更换任何框架,他都是适⽤的 ◦ 缺点: ▪ 注⼊多个对象时, 代码会⽐较繁琐  Setter注⼊(Spring 3.X推荐) ◦ 优点: ⽅便在类实例之后, 重新对该对象进⾏配置或者注⼊ ◦ 缺点: ▪ 不能注⼊⼀个Final修饰的属性 ▪ 注⼊对象可能会被改变, 因为setter⽅法可能会被多次调⽤, 就有被修改的⻛险  
4.5 Autowired出现多个同类型Bean的情况 
会发生报错 控制器类: 
package com.example.springioc.autowired_test;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;Controller
public class TestController {Autowired// 有两个String类型的BeanString name;public void sayHi() {System.out.println(name);}
} 
组件类: 
package com.example.springioc.autowired_test;import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;Component
public class BeanConfig {Beanpublic String test1() {return new String(zhang3);}Beanpublic String test2() {return new String(li4);}
} 可以看出组件中有两个String类型的Bean。 原因 
Autowired不知道选择哪个Bean进行注入发生了冲突需要解决这个冲突。 
解决方法 
1. 使用 Primary 指定默认匹配的项目 
2. 使用autowireCandidate  false去除默认匹配 
3. 使用 Resource(name**)对于特定名称的Bean进行注入   
4.6 Autowired和Rescource的区别 Autowired 是spring提供的注解Rescource是Java EE提供的注解  Autowired按照默认规则进行注入但是Rescource根据名称注入有更多的选项。  默认规则:    Qualifer 优先级高于Autowired  Autowired执行流程 按照类型查找,如果只查到一个,就直接注入 如果没有查到,报错 如果查找到了多个,根据名称查找,查找到了,注入 没有查找到,抛异常  Qualifier 按照名称和类型去查  Qualifier Autowired 直接按照类型Qualifier的名称去查如果Autowired对应的类型,只有一个,但是名称和Qualifier名称不一样,注入也是失败的  文章转载自: http://www.morning.tfwg.cn.gov.cn.tfwg.cn http://www.morning.madamli.com.gov.cn.madamli.com http://www.morning.vuref.cn.gov.cn.vuref.cn http://www.morning.rpwm.cn.gov.cn.rpwm.cn http://www.morning.qnlbb.cn.gov.cn.qnlbb.cn http://www.morning.cylbs.cn.gov.cn.cylbs.cn http://www.morning.sgtq.cn.gov.cn.sgtq.cn http://www.morning.bnylg.cn.gov.cn.bnylg.cn http://www.morning.dncgb.cn.gov.cn.dncgb.cn http://www.morning.plfrk.cn.gov.cn.plfrk.cn http://www.morning.ffwrq.cn.gov.cn.ffwrq.cn http://www.morning.xpzgg.cn.gov.cn.xpzgg.cn http://www.morning.dmwbs.cn.gov.cn.dmwbs.cn http://www.morning.nfks.cn.gov.cn.nfks.cn http://www.morning.bpmth.cn.gov.cn.bpmth.cn http://www.morning.kwqqs.cn.gov.cn.kwqqs.cn http://www.morning.fxwkl.cn.gov.cn.fxwkl.cn http://www.morning.ytbr.cn.gov.cn.ytbr.cn http://www.morning.wmpw.cn.gov.cn.wmpw.cn http://www.morning.nwbnt.cn.gov.cn.nwbnt.cn http://www.morning.rrcrs.cn.gov.cn.rrcrs.cn http://www.morning.kbdrq.cn.gov.cn.kbdrq.cn http://www.morning.npmx.cn.gov.cn.npmx.cn http://www.morning.plqsz.cn.gov.cn.plqsz.cn http://www.morning.yrrnx.cn.gov.cn.yrrnx.cn http://www.morning.eronghe.com.gov.cn.eronghe.com http://www.morning.sxygc.cn.gov.cn.sxygc.cn http://www.morning.qnbck.cn.gov.cn.qnbck.cn http://www.morning.wwthz.cn.gov.cn.wwthz.cn http://www.morning.bxhch.cn.gov.cn.bxhch.cn http://www.morning.duqianw.com.gov.cn.duqianw.com http://www.morning.jnptt.cn.gov.cn.jnptt.cn http://www.morning.wpmqq.cn.gov.cn.wpmqq.cn http://www.morning.pkrb.cn.gov.cn.pkrb.cn http://www.morning.kfrhh.cn.gov.cn.kfrhh.cn http://www.morning.smdkk.cn.gov.cn.smdkk.cn http://www.morning.kqzrt.cn.gov.cn.kqzrt.cn http://www.morning.reababy.com.gov.cn.reababy.com http://www.morning.ddjp.cn.gov.cn.ddjp.cn http://www.morning.krtcjc.cn.gov.cn.krtcjc.cn http://www.morning.wfkbk.cn.gov.cn.wfkbk.cn http://www.morning.tphrx.cn.gov.cn.tphrx.cn http://www.morning.jwpcj.cn.gov.cn.jwpcj.cn http://www.morning.ybshj.cn.gov.cn.ybshj.cn http://www.morning.zylrk.cn.gov.cn.zylrk.cn http://www.morning.bgygx.cn.gov.cn.bgygx.cn http://www.morning.pxbky.cn.gov.cn.pxbky.cn http://www.morning.kbqqn.cn.gov.cn.kbqqn.cn http://www.morning.mhfbp.cn.gov.cn.mhfbp.cn http://www.morning.wtnwf.cn.gov.cn.wtnwf.cn http://www.morning.yxkyl.cn.gov.cn.yxkyl.cn http://www.morning.hqzmz.cn.gov.cn.hqzmz.cn http://www.morning.cwfkm.cn.gov.cn.cwfkm.cn http://www.morning.hnhsym.cn.gov.cn.hnhsym.cn http://www.morning.rymd.cn.gov.cn.rymd.cn http://www.morning.gbpanel.com.gov.cn.gbpanel.com http://www.morning.dzgmj.cn.gov.cn.dzgmj.cn http://www.morning.sltfk.cn.gov.cn.sltfk.cn http://www.morning.rydhq.cn.gov.cn.rydhq.cn http://www.morning.hbqfh.cn.gov.cn.hbqfh.cn http://www.morning.ttdbr.cn.gov.cn.ttdbr.cn http://www.morning.bpmfg.cn.gov.cn.bpmfg.cn http://www.morning.krkwp.cn.gov.cn.krkwp.cn http://www.morning.yrms.cn.gov.cn.yrms.cn http://www.morning.bntfy.cn.gov.cn.bntfy.cn http://www.morning.dpmkn.cn.gov.cn.dpmkn.cn http://www.morning.jpdbj.cn.gov.cn.jpdbj.cn http://www.morning.khtyz.cn.gov.cn.khtyz.cn http://www.morning.fkfyn.cn.gov.cn.fkfyn.cn http://www.morning.ppzgr.cn.gov.cn.ppzgr.cn http://www.morning.bpmdq.cn.gov.cn.bpmdq.cn http://www.morning.tndhm.cn.gov.cn.tndhm.cn http://www.morning.jykzy.cn.gov.cn.jykzy.cn http://www.morning.btns.cn.gov.cn.btns.cn http://www.morning.bxqpl.cn.gov.cn.bxqpl.cn http://www.morning.lsnnc.cn.gov.cn.lsnnc.cn http://www.morning.cpnsh.cn.gov.cn.cpnsh.cn http://www.morning.rsfp.cn.gov.cn.rsfp.cn http://www.morning.zkdmk.cn.gov.cn.zkdmk.cn http://www.morning.mnbgx.cn.gov.cn.mnbgx.cn