网站功能提升权限,怎样给自己的网站做防红连接,注册网站不用手机短信验证的,怎么样推广最有效最快速文章目录 前言SpringSpring IOC 简介BeanIOC 概述IOC 本质理解 Spring IOC 应用IOC xml装配IOC 依赖注入IOC Bean的作用域 IoC 自动装配Bean 的自动装配注解实现自动装配 IoC 使用注解开发模拟实现Spring IoC 前言
“Spring”在不同的上下文中表示不同的事物。它可以用来引用 … 文章目录 前言SpringSpring IOC 简介BeanIOC 概述IOC 本质理解 Spring IOC 应用IOC xml装配IOC 依赖注入IOC Bean的作用域 IoC 自动装配Bean 的自动装配注解实现自动装配 IoC 使用注解开发模拟实现Spring IoC 前言
“Spring”在不同的上下文中表示不同的事物。它可以用来引用 Spring Framework 项目本身而这一切都是从那里开始的。随着时间的流逝其他 Spring 项目已经构建在 Spring Framework 之上。通常当人们说“Spring”时它们表示整个项目系列。
Spring 框架分为多个模块。应用程序可以选择所需的模块。核心容器的模块是核心包括配置模型和依赖项注入机制。除此之外Spring 框架为不同的应用程序体系结构提供了基础支持包括消息传递事务性数据和持久性以及 Web。它还包括基于 Servlet 的 Spring MVC Web 框架以及并行的 Spring WebFlux 反应式 Web 框架。
——摘自Spring Framework 中文文档https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/spring-framework-reference/core.html#spring-core
Spring中最重要的是 Spring 框架的控制反转(IoC)容器。对 Spring 框架的 IoC 容器进行彻底处理之后将全面介绍 Spring 的面向方面编程(AOP)技术。 Spring 框架具有自己的 AOP 框架该框架在概念上易于理解并且成功解决了 Java 企业编程中 AOP 要求的 80的难题。
Spring
Spring是 Java EE 编程领域的一个轻量级开源框架该框架由一个叫 Rod Johnson 的程序员在 2002 年最早提出并随后创建是为了解决企业级编程开发中的复杂性实现敏捷开发的应用型框架 。 Spring是一个开源容器框架它集成各类型的工具通过核心的 Bean factory 实现了底层的类的实例化和生命周期的管理。在整个框架中各类型的功能被抽象成一个个的 Bean这样就可以实现各种功能的管理包括动态加载和切面编程。
Spring IOC 简介
Bean
在 Spring 中构成应用程序主干并由Spring IoC容器管理的对象称为bean。bean是一个由 Spring IoC 容器实例化、组装和管理的对象。
简单来说它在 Spring 中定义为“普通、简单的类对象”
IOC 概述
控制反转Inversion of Control缩写为IoC是面向对象编程中的一种设计原则可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入Dependency Injection简称DI还有一种方式叫“依赖查找”Dependency Lookup。通过控制反转对象在被创建的时候由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说依赖被注入到对象中。
IOC 本质理解
IOC 控制反转实现了根本性的变化我们以前是在 Dao 层程序控制调用什么后续还会增加许多业务但都是基于接口实现的然后就需要在接口层去设配接口后续的对象。 以前程序是主动创建对象控制权在程序员手上使用自动注入后程序不再具有主动性变成被动的接受对象。
控制反转 loC(Inversion of Control)是一种设计思想DI (依赖注入)是实现 loC 的一种方法也有人认为 DI 只是 loC 的另一种说法。没有 loC 的程序中我们使用面向对象编程对象的创建与对象间的依赖关系完全硬编码在程序中对象的创建由程序自己控制控制反转后将对象的创建转移给第三方个人认为所谓控制反转就是:获得依赖对象的方式反转了。
采用XML方式配置 Bean 的时候Bean 的定义信息是和实现分离的而采用注解的方式可以把两者合为一体Bean 的定义信息直接以注解的形式定义在实现类中从而达到了零配置的目的。
控制反转是一种通过描述XML或注解并通过第三方去生产或获取特定对象的方式。在 Spring 中实现控制反转的是 loC 容器其实现方法是依赖注入(Dependency Injection,Dl)。
Spring IOC 应用
在 Spring 中有三种装配方式
在 xml 中显示配置在 java 中显示配置注解的方式隐式的自动装配 Bean
IOC xml装配 IOC 程序试验Hello 在 Maven 项目下在 pom.xml 中导入maven依赖 dependencies!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.20/version/dependency/dependencies创建 pojo 包新建实体类 Hello public class Hello {private String str;……getter、setterset方法必须存在Overridepublic String toString() {return Hello{ str str \ };}
}在 resources 下新建 ApplicationContext.xml官方名字这里为了理解 IOC 本质暂时将名字设为 beans.xml ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd!--使用Spring来创建对象这些对象都称为 Bean类型 变量名 new 类型();Hello hello new Hello();Spring xml配置文件中id 变量名class 所要new的对象--beansbean idHello classcom.hb.pojo.Helloproperty namestr valueHB/property!----/bean/beans
/beans创建测试类 public class HelloTest {public static void main(String[] args) {、/***提供给ApplicationContext构造函数的位置路径是资源字符串*这些资源字符串使容器可以从各种外部资源(例如本地文件系统Java CLASSPATH等)加载配置元数据。*///这句话是使用xml文件配置的固定语句用来获取 Spring 的上下文对象ApplicationContext context new ClassPathXmlApplicationContext(beans.xml);Hello hello (Hello) context.getBean(Hello);System.out.println(hello.toString());}
}运行结果为 Hello{strHB}这个过程并没有 new 对象对象是由Spring容器创建的这就是控制反转 总结 控制谁来控制对象的创建传统应用程序的对象是由程序本身控制创建的使用Spring后对象是由Spring来创建的。 反转程序本身不创建对象而变成被动的接收对象。 依赖注入就是利用set方法来进行注入的。 IOC是一种编程思想由主动的编程变成被动的接收可以通过newClassPathXmlApplicationContext去浏览一下底层源码可以发现Spring帮我们实现了很多东西。 那么从现在开始我们如果要实现不同的操作只需要在 xml 配置文件中进行修改所谓的 loC就是对象由 Spring 来创建管理和装配。 IOC 创建对象方式 默认的创建方式使用无参构造创建对象 在使用有参构造创建对象 第一种通过下标赋值 bean iduser classcom.hb.pojo.Userconstructor-arg index0 valueHB/constructor-arg index1 value42/
/bean第二种通过类型赋值 !--通过类型创建不推荐使用--
bean iduser classcom.hb.pojo.Userconstructor-arg typejava.lang.String value黄博/
/bean第三种通过参数名来设置 !--直接通过name赋值--
bean iduser classcom.hb.pojo.Userconstructor-arg namename value黄博/
/bean!--ref参数引用其他的id--
beansbean idbeanOne classx.y.ThingOneconstructor-arg refbeanTwo/constructor-arg refbeanThree//beanbean idbeanTwo classx.y.ThingTwo/bean idbeanThree classx.y.ThingThree/
/beansIoC 配置说明 别名 !--添加了别名也可以使用别名获取到这个对象--
alias nameuser aliashb/aliasBean 的配置 !--
idbean的唯一标识符 对象名
classbean 对象所对应的全限定名包名类名
name也是别名同时可以起多个
…………等等
--
bean iduser classcom.hb.pojo.User nameu1,u2property namename valuehb/property
/beanimport 用于团队开发将多个配置文件ApplicationContext.xml导入合并为一个。 import resourceApplicationContext1.xml/import
import resourceApplicationContext2.xml/import
import resourceApplicationContext3.xml/import使用的是时候直接使用总配置。
IOC 依赖注入 依赖注入set 注入 依赖bean 对象的创建依赖于容器注入bean 对象中的所有属性由容器来注入完成初始化 映射键或值的值或设定值可以是以下任何元素 bean | ref | idref | list | set | map | props | value | null试验所有注入 复杂类型创建 package com.hb.pojo;public class Address {private String address;…………一系列getter、setter、toString方法
} 真实测试对象 package com.hb.pojo;import java.util.*;public class University {private String name;private Address address;private String[] colleges;private ListString majors;private MapString,String classes;private SetString student;private Properties info;private String doctoralProgram;…………一系列getter、setterOverridepublic String toString() {return name name \n address address \n colleges Arrays.toString(colleges) \n majors majors \n classes classes \n student student \n info info \n doctoralProgram doctoralProgram;}
}ApplicationContext.xml ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdbean idadd classcom.hb.pojo.Addressproperty nameaddress value陕西省西安市/property/beanbean iduniversity classcom.hb.pojo.University!--常用第1种普通值注入value--property namename value西安邮电大学/property!--常用第2种Bean注入ref--property nameaddress refadd/property!--第3种数组注入--property namecollegesarrayvalue通院/valuevalue计院/value/array/property!--第4种List注入--property namemajorslistvalue通工/valuevalue物联网/value/list/property!--第5种map注入--property nameclassesmapentry key1 value通工1班/entry/map/property!--第6种set注入--property namestudentsetvalue张三/value/set/property!--第7种NULL注入--property namedoctoralProgramnull//property!--第8种Properties注入--property nameinfopropsprop key编号11664/prop/props/property/bean
/beans测试类 public class Test {public static void main(String[] args) {ApplicationContext context new ClassPathXmlApplicationContext(ApplicationContext.xml);University university (University) context.getBean(university);System.out.println(university.toString());}
}测试结果 p 命名和 c 命名空间注入 p 命名空间注入——对应 Set 方式注入 p 名称空间允许您使用bean元素的属性而不是嵌套的property/元素来描述协作 bean 的属性值或者两者兼而有之。 Spring 支持具有命名空间的可扩展配置格式命名空间基于 XMLSchema 定义。而 bean 配置格式是在 XMLSchema 文档中定义的。但是p 名称空间没有在 XSD 文件中定义只存在于 Spring 的核心中。 示例 beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:phttp://www.springframework.org/schema/pxsi:schemaLocationhttp://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd!--p命名空间注入可以直接注入属性的值property--bean iduser classcom.hb.pojo.User p:nameHB p:age21/bean
/beansc 命名空间注入——对应构造器注入 与带有p名称空间的XML快捷方式类似Spring 3.1 中引入的 c 名称空间允许内联属性用于配置构造函数参数而不是嵌套的构造函数 arg 元素。 !--必须有有参构造方法--
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:chttp://www.springframework.org/schema/cxsi:schemaLocationhttp://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd!--c命名空间注入通过构造器注入constructor-arg--bean iduser classcom.hb.pojo.User c:nameHB c:age21/bean
/beans注意p 命名和 c 命名空间注入不能直接使用需要导入约束xmlns:phttp://www.springframework.org/schema/p
IOC Bean的作用域
作用域描述singleton在spring IoC容器仅存在一个Bean实例Bean以单例方式存在bean作用域范围的默认值。prototype每次从容器中调用Bean时都返回一个新的实例。request每次HTTP请求都会创建一个新的Bean该作用域仅适用于 web 的 Spring WebApplicationContext 环境。session将单个bean定义范围界定为HTTP会话的生命周期。仅在web感知的Spring ApplicationContext的上下文中有效.application限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。websocket将单个bean定义范围界定为WebSocket的生命周期。仅在web感知的Spring ApplicationContext的上下文中有效。 单例模式Spring 默认机制 如果 bean 的作用域的属性被声明为 singleton 那么 Spring Ioc 容器只会创建一个共享的 bean 实例。对于所有的 bean 请求只要 id 与该 bean 定义的相匹配那么 Spring 在每次需要时都返回同一个 bean 实例。 bean iduser classcom.hb.pojo.User scopesingletonproperty namename valuehb/property
/bean原型模式每次从容器中 get 的时候都会产生一个新对象 当一个 bean 的作用域为 prototype表示一个 bean 定义对应多个对象实例。声明为 prototype 作用域的 bean 会导致在每次对该 bean 请求时都会创建一个新的 bean 实例每次获得的对象都是不同的。 bean idaccountService classcom.something.DefaultAccountService scopeprototype/其余的request,session 和 application这三个作用域都是基于 web 的 Spring Web ApplicationContext实现的只有在 web 环境下中会使用到。
IoC 自动装配
Bean 的自动装配
自动装配是 Spring 满足 Bean 依赖的一种方式Spring 会在上下文中自动寻找并自动给 Bean 装配属性
byName 自动装配 !--byName会自动在上下文中查找和自己对象set方法后面的值对应的 beanid;--bean iduser classcom.hb.pojo.User autowirebyNameproperty namename valuehb/property/bean注意需要保证所有的 bean 的 id 唯一并且这个 bean 需要和自动注入的属性的 set 方法的值一致
byType 自动装配 !--byType会自动在上下文中查找和自己对象属性类型相同的 bean;--bean iduser classcom.hb.pojo.User autowirebyTypeproperty namename valuehb/property/bean注意需要保证所有的 bean 的 class 唯一并且这个 bean 需要和自动注入的属性类型一致
注解实现自动装配
使用注解前需要
1、导入约束context 约束。
2、配置注解的支持context:annotation-config/
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdcontext:annotation-config/
/beansAutowired 注解最常用 Autowired 注解直接在属性上使用即可通过 byType 的方式实现例如 public class User {Autowiredprivate String name;Autowiredprivate int age;…………一系列getter、setter、toString方法
}拓展 Autowiredrequired false如果显示定义了 Autowired 的 required 的属性为 false 说明这个对象可以为 null否则不允许为空。 Nullable字段标记了这个注解说明这个字段可以为 null Qualifier(value“xxx”) Qualifier(value“xxx”)用于指定唯一的 Bean 对象注入。 如果 Autowired 自动装配的环境比较复杂自动装配无法通过一个注解【Autowired】完成的时候我们可以使用Qualifier(value“xxx”) 来配合 Autowired。 public class User {AutowiredQualifier(valuexxx)private String name;AutowiredQualifier(valuexxx)private int age;…………一系列getter、setter、toString方法
}Resource注解 public class User {Resourceprivate String name;Resourceprivate int age;…………一系列getter、setter、toString方法
}Resource 默认通过byName的方式实现如果找不到名字则通过byType的方式实现如果两个都找不到就报错。
IoC 使用注解开发
首先需要导入 context 约束来增加注解的支持
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdcontext:component-scan base-packagecom.hb.pojo/context:annotation-config/
/beansComponent Component 组件放在类上说明这个类被 Spring 管理了就是Bean例如 //Component组件等价于bean iduser classcom.hb.pojo.User/
Component
public class User {public String name HB;
}Value(“xxx”) Component
public class User {//等价于property namename valueHB/propertyValue(HB)public String name;
}衍生的注解 Component有几个衍生的注解在 web 开发中会按照 mvc 三层架构分层 dao【Repository】service【Service】controller【Controller】 这四个注解功能都是一样的都是代表将某个类注册到 Spring 中装配 Bean 作用域 Scope(“prototype”)表示 Bean 的作用域。
总结
xml 与注解
xml 更加万能适用于任何场合维护简单方便注解不是自己的类用不了维护相对复杂
xml 与注解结合使用xml 用来管理 bean注解只需完成属性的注入卫门在使用的过程中直须注意让注解生效开启注解的支持。
模拟实现Spring IoC
请见HB个人博客模拟实现 Spring IOChttps://blog.csdn.net/SwaggerHB/article/details/131015009