Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)

目录

  1 什么是spring框架

  2 spring框架的特点

  3 spring容器

    3.1 什么是spring容器

    3.2 spring容器创建对象的编程步骤

    3.4 spring容器创建对象的方式

    3.5 bean元素的几个重要属性

  4 IOC

    4.1 什么是IOC

    4.2 什么事DI

    4.3 DI的三种方式

1 什么是spring框架

  是一个开源的用来简化企业级应用开发的框架

 

2 spring框架的特点

  2.1 简化开发

    spring对一些常见的api(比如jdbc)做了封装,使用这些封装之后的api,代码会大大简化。
  比如,使用springjdbc来访问数据库,就不用考虑如何获取连接,关闭连接等操作。

  2.2 管理对象

    spring可以帮我们管理对象之间的依赖关系,这样一来, 软件更容易维护。

  2.3 集成其它框架

    spring可以将一些框架集成进来,更方便使用这些框架。、
  比如,可以利用spring集成mybatis(mybatis是一个用 来访问数据库的框架),这样mybatis用起来更加简单。 

 

3 spring容器

  3.1 什么是spring容器

    是spring框架当中的一个核心模块,用来管理对象。

  3.2怎么利用 spring容器 来创建对象

    3.2.1 创建一个 maven项目

      》记得让maven项目中出现 web.xml 这个配置文件 -->> 还记得咋整吗?

    3.2.2 导包

      spring-webmvc -->> 启动 spring容器 时需要用到
      junit -->> 进行单元测试时需要用到

    3.2.3 启动 spring容器

      》添加一个 spring容器 配置文件

        例:给Student类配置bean,只需在spring的配置文件中添加

          <bean id="stu" class="test.Student"></bean>

            id : 必须要保证唯一

            class:就是需要配置bean的类名,但是必须在前面加上 包名.
      》利用 ApplicationContext 的实现类 ClassPathXmlApplicationContext 去启动容器

    3.2.4 利用 getBean(String name, Class<T> requiredType) 来实例化对象

      注意:spring容器会利用相关类的无参构造器去创建实例,所以相关类中必须要有无参构造器,否则会报错:“找不到无参构造器”

       

  3.3 注意

    spring容器一旦启动,就会在 堆 中将所有配置了 bean 的类创建好一个实例

 1 package test;
 2 
 3 import java.io.Serializable;
 4 
 5 public class Student implements Serializable {
 6     private Integer id;
 7     private String name;
 8     private String gender;
 9     
10     
11     public Student() {
12         super();
13         System.out.println("New Student()");
14     }
15     public Integer getId() {
16         return id;
17     }
18     public void setId(Integer id) {
19         this.id = id;
20     }
21     public String getName() {
22         return name;
23     }
24     public void setName(String name) {
25         this.name = name;
26     }
27     public String getGender() {
28         return gender;
29     }
30     public void setGender(String gender) {
31         this.gender = gender;
32     }
33     
34     public String toString() {
35         return "Student [id=" + id + ", name=" + name + ", gender=" + gender + "]";
36     }
37     
38 }
Student类
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans" 
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context" 
 5     xmlns:jdbc="http://www.springframework.org/schema/jdbc"  
 6     xmlns:jee="http://www.springframework.org/schema/jee" 
 7     xmlns:tx="http://www.springframework.org/schema/tx"
 8     xmlns:aop="http://www.springframework.org/schema/aop" 
 9     xmlns:mvc="http://www.springframework.org/schema/mvc"
