spring——spring的IOC和DI(Spring的核心思想)_ioc叫做__________,它是spring容器的核心思想,di叫做___________,它是-程序员宅基地

技术标签: spring  

什么是框架:

框架就是将一些重复的重要的代码进行模块化的集成。方便以后直接进行调用,目的来提高开发效率。

    SSH: sturs2 spring hibernate

    SSM:SpringMVC Spring Mybatis

Spring框架:

Spring的主要目的就是简化代码的开发,并且能够整合现阶段所有的主流框架,起到一个粘合剂的作用。在项目中使用Spring可以一站式的开发编程。编程效率大大提高。其中的IOC和DI以及AOP是Spring的两大核心技术。

Spring的IOC:

IOC叫做控制反转,就是将对象的创建权利发生反转,之前自己手动的创建对象,现在变成由Spring容器帮助创建生成新的对象。从此程序员无需关注对象的创建过程。无需关注对象的生命周期。

Peron p1 = new Person();    ----->自己手动完成

Person p2 = spring容器.get***();  ----->由spring容器创建

Spring的IOC的实现步骤:

0 导入jar包/依赖:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.1.5.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>5.1.5.RELEASE</version>
</dependency>
 
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
  <version>5.1.5.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-expression</artifactId>
  <version>5.1.5.RELEASE</version>
</dependency>

1.创建实体类:bean只要被spring管理的对象就是一个bean
在这里插入图片描述

2.编写配置文件(1.编写配置文件的头 2编写配置文件的实体内容)

    配置文件的名称:最好使用spring默认的名称 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"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context.xsd
  http://www.springframework.org/schema/aop
  http://www.springframework.org/schema/aop/spring-aop.xsd
  http://www.springframework.org/schema/tx
  http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--id="唯一标识这个bean" id绝对不能重复
        id的命名规则:首字母小写其他驼峰规则   PersonService
        class就是对象的具体路径
    -->

<!--给属性赋值-->
<bean id="car" class="cn.kgc.yhy.pojo.Car">
    <property name="id" value="1"/>
    <property name="carName" value="奔驰"/>
    <property name="brand" value="A8"/>
    <property name="speed" value="10000"/>
</bean>
<!--给构造方法赋值-->
<bean id="car1" class="cn.kgc.yhy.pojo.Car">
    <constructor-arg value="1"></constructor-arg>
    <constructor-arg value="法拉利"></constructor-arg>
    <constructor-arg value="N95"></constructor-arg>
    <constructor-arg value="30000"></constructor-arg>
</bean>

<!--给类中的对象赋值-->
    <bean id="car3" class="cn.kgc.yhy.pojo.Person">
        <property name="name" value="张三"/>
        <property name="age" value="18"/>
        <property name="car" >
            <bean id="car4" class="cn.kgc.yhy.pojo.Car">
                <property name="id" value="1"/>
                <property name="carName" value="奔驰"/>
                <property name="brand" value="A8"/>
                <property name="speed" value="10000"/>
            </bean>
        </property>
    </bean>
<!--给类中的对象赋值   通过引用其他bean-->
    <bean id="car5" class="cn.kgc.yhy.pojo.Person">
        <property name="name" value="张三"/>
        <property name="age" value="18"/>
     <property name="car" ref="car" />
    </bean>

<!--给类中的List集合赋值-->
    <bean id="car7" class="cn.kgc.yhy.entity.Car">
        <property name="id" value="1"/>
        <property name="carName" value="奔驰"/>
        <property name="brand" value="A8"/>
        <property name="speed" value="10000"/>
    </bean>

    <bean id="car6" class="cn.kgc.yhy.entity.Person">
        <property name="name" value="张三"/>
        <property name="age" value="18"/>
        <property name="car">
            <list>
                <ref bean="car7"></ref>
            </list>
        </property>
    </bean>

<!--类中Map集合赋值-->
    <bean id="car8" class="cn.kgc.yhy.doMain.Car">
        <property name="id" value="1"/>
        <property name="carName" value="奔驰"/>
        <property name="brand" value="A8"/>
        <property name="speed" value="10000"/>
    </bean>

    <bean id="car9" class="cn.kgc.yhy.doMain.Person">
        <property name="name" value="张三"/>
        <property name="age" value="18"/>
        <property name="car">
            <map>
                <entry key="AA" value-ref="car8"></entry>
            </map>
        </property>
    </bean>
</beans>

3.启动Spring容器:从容器中获取对象,调用方法完成相应的功能。

在这里插入图片描述

Spring对象创建和获取的原理:

spring容器在启动时,需要解析配置文件,配置文件按照逐行解析形式创建对象,根据Bean的class属性,通过反射调用创建对象之后注入在spring容器内部。Spring内部通过map的形式存储已经生成的对象。map中的key就是bean的ID,map中的value就是创建好的对象。

Spring创建对象的机制:

如果在创建对象时,如果出现任何的错误,那么整个spring容器将不会被启动。

Spring中获取对象的方式:
在这里插入图片描述

