目录:

Spring的介绍
什么是Spring
什么是控制反转或者(依赖注入)
Spring管理Bean的方式
Set注入
构造器注入
自动装箱
如何将Spring的上下文交给Tomcat上下文进行管理

Spring 的介绍

Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用

简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

什么是控制反转(或依赖注入)

控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用中转到了外部容器,控制权的转移,是所谓反转。IoC还有一个另外的名字:“依赖注(DI=Dependency Injection)” ,即由容器动态的将某种依赖关系注入到组件之中.

spring管理Bean的方式

spring配置文件参数详情

  3.1 id:在容器中查找Bean的id(唯一、且不能以/开头)3.2 class:bean的完整类名3.3 name:在容器中查找Bean的名字(唯一、允许以/开头、允许多个值,多个值之间用逗号或空格隔开)3.4 scope:(singleton|prototype)默认是singleton3.4.1 singleton(单例模式):在每个Spring IoC容器中一个bean定义对应一个对象实例3.4.2 prototype(原型模式/多例模式):一个bean定义对应多个对象实例3.4 abstract:将一个bean定义成抽象bean(抽象bean是不能实例化的),抽象类一定要定义成抽象bean,非抽象类也可以定义成抽象bean3.5 parent:指定一个父bean(必须要有继承关系才行)3.6 init-method:指定bean的初始化方法3.7 constructor-arg:使用有参数构造方法创建javaBean

首先我们要导入spring依赖 。这里的spring版本是

<!-- 2、导入spring依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency>

1、set注入

基本数据类型
----引用数据类型
主要通过set方法来给找到配置文件注入值

我建了一个实体类,定义几个属性,重写set方法

package com.liuxia.ioc.web;import java.util.List;import com.liuxia.ioc.biz.UserBiz;/*** IOC的注入方式及各类类型*   set注入*      基本类型与string*      数组*      自定义类型*       *   *   构造注入*   自动装配*   spring4出现的*   byType:根据配置的Bean中的接口,在spring的上下文中寻找对应的实现类*   byName:根据配置的Bean中的接口名字,在spring的上下文中寻找对应的实现类*   *   * @author 2019072303**/public class UserAction {private UserBiz userBiz;private String uname;private int age;private List<String> hobby;public UserAction(String uname, int age) {this.uname = uname;this.age = age;
}public UserAction() {}public String getUname() {return uname;
}public void setUname(String uname) {this.uname = uname;
}public int getAge() {return age;
}public void setAge(int age) {this.age = age;
}public List<String> getHobby() {return hobby;
}public void setHobby(List<String> hobby) {this.hobby = hobby;
}public UserBiz getUserBiz() {return userBiz;
}public void setUserBiz(UserBiz userBiz) {this.userBiz = userBiz;
}public void upload() {userBiz.upload();}/*** 注入*/
public void test1() {System.out.println(this.uname);System.out.println(this.age);System.out.println(this.hobby);}}

然后spring的配置文件,对应的注入方式配置好property,然后我们就可以在其他类中调用test1输出属性值
引用注入就是把实体类直接注给我们拿配置的另外的类或接口,然后利用ref属性配置名字

spring-context.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"default-autowire="byName"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"><bean class="com.liuxia.ioc.impl.UserBizImpl1" id="userBiz"></bean><bean class="com.liuxia.ioc.web.UserAction" id="userAction"><!-- set注入用property标签 --><!--   <property name="userBiz" ref="userBiz"></property> --><!--  <property name="uname" ref="刘小萌妹子"></property> <property name="age" ref="18"></property> --><!-- 构造注入用constructor-arg标签 --><constructor-arg name="uname" value="刘小萌妹子"></constructor-arg><constructor-arg name="age" value="18"></constructor-arg><property name="hobby"><list><value>吃鸡</value><value>王者</value><value>英雄联盟</value></list></property></bean> <bean class="com.liuxia.ioc.web.OrderAction" id="orderAction"><!-- <property name="userBiz" ref="userBiz"></property> --></bean></beans>

运行结果:

2、构造注入

通过构造函数来给配置文件注入值,实体类和上面是一样的,我们可以把set方法注释掉,然后为属性写上构造方法,再在配置文件中配好constructor-arg,就可以成功注入属性值了

<constructor-arg name="uname" value="刘小萌妹子"></constructor-arg><constructor-arg name="age" value="18"></constructor-arg>

运行结果:

3、自动装配

byName是根据你配置的id还找到类,byType通过类型来配置,只会找到接口等,如果有两个类实现了同一个接口,那么就容易报错

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"default-autowire="byName"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"><bean class="com.liuxia.ioc.impl.UserBizImpl1" id="userBiz"></bean><bean class="com.liuxia.ioc.web.UserAction" id="userAction">