10     xmlns:util="http://www.springframework.org/schema/util"
11     xmlns:jpa="http://www.springframework.org/schema/data/jpa"
12     xsi:schemaLocation="
13         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
14         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
15         http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
16         http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
17         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
18         http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
19         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
20         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
21         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
22     
23     <bean id="stu" class="test.Student"></bean>
24     
25 </beans>
test.xml配置文件
 1 package test;
 2 
 3 import java.io.Serializable;
 4 
 5 import org.springframework.context.ApplicationContext;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 
 8 public class Test implements Serializable {
 9     public static void main(String[] args) {
10         ApplicationContext ac = new ClassPathXmlApplicationContext("test.xml");
11         System.out.println(ac);
12         
13         Student stu1 = ac.getBean("stu", Student.class);
14         System.out.println(stu1);
15     }
16 }
Test类

 

  3.4spring容器 实例化对象的三种方法

    3.4.1 利用无参构造器实现(很重要) 

      必须有无参构造器,如果已经添加了有参构造器,那么默认的无参构造器就会被覆盖;此时就需要手动添加一个无参构造器

    3.4.2 利用静态工厂方法实现(了解)

    3.4.3 利用实例化工厂方法实现(了解)

   3.5 bean元素的几个重要属性

    3.5.1 作用域

      scope 属性 : 用来指定作用域

      缺省值是 singleton(单例),如果值是prototype(原型),则可以创建多个对象,否则不可以

      我们一般使用 单例模式 就可以啦(即:默认值)

    3.5.2 生命周期

      初始化

        init-method属性:指定初始化方法

      销毁

        destroy-method属性:指定销毁方法

        只有作用域为单例的 bean, 销毁方法才有效

        必须使用这个spring容器接口:AbstractApplicationContext

    3.5.3 延迟加载

      默认情况下当 spring容器 启动之后,会将所有作用域为单例的 bean 都创建好

      lazy-init属性:指定是否延迟加载,值为 true 时延迟加载(一般不用延迟加载)

 

4 IOC(Inversion Of Controll 控制反转)

  4.1 什么事IOC

    对象之间的依赖关系交给容器来管理。

  4.2 什么是DI (Dependency Injection 依赖注入)

    容器通过调用set方法或者构造器来建立对象之间的依赖关系

    注:IOC是目标,而DI是手段

 

  4.3DI 注入的两种方式

    4.3.1 利用 set 方法完成依赖注入(掌握)

      注入类中必须有一个成员变量,该成员变量的类型必须是被依赖注入的类

      注入类中必须实现需要注入的那个成员变量的 set 方法

      set 方法进行依赖注入时,在配置文件中用到的是 property标签;如果需要注入的类中有有参构造器,那么必须实现无参构造器,因为有参构造器会覆盖无参构造器(注意:菜鸟一般吧无参构造器和有参构造器都实现)

      注意:注入类中那个成员变量的类型 一般都设定为被注入类的一个接口,这样有利于今后进行维护

      利用 property标签实现依赖注入

        <property name="stu" ref="student01"></property>

          name:需要依赖注入的成员变量

          ref:需要依赖注入类的id属性值

 

      

      图解:创建A的实例,而且B是注入到A中的;B类中必须实现无参构造器,A中必须添加一个类型为B的成员变量,而且还必须为该成员变量实现set方法,在spring配置文件中配置A和B的bean,而且在A的bean中还要利用property标签来实现B的依赖注入

    4.3.2 利用有参构造器完成依赖注入(掌握)

      这里的构造器是有参构造器,但是它的参数这是你需要注入的参数名,不包含其他的

 

      利用constructor-arg标签实现依赖注入

        <constructor-arg index="0" ref="b1"/>

          index:有参构造器中参数的位置,从0开始

          ref:依赖注入类的id属性值

      

      图解:创建A的实例,而且B是注入到A中的;B类中必须实现无参构造器,A中必须添加一个类型为B的成员变量;为A添加一个有参构造器,而且该有参构造器的参数只是你要注入的那个成员变量,不包含其他的;而且该有参构造器任然会覆盖无参构造器,所以如果想要使用无参构造器就必须先实现无参构造器;在spring的配置文件中配置A和B的bean,而且还需要用constructor-arg标签实现B的依赖注入

 

    4.3.3 自动装配(一般不用)

    注意:依赖注入一般都由注释实现

 