1.通过bean的ID获取对象:

    context.getBean("hello");  其中hello表示bean的ID

 2.通过class类型获取对象:context.getBean(Hello.class);   其中的参数表示class类型

    说明:虽然通过两种方式都可以获取对象,但是建议大家使用id获取,如果在xml中配置了多个class类型相同的bean那么就会报错。

在这里插入图片描述

别名标签alias:

<!--别名标签
    name属性中写起别名的bean的ID
    alias 别名中文英文都可以
 --> 
<alias name="hello" alias="hellokh83"/>
    如果想给一个bean器多个名字需要使用别名标签。

创建对象的方式:

1.默认构造方法创建对象(用的最多的)

    spring中默认创建对象的方式就是通过无参构造创建对象,所以以后在写构造方法时,一定要加无参构造,这样才能保证程序的正确运行。

 2.通过静态工厂创建对象(必须要有静态方法)

在这里插入图片描述

        静态工厂中,最为关键的部分就是静态方法,如果没有静态方法,那么必然报错。

        说明:通过静态方法创建对象,和通过类名.static方法 的方式一致。

3.实例工厂创建对象–先实例工厂,再创建对象

在这里插入图片描述

<!--通过实例工厂创建对象  -->
<bean id="newInstanceFactory" class="factory.NewInstanceFactory"></bean>
<!--     factory-bean="生产对象的工厂" 
         factory-method="工厂类中的方法"
        和对象.方法名类似
-->
<bean id="calendar2" factory-bean="newInstanceFactory" factory-method="getCalendar"></bean>

4.spring工厂创建对象

1.spring工厂必须实现FactoryBean<T>接口其中泛型T表示生产的对象

2.实现方法

在这里插入图片描述

3.配置文件中的配置
<!--通过spring工厂创建对象
class="spring工厂的类型"
  -->
<bean id="calendar3" class="factory.SpringFactory"></bean>

spring创建对象的单例和多例scope:

spring通过容器创建对象时,默认的都是单例的。在spring容器中对象只存在一份,如果使用该对象直接通过getBean()方法获取。

    1.在默认条件下对象是单例的

    2.scope="singleton"  强制是单例的

    3.scope="prototype"  代表多例对象

懒加载:

问题:由于spring在启动时会逐行解析,为每一个bean都会创建对象,这样的方式不是特别高效。

如果容器启动时只创建必须要使用的对象,而其他对象当调用getBean方法时才会被创建,这样的模式更加的高效

懒加载:当什么时候调用getBean方法时对象才会被创建。

     说明:在默认条件下spring的懒加载不生效。

        lazy-init="false"  懒加载不生效

        lazy-init="true"  懒加载生效

        default-lazy-init="false"    全局的懒加载配置,如果为false则懒加载不生效,如果为true则全部的bean都懒加载

        lazy-init="default"  应该与全局变量配置保持一致。

         如果全局变量与lazy-init不一致时以lazy-init为准

当scope遇到lazy-init时的问题(多例就是懒加载):

lazy-init="false"  scope="prototype" 设置懒加载不生效,scope为多例的。这时的配置lazy-init将不起任何效果,该配置必然懒加载。(因为spring只负责创建多例,不负责管理多例,所以多例的时候必然懒加载)

在Spring中对象只维护单例对象,只负责单例对象的生命周期,如果对象为多例时,spring只管创建该对象交给用户使用后将不再管理该对象,让该对象自生自灭。

注意:Spring只管单例不管多例,多例对象创建统统懒加载。

自定义初始化和销毁方法:

init-method="自定义方法的名称"   自定义的初始化方法

destroy-method="自定义销毁方法的名称"   自定义的销毁方法,spring在关闭的时候就会调用销毁方法。

在这里插入图片描述

容器中对象的生命周期:

1.调用构造方法创建对象

2.调动init方法初始化属性

3.调用目标方法完成相应的功能

4.调用销毁方法做收尾工作。

DI(依赖注入):

依赖注入一般注入可以是基本类型、字符串、对象的引用、集合(List,Set,Map)

注入的方式

    1.set方法注入

在这里插入图片描述

    2.map封装时使用linkedHashMap进行封装,是有序的。

    3.为引入类型赋值

        通过ref可以为引用类型进行赋值,name是新建的那个引用的名字,ref的值写的是bean的ID

在这里插入图片描述

说明:SpringIOC和DI的意义,使用了SpringIOC和DI能够在最大程度上减少代码的耦合性,并且扩展性特别的强。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45930636/article/details/104616704

智能推荐

HDLBits刷题全记录(三)_waveform sum,carry-程序员宅基地

文章浏览阅读499次。文章目录3.CircuitsCombinational LogicBasic GatesWireGNDNORAnother gateTwo gatesMore logic gates7420 chipTruth tablesTwo-bit equalitySimple circuit ASimple circuit BCombine circuits A and BRing or vibrateThermostat3-bit population countGates and vectorsEven lon_waveform sum,carry

oracle 更改adr路径,11g修改listner ADR-程序员宅基地