UserBizImpl1

package com.liuxia.ioc.impl;import com.liuxia.ioc.biz.UserBiz;public class UserBizImpl1 implements UserBiz {@Overridepublic void upload() {//   System.out.println("开始优化性能的代码");System.out.println("实现用户上传的功能");}}

UserBizImpl2

package com.liuxia.ioc.impl;import com.liuxia.ioc.biz.UserBiz;public class UserBizImpl2 implements UserBiz {@Overridepublic void upload() {System.out.println("开始优化性能的代码");System.out.println("实现用户上传的功能");}}

IocTest


package com.liuxia.ioc.test;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.liuxia.ioc.web.OrderAction;
import com.liuxia.ioc.web.UserAction;public class IocTest {public static void main(String[] args) {/*   UserAction userAction=new UserAction();userAction.upload();*///spring的上下文  ApplicationContext springContext = new ClassPathXmlApplicationContext("/spring-context.xml");UserAction userAction = (UserAction)springContext.getBean("userAction");OrderAction orderAction = (OrderAction)springContext.getBean("orderAction");userAction.upload();orderAction.upload();//userAction.test1();}
}

UserAction

package com.liuxia.ioc.web;import java.util.List;import com.liuxia.ioc.biz.UserBiz;/*** IOC的注入方式及各类类型*   set注入*      基本类型与string*      数组*      自定义类型*       *   *   构造注入*   自动装配*   spring4出现的*   byType:根据配置的Bean中的接口,在spring的上下文中寻找对应的实现类*   byName:根据配置的Bean中的接口名字,在spring的上下文中寻找对应的实现类*   *   * @author 2019072303**/public class UserAction {private UserBiz userBiz;private String uname;private int age;private List<String> hobby;public UserAction(String uname, int age) {this.uname = uname;this.age = age;
}public UserAction() {}public String getUname() {return uname;
}public void setUname(String uname) {this.uname = uname;
}public int getAge() {return age;
}public void setAge(int age) {this.age = age;
}public List<String> getHobby() {return hobby;
}public void setHobby(List<String> hobby) {this.hobby = hobby;
}public UserBiz getUserBiz() {return userBiz;
}public void setUserBiz(UserBiz userBiz) {this.userBiz = userBiz;
}public void upload() {userBiz.upload();}/*** 注入*/
public void test1() {System.out.println(this.uname);System.out.println(this.age);System.out.println(this.hobby);}}

Spring的上下文交给tomcat上下文管理

UserServlet


package com.liuxia.ioc.web;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.context.ApplicationContext;@WebServlet("/user")
public class UserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubdoPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("处理用户请求");ApplicationContext springContext = (ApplicationContext) req.getServletContext().getAttribute("spring_key");UserAction userAction = (UserAction)springContext.getBean("userAction");userAction.upload(); }
}

SpringLoadListenter

package com.liuxia.ioc.listener;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/*** spring 作为管理整个工程中所有的javabean,那么如何在用户发送请求的时候能够访问到指定的javabean呢*  处理方式:*       在监听器中 将spring的上下文交给tomcat的上下文中进行管理*       浏览器-->request-->servletContext-->springContext-->任意的javabean* * @author 2019072303**/@WebListener
public class SpringLoaderListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("tomcat一启动就触发了.....");//tomcat的上下文ServletContext tomcatContext = sce.getServletContext();String springXmlLocation=tomcatContext.getInitParameter("springXmlLocation");System.out.println("spring的上下配置文件:"+springXmlLocation);ApplicationContext springContext=null;if(springXmlLocation==null ||"".equals(springXmlLocation)) {//spring的上下文springContext = new ClassPathXmlApplicationContext("/spring-context.xml");}else {springContext = new ClassPathXmlApplicationContext(springXmlLocation);}tomcatContext.setAttribute("spring_key", springContext);}}

web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"id="WebApp_ID" version="3.1"><display-name>Archetype Created Web Application</display-name><context-param><param-name>springXmlLocation</param-name><param-value>/spring-other.xml</param-value></context-param><!-- 配置SpringListener --><!-- <listener><listener-class>com.liuxia.ioc.listener.SpringLoaderListener</listener-class></listener> -->
</web-app>

运行结果:

谢谢谢。。。。

Spring之IOC相关推荐

  1. Spring 实践 -IoC

    Spring 实践 标签: Java与设计模式 Spring简介 Spring是分层的JavaSE/EE Full-Stack轻量级开源框架.以IoC(Inverse of Control 控制反转) ...

  2. [Spring 深度解析]第6章 Spring的IoC容器系列

    6. Spring的IoC容器系列 ​ IoC容器为开发者管理对象之间的依赖关系提供了很多便利和基础服务.有许多IoC容器供开发者选择,SpringFramework的IoC核心就是其中一个,它是开源 ...

  3. Spring 容器IOC解析及简单实现

    这篇文章来自极客学院 : Spring 容器IOC解析及简单实现 最近一段时间,"容器"两个字一直萦绕在我的耳边,甚至是吃饭.睡觉的时候都在我脑子里蹦来蹦去的.随着这些天一次次的交 ...

  4. spring框架ioc(控制反转)第二讲

    配置applicationContext.xml: spring的ioc容器的配置文件:applicationContext.xml(默认名称) 配置schema约束: http://www.spri ...

  5. Spring中IoC的入门实例

    Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用.这一章先从Spring的IoC开始.所谓IoC就是一个用XML来定义生成对象的模式,我们看看如果来使用的. 数据模型 1.如下 ...

  6. 使用 spring 的 IOC 解决程序耦合——获取spring的Ioc核心容器,并根据id获取对象、核心容器的两个接口(ApplicationContext、BeanFactory)引发出的问题

    IOC概念和spring中的IOC 明确 ioc 的作用: 削减计算机程序的耦合(解除我们代码中的依赖关系). 使用 spring 的 IOC 解决程序耦合 获取spring的Ioc核心容器,并根据i ...

  7. Spring(IOC+AOP)

    Spring 容器(可以管理所有的组件(类))框架:        核心关注:IOC和AOP: Test:Spring的单元测试模块: spring-test-4.0.0.RELEASE Core C ...

  8. Spring(二)——IoC

    IoC(Inversion of Control)称之为控制反转,指的是在Spring框架的配置文件中声明对象,由框架负责创建对象,这叫做控制反转.实现方式有两种:DI(Dependency Inje ...

  9. 框架:简单实现Spring的IOC容器

    学习过Spring的同学都知道,Spring框架的核心就是IoC和AOP.Spring可以理解为一个工厂,负责对象的创建和对象间关系的维护.IoC即控制反转,简单点说就是原来的对象是在要使用之前通过在 ...

  10. Spring-学习笔记03【Spring的IOC和DI】

    Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...

最新文章

  1. mongodb之备份
  2. 向李开复和四中校长提问:AI时代来临,孩子的教育需要什么改变?
  3. Gym 101190D BZOJ 4842 Luogu P6967 LOJ #6071 [NEERC2016]Delight for a Cat (费用流)
  4. ajax联系人数,setInterval定时调用ajax实现在线人数统计
  5. ajxs跨域 php_PHP项目中是如何处理Ajax请求与Ajax跨域的
  6. Axiom3D:Ogre射线与点,线,面相交,鼠标操作3维空间.
  7. 《南溪的目标检测学习笔记》——预训练微调的学习笔记
  8. BorderLayout布局管理器设置3个按钮
  9. C#-is and as
  10. 工欲善其事必先利其器之学编程的电脑需要什么配置
  11. 谷歌浏览器扩展程序XDM_如何下载和安装扩展程序?
  12. Linux开机自动启动python脚本程序,或 Jetson nano或Jetson Xavier NX开机自动启动python脚本程序
  13. 停用所有计算机管理员权限,win10管理员权限被禁用怎么办_win10电脑管理员账户被禁用如何解开-win7之家...
  14. vue 使用组件显示农历日期
  15. 计算机准备打印却没动静,打印机显示正在打印但是没反应怎么办?
  16. java.lang.IndexOutOfBoundsExceptionInconsistency detected. Invalid view holder adapter position问题处理
  17. 基于 STM32 空气质量检测装置设计
  18. 全球最严立法限塑令,会带来什么?
  19. Converged Containers and Applications
  20. 企业邮箱注册申请流程,企业邮箱怎么注册账号?

热门文章

  1. 【蓝桥杯】Java_B组2015年省赛真题
  2. marlin固件函数解析
  3. ROS智能车自主导航roslaunch racecar_gazebo racecar_runway_navigation.launch报错
  4. python返回类型为anytype_python - Zeep的SOAP请求(Python) - 堆栈内存溢出
  5. java后台怎么解密md5,Java md5 密码加解密
  6. python appium+夜神模拟器 配置 笔记整理
  7. 【笔记】uniapp APP运行到夜神模拟器
  8. 计算机应用主要学PS,计算机应用专业PS模块考试标准.doc
  9. 单位根检验urdf_adf单位根检验(单位根检验的基本步骤)
  10. word 大纲视图的生成