源代码链接:点击前往

转载于:https://www.cnblogs.com/NeverCtrl-C/p/6849543.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个传值的问题”*”与”*”

1/********************************************************* 2* Desc:参数传递&#xff1a;使用引用传递指针和直接传递指针地址的区别 3* Author:charley 4* DateTime:2010-12-7 11:00 02***********************************************************/ 03#include <…

spring boot 扩展之AutoConfigurationImportListener

最近阅读spring boot源码时发现&#xff0c;发现当spring使用ConfigurationClassParser加载使用Configuration注解类后&#xff0c;会使用AutoConfigurationImportSelector对加载的 Configuration注解的类进行一次过滤。当AutoConfigurationImportSelector过滤完成后会自动加载…

《高效程序员的45个习惯》-之一

敏捷开发是当下最流行的开发方法&#xff0c;它采用的是一种以人为核心、迭代、循序渐进的开发思想&#xff0c;值得你关注和学习。 最近我就阅读了一本有关敏捷开发的书籍&#xff0c;《高效程序员的45个习惯》。 它以“举反例”的方式来讲述了敏捷开发中程序员应该运用的…

《CLR via C#》之线程处理——线程基础

《CLR via C#》之线程处理——线程基础 《CLR via C#》之线程处理——线程基础windows为什么要支持线程线程开销CPU发展趋势CLR线程和Windows线程使用专用线程执行异步的计算限制操作线程调度和优先级windows为什么要支持线程 早期的操作系统只有一个执行线程&#xff0c;但同时…

spring boot之从零开始开发自己的网站

概述 首先要感谢两位大神&#xff0c;该项目的想法来源自tale和MyBlog。 做了一些改造&#xff0c;增加了一些功能和一些代码的重构&#xff0c;并且更换了博客主题。 关于项目&#xff0c;对于开发的练手项目&#xff0c;能够工程化&#xff0c;严谨一些。 关于文档&#x…

python day5--正则表达式

#----正则表达式 import re elink <a href"(.*)">(.*)</a> info <a href"http://www.baidu.com">baidu</a> cinfo re.findall(elink,info) print (cinfo) import re print(re.search (r^a,abc\neee)) #预期结果 ^匹配字符开…

WCF系列教程之WCF客户端调用服务