文章浏览阅读274次。修改listner ADR 有2种方法:一、禁用ADR,在lsnrctl 命令下修改log_directory的值,这也是网上大多数的修改方式。su - gridcd $ORACLE_HOME/netwrok/adminvi listener.oraDIAG_ADR_ENABLED_LISTENER=OFF --->禁用ADR修改好后,需要reload。[oracle:/oracle/app..._oracle11 集群修改 listener.ora diag_adr_enabled = off

宽带拨号失败服务器未响应什么意思,宽带拨号服务器未响应-程序员宅基地

文章浏览阅读584次。宽带拨号服务器未响应 内容精选换一换外部镜像文件在从原平台导出前,没有按照“Windows操作系统的镜像文件限制”的要求完成初始化操作,推荐您使用弹性云服务器完成相关配置。流程如图1所示。云服务器的正常运行依赖于XEN Guest OS driver(PV driver)和KVM Guest OS driver(UVP VMTools),未安装会对云服务器运行时的性能产生影立即对策略下的资源进行一...

对网络日志分析的几个方面-程序员宅基地

文章浏览阅读2.9k次。1、关键字排行分析 在搜索过程中,用户跟搜索引擎的交互都是通过输入的主题或者关键词来进行的,因此通过分析用户的査询主题对了解用户的兴趣非常有效,但还是充分表明有很多重复的查询请求,如果能提高这些词的查询质量就能使整体检索的质量提高很多,可以考虑引入缓存机制和建立动态的索引机制。2、URL排行分析 用户提交查询关键词后,搜索引擎根据关键词返回相应的查询结果,用户浏览该返回_网络日志分析

LaTex字体、符号汇总_latex画图字体-程序员宅基地

文章浏览阅读55次。LaTex字体、符号汇总_latex画图字体

在React项目中使用表格‘无缝滚动’_react 无缝滚动表格-程序员宅基地

文章浏览阅读3.7k次。在react项目中使用表格无缝滚动!一下是一个表格无缝滚动的封装组件import React from 'react';import { observer } from 'mobx-react';import { Table, Input, InputNumber, Popconfirm, Form } from 'antd';import './index.less';@obser..._react 无缝滚动表格

随便推点

电话手表安装linux系统吗,linux下dandroid wear开发环境搭建之手表连接调试-程序员宅基地

文章浏览阅读504次。开发时连接调试有两种方式:一种是手机与电脑链接,开启蓝牙调试后电脑的开发环境里可以识别手表,具体方式参照google官方教程.第二种是电脑与手表直接链接,这种方式与手机app开发没有区别,eclipse和adb都可以直接操作手表.这里记录下用第二种方式时遇到的问题和解决办法,在连接手表后发现adb device和eclipse都识别不了设备,显示各种错误,如:$ adb devicesList o..._手表刷linux

【IBM WebSphere MQ】命令集_ibm清理mq队列里的数据-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏11次。查MQ版本dspmqver显示所有队列管理器dspmq显示指定队列管理器dspmq -m name新建队列管理器crtmqm name启动队列管理器strmqsc name进入管理器命令runmqsc name查询队列管理器里的队列display queue(*) # 首先需要进入队列管理器队列类型QREMOTE 远程队列QLOCAL 本地队列QMODEL 模板队列QALTAS 别名队列关闭通道验证._ibm清理mq队列里的数据

Android 动画学习(一)之View Animation_android中view中动画持续的时间-程序员宅基地

文章浏览阅读8.8k次,点赞12次,收藏31次。转载请注明出处:Android动画初步 动画(Animation)在我们日常的Android开发工作当中使用得较为频繁,尤其对于Android游戏这个动画的集合体,掌握动画开发的重要性毋庸置疑。同样的,在Android应用开发中我们也经常使用动画效果来提升APP用户体验,比如应用中的图片的旋转,页面和页面之间的淡入淡出、左右渐入渐出切换效果等等。那从今天开始我们将进入_android中view中动画持续的时间

android多点触控技术-程序员宅基地

文章浏览阅读46次。为什么80%的码农都做不了架构师?>>> ...

Kafka+Zookeeper+Filebeat+ELK 搭建日志收集系统-程序员宅基地

文章浏览阅读145次。ELKELK目前主流的一种日志系统,过多的就不多介绍了Filebeat收集日志,将收集的日志输出到kafka,避免网络问题丢失信息kafka接收到日志消息后直接消费到LogstashLogstash将从kafka中的日志发往elasticsearchKibana对elasticsearch中的日志数据进行展示image环..._filebeat squid

html put 方法,HTML canvas putImageData() 方法-程序员宅基地

文章浏览阅读567次。在线示例下面的代码使用getImageData()复制画布上指定矩形的像素数据,然后使用putImageData()将图像数据放回画布上:示例html>HTMLcanvasgetImageData()方法使用-基础教程(nhooo.com)您的浏览器不支持HTML5canvas标签。varc=document.getElementById("myCanvas");varctx=..._多次调用putimagedata

推荐文章

热门文章

相关标签