1、创建WCF客户端应用程序需要执行下列步骤 (1)、获取服务终结点的服务协定、绑定以及地址信息 (2)、使用该信息创建WCF客户端 (3)、调用操作 (4)、关闭WCF客户端对象 二、操作实例 1、WCF服务层搭建:新建契约层、服务层、和WCF宿主,添加必须的引用(这里不会的参考本人前面的随…

短信认证方案,用手机短信进行上网认证如何实现?

WFilter NGF的“Web认证”模块&#xff0c;提供了一系列的上网认证解决方案。包括如下认证方式&#xff1a;本地用户名密码认证AD域用户名密码认证企业邮箱用户名密码认证Radius用户名密码认证微信WiFi认证Facebook Wifi认证除此&#xff0c;WFilter NGF还有一个“其他”的选项…

Nginx 之一:编译安装nginx 1.8.1 及配置

转http://www.cnblogs.com/zhang-shijie/p/5294162.html 一&#xff1a;基介绍 官网地址www.nginx.org&#xff0c;nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的&#xff0c;开发工作最早从2002年开始&#xff0c;第一次公开发布时间…

PI校正环节的程序实现推导过程

PI校正环节在经典控制论中非常有用&#xff0c;特别是对负反馈控制系统&#xff0c;基本上都有PI校正环节。1.下面分别说明比例环节和积分环节的作用&#xff0c;以阶跃信号为例。①比例环节单独作用以上分析说明&#xff0c;若只有比例环节的控制系统&#xff0c;阶跃响应也是…

vs里根据json快速创建对应类的方法

有时候,我们在调用别人接口的时候,服务端返回了一个json格式的字符串,我们要获取json里面的数据的话一般有两种方式: 1.通过正则 2.反序列化成一个对象 第一种方式这里不再多说,主要说一下第二种,(为什么呢&#xff0c;你看到后面 你也会喜欢上第二种) 有人肯定会说, json字符串…

人工智能之基于face_recognition的人脸检测与识别

不久乘高铁出行&#xff0c;看见高铁火车站已经实现了“刷脸进站”&#xff0c;而且效率很高&#xff0c;很感兴趣&#xff0c;今天抽时间研究一下&#xff0c;其实没那么复杂。 我基本上是基于https://github.com/ageitgey/face_recognition上的资料和源码做一些尝试和试验。 …

iOS 升级https的方案选择

我的选择是将UIWebView统一替换为WKWebView WKWebView AFN SDWebImage https的支持之前的博客都有涉及转载于:https://www.cnblogs.com/Jusive/p/6867531.html

Python3抓取糗百、不得姐

​点击关注 异步图书&#xff0c;置顶公众号 每天与你分享 IT好书 技术干货 职场知识 重要提示1:本文所列程序均基于Python3.6,低于Python3.6的Python版本可能无法运行.重要提示2:因所抓取的网站可能随时更改展示内容,因此程序也需及时跟进.重要提示3:本程序仅供学习,不能拿去做…

Oracle优化-表设计

前言  绝大多数的Oracle数据库性能问题都是由于数据库设计不合理造成的&#xff0c;只有少部分问题根植于Database Buffer、Share Pool、Redo Log Buffer等内存模块配置不合理&#xff0c;I/O争用&#xff0c;CPU争用等DBA职责范围上。所以除非是面对一个业已完成不可变更的系…

Win10远程桌面 出现 身份验证错误,要求的函数不受支持,这可能是由于CredSSP加密Oracle修正 解决方法...

升级至win10 最新版本10.0.17134&#xff0c;远程桌面连接Window Server时报错信息如下&#xff1a; 出现身份验证错误&#xff0c;要求的函数不正确&#xff0c;这可能是由于CredSSP加密Oracle修正。 解决方法&#xff1a; 运行 gpedit.msc 本地组策略&#xff1a; 计算机配置…

Rsyslog 日志相关内容

[rootserver vusers_home]# rpm -ql rsyslog|more ###.so结尾为模块&#xff0c;模块有分im为输入模块&#xff0c;om 为输出模块/etc/logrotate.d/syslog/etc/pki/rsyslog/etc/rc.d/init.d/rsyslog/etc/rsyslog.conf/etc/rsyslog.d/etc/sysconfig/rsyslog/lib64/rsyslog…

MFC导出对话框类DLL的实现

1.新建基于对话框的应用程序 2.新建MFC DLL工程 3.选择MFC DLL 4.选择扩展Dll选项&#xff08;重要&#xff01;&#xff01;&#xff01;&#xff09; 5.为Dll工程添加一个MFC类&#xff0c;基类为CDialogEx 6.Dll新建的MFC 类中添加resource.h防止编译出错…

身于“乱世”,我们程序员应该如何打算?

今天看了这篇文章&#xff0c; 发现自己也有点生处乱世&#xff0c;不平之感&#xff0c;但是文章的朴实却让我有了一个良好的反省&#xff0c;特此转载 分类&#xff1a; 项目管理 2011-09-04 00:58 770人阅读 评论(12) 收藏 举报 不仅要低头拉车&#xff0c;还要抬头看路。…

es6--箭头函数

基本用法 ES6允许使用“箭头”&#xff08;>&#xff09;定义函数。 var f v > v; 上面的箭头函数等同于&#xff1a; var f function(v) {return v; }; 如果箭头函数不需要参数或需要多个参数&#xff0c;就使用一个圆括号代表参数部分。 var f () > 5; // 等同于…