Spring学习笔记1

news2024/12/25 9:17:36

1.核心概念
IoC(Inversion of Control)控制反转
对象的创建控制权由程序转移到外部,这种思想称为控制反转
在这里插入图片描述
Spring技术对IoC思想进行了实现
Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的“外部”
IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean
DI(Dependency Injection)依赖注入
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入

首先导入依赖:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.14</version>
</dependency>
        <!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>

然后创建对应的类,并导入bean标签

public class BookDaoImpl implements BookDao {
    @Override
    public void save() {
        System.out.println("DAO:添加了图书..");
    }
}

创建xml文件
applicationContext.xml

<bean id="bookService" class="com.mywork.service.impl.BookServiceImpl"/>

2.给bean对象赋值,注意赋值是依赖于set方法的,在实现类里必须要有set方法

public class BookServiceImpl implements BookService {

    //service需要依赖Dao
    private BookDao bookDao ;

    @Override
    public void save() {
        bookDao.save();
        System.out.println("service:添加书本..");
    }

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

id:bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id值唯一
class:bean的类型,即配置的bean的全路径类名

<!--1. 创建Dao的对象,并且把该对象存储到了spring的容器中-->
<bean id="bookDao" class="com.mywork.dao.impl.BookDaoImpl"/>



<!--使用bean标签即可使用spring的ioc的功能,让spring创建BookServiceImpl这个类的对象
    id:  该对象在容器中唯一标示,名字可以随意,但是要确保唯一性。
    class: 通知spring帮我们创建制定类的对象,并且放入spring的容器中。
-->
<bean id="bookService" class="com.mywork.service.impl.BookServiceImpl">
      <!--给对象的bookDao的属性赋值
           name: 属性名,属性名是依赖setter方法的。
           ref: 引用,引用另外一个对象给该属性赋值。
      -->
    <property name="bookDao" ref="bookDao"/>
</bean>

3.name 和scope
scope用来指定是单例还是多例,所谓单例就是指所有请求都用一个对象来处理;多例就是指每个请求用一个新的对象来处理;

<!--name作用:给对象起一个别名,name与id的区别:id只能配置一个,name可以配置多个,name多个别名是使用,; 空格分隔
    scope作用: 指定对象的作用范围, 常用两种: singleton(单例,默认) , prototype(多例)
-->
<bean id="bookService" name="bookService1,bookService2,bookService4 bookService5"
      class="com.mywork.service.impl.BookServiceImpl" scope="prototype">
      <!--给对象的bookDao的属性赋值
           name: 属性名,属性名是依赖setter方法的。
           ref: 引用,引用另外一个对象给该属性赋值。
      -->
    <property name="bookDao" ref="bookDao"/>
</bean>

4.不同方式创建实例

<!--方式一: 利用一个类的无参构造方法创建   以后最为常用的一种方式
    <bean id="bookDao" class="com.mywork.dao.impl.BookDaoImpl"/>
-->


<!--方式二: 利用静态工厂方法创建对象
    id: 该对象在spring容器中id
    class: 静态工厂类的全类名
    factory-method: 静态工厂的方法名

<bean id="bookDao" class="com.itheima.factory.BookFactoryBean" factory-method="getBookDao"/>
 -->

<!--方式三:非静态工厂方法创建对象
    步骤:
        1. 创建工厂类的对象
        2. 调用非静态方法创建制定类的对象
-->

<!--1. 创建工厂类的对象-->
<bean id="bookFactoryBean" class="com.itheima.factory.BookFactoryBean"/>

<!--2. 调用非静态方法创建制定类的对象-->
<bean id="bookDao" factory-bean="bookFactoryBean" factory-method="getBookDao2"/>

5.指定生命周期的调用方法
懒汉式一开始不会实例化,什么时候用就什么时候new,才进行实例化
饿汉式在一开始类加载的时候就已经实例化,并且创建单例对象,以后只管用即可。

<!--
    init-method:  指定创建对象的时候调用的初始化方法的方法名
    destroy-method: 销毁对象前指定调用的方法
    默认情况spring使用的是饿汉单例设计模式,如果需要修改饿汉单例设计模式,可以lazy-init修改
        lazy-init="true" 懒汉模式
        lazy-init=false  饿汉模式 , 默认
-->
<bean id="bookDao" class="com.mywork.dao.impl.BookDaoImpl" init-method="init" lazy-init="true" destroy-method="destroy" />

6.依赖注入
可以看到有setter和构造注入两种方式

  <!--利用构造器方式初始化成员变量-->
    <bean id="bookDao" class="com.mywork.dao.impl.BookDaoImpl">
        <constructor-arg name="connectionNumber" value="10"/>
        <constructor-arg name="databaseName" value="spring_db"/>
    </bean>




    <!--依赖注入方式一: 利用setter方法,使用property标签注入
        <bean id="bookService" class="com.mywork.service.impl.BookServiceImpl">
            <property name="bookDao" ref="bookDao"/>
        </bean>
    -->

    <!--依赖注入方式二:利用构造方法给对象注入成员变量值-->
    <bean id="bookService" class="com.mywork.service.impl.BookServiceImpl">
       <!--
        index:  构造方法的参数的索引值,从0开始
        name: 构造方法的形参的名字

       <constructor-arg index="0" ref="bookDao"/>
       -->
        <constructor-arg name="bookDao" ref="bookDao"/>
    </bean>
public class BookDaoImpl implements BookDao {

    private int connectionNumber;

    private  String databaseName;


   /* public void setConnectionNumber(int connectionNumber) {
        this.connectionNumber = connectionNumber;
    }*/

    public BookDaoImpl(int connectionNumber) {
        this.connectionNumber = connectionNumber;
    }

    public BookDaoImpl(int connectionNumber, String databaseName) {
        this.connectionNumber = connectionNumber;
        this.databaseName = databaseName;
    }

    @Override
    public void save() {
        System.out.println("DAO:添加了图书.."+connectionNumber+" 数据库的名称:"+ databaseName);
    }
}

7.依赖自动注入

<!--利用构造器方式初始化成员变量-->
<bean id="bookDao" class="com.mywork.dao.impl.BookDaoImpl">
    <constructor-arg name="connectionNumber" value="10"/>
    <constructor-arg name="databaseName" value="spring_db"/>
</bean>

<!--autowire: 创建该类对象的时候成员变量的初始化可以根据类型赋值,自动注入是依赖setter方法
    创建BookServiceImpl对象的时候发现,该类有一个成员变量需要BookDao,那么spring就会自动从容器中去
    查找是否有BookDao这种类型的对象。
-->
<bean id="bookService" class="com.mywork.service.impl.BookServiceImpl" autowire="byType"/>
public class BookServiceImpl implements BookService {

    //service需要依赖Dao
    private BookDao bookDao ;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    @Override
    public void save() {
        bookDao.save();
        System.out.println("service:添加书本..");
    }

}

public class BookDaoImpl implements BookDao {

    private int connectionNumber;

    private  String databaseName;


   /* public void setConnectionNumber(int connectionNumber) {
        this.connectionNumber = connectionNumber;
    }*/

    public BookDaoImpl(int connectionNumber) {
        this.connectionNumber = connectionNumber;
    }

    public BookDaoImpl(int connectionNumber, String databaseName) {
        this.connectionNumber = connectionNumber;
        this.databaseName = databaseName;
    }

    @Override
    public void save() {
        System.out.println("DAO:添加了图书.."+connectionNumber+" 数据库的名称:"+ databaseName);
    }
}

8.集合属性赋值

<bean id="bookDao" class="com.mywork.dao.impl.BookDaoImpl">
    <!--数组类型. 类型赋值就是使用array标签-->
    <property name="arr">
        <array>
            <value>110</value>
            <value>220</value>
            <value>330</value>
        </array>
    </property>

    <!--list集合赋值使用list标签-->
    <property name="list">
        <list>
            <value>狗娃</value>
            <value>狗剩</value>
            <value>铁蛋</value>
        </list>
    </property>

    <property name="set">
        <set>
            <value>凤姐</value>
            <value>芙蓉</value>
            <value>如花</value>
        </set>
    </property>

    <property name="map">
        <map>
            <entry key="凤姐" value="阿强"/>
            <entry key="芙蓉" value="阿伟"/>
            <entry key="如花" value="阿东"/>
        </map>
    </property>

    <property name="properties">
        <props>
            <prop key="username">root</prop>
            <prop key="password">root</prop>
            <prop key="url">jdbc:mysql:///spring-test</prop>
        </props>
    </property>
</bean>
public class BookDaoImpl implements BookDao {

    private int[] arr; //数组
    private List<String> list;  //list
    private Set<String> set;  //set集合
    private Map<String,String> map;  //map集合
    private Properties properties;  配置文件

    public void setArr(int[] arr) {
        this.arr = arr;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    @Override
    public void save() {
        System.out.println("Dao的save方法");
    }

    @Override
    public String toString() {
        return "BookDaoImpl{" +
                "arr=" + Arrays.toString(arr) +
                ", list=" + list +
                ", set=" + set +
                ", map=" + map +
                ", properties=" + properties +
                '}';
    }
}

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

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

相关文章

测试小白必备!初级软件测试面试题题库,你绝对要用

软件测试的面试过程中&#xff0c;面试官往往都会根据你面试的职位&#xff0c;提问一些相关的软件测试知识&#xff0c;而很多人为了能够提高的自己在面试当中的通过率&#xff0c;都会在面试前做好充足的准备。比如刷面试题&#xff0c;背答案、准备面试话术这些。今天&#…

JSP ssh 桌面网站系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh 桌面网站系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模 式开发。开发环境为TOMCAT7.0,My…

mes制造执行系统软件适用于哪些行业,有你所处的行业吗?

MES作为一种面向企业工厂生产加工的软件&#xff0c;为企业制造做出了巨大的贡献。虽然MES很实用很简单&#xff0c;但是也凸显了一个问题&#xff0c;有一些企业的生产方式是不适用于MES系统的。那具体哪些行业适合使用MES&#xff0c;哪些不适合。本文将为大家做详细的介绍。…

【Threejs】关于物体在场景中的阴影问题

一、基础知识 1、摄像机的属性结构 先了解一下摄像机THREE.Camera的四个基本参数 2、渲染器设置 render需要开启阴影渲染&#xff0c;这一点是大前提&#xff1a; renderer new THREE.WebGLRenderer();renderer.setSize(width, height);renderer.setClearColor(0x274F80,…

π122E31Q 超低功耗 200Mbps高速率 双通道数字隔离器兼容代替ADuM1201WURZ

π122E31Q 超低功耗 200Mbps高速率 双通道数字隔离器兼容代替ADuM1201WURZ&#xff0c;具有出色的性能特征和可靠性&#xff0c;整体性能优于光耦和基于其他原理的数字隔离器产品。 产品传输通道间彼此独立&#xff0c;可实现多种传输方向的配置&#xff0c;可实现 3.0kVrms 隔…

Python全栈开发(三)——python基础语法(二)

我们昨天说了python的数据类型&#xff0c;今天说说python的缩进规则和函数、python的顺序语句结构&#xff0c;条件和分支语句以及循环语句。缩进不规范会报错&#xff08;IndentationError: unexpected indent&#xff09;&#xff0c;python的函数使用&#xff0c;从定义到实…

【区块链 | EVM】深入理解学习EVM - 深入Solidity数据存储位置:存储

研究Solidity存储引用和智能合约存储布局 原文链接: https://betterprogramming.pub/all-about-solidity-data-locations-part-i-storage-e50604bfc1ad这是深入Solidity数据存储位置系列的另一篇。在今天的文章中,我们将更详细地介绍EVM中的一个重要数据位置:存储(Storage)…

feign简介与实战

一、JAVA 项目中实现远程接口调用 1&#xff09;Httpclient HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 JDK 自带…

APS生产排产软件在金属加工行业的应用

金属加工简称金工&#xff0c;指人类对由金属元素或以金属元素为主构成的具有金属特性的材料进行加工的生产活动。是一种把金属物料加工成为物品、零件、组件的工艺技术&#xff0c;包括了桥梁、轮船等的大型零件&#xff0c;乃至引擎、珠宝、腕表的细微组件。它被广泛应用在科…

C++入门(一)

目录 一. 关键字 二. 命名空间 三. 输入&输出 1.输出 2.输入 四. 缺省参数 1.全缺省参数 2.半缺省参数 五. 函数重载 1.类型 2.原理 一. 关键字 简单了解一下都有哪些关键字 二. 命名空间 在c语言的学习之中&#xff0c;我们知道&#xff0c;在同一…

js内置对象

包装类 <script>/*var anew Number(123);var bnew String("慕课网");var cnew Boolean(true);*/var a 123;var b 慕课网;var c true;console.log(a);console.log(typeof a);console.log(b);console.log(typeof b);console.log(c);console.log(typeof c); &…

WEB页面请求的过程

WEB页面请求的过程 需求&#xff1a;学校网络里的电脑访问到Google网络中的web服务器中 1、电脑通过物理网线接入校园网中 2、电脑运行DHCP协议&#xff0c;从本地的DHCP服务器获取一个IP地址&#xff08;DHCP服务器一般由网关路由器充当&#xff09; 获取过程&#xff1a; …

盛水最多的容器 + 接雨水(相向双指针)

目录 一、盛水最多的容器 二、 接雨水 2.1 - 前后缀分解 2.2 - 相向双指针 一、盛水最多的容器 题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使…

BPM结合低代码,为企业信息化建设添砖加瓦

编者按&#xff1a;业务流程管理和低代码平台结合的意义是什么&#xff1f;能为用户带来什么&#xff1f;本文了分析了低代码平台和BPM结合的意义&#xff0c;并进一步介绍了低代码BPM软件开发平台的应用场景。关键词&#xff1a;嵌入式流程激活&#xff0c;端到端流程打通&…

【ES6】模块化语法(默认、按需导入import导出export的操作)

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;ES6模块化语法(默认、按需导入导出的操作) 本文速览&#xff1a; 目录 本文速览&#x…

Word图片自动编号,调整图片顺序自动更新图片编号,引用该图片的地方也对应更新

Word图片自动编号&#xff0c;调整图片顺序自动更新图片编号&#xff0c;引用该图片的地方也对应更新1.软件环境⚙️2.问题描述&#x1f50d;3.解决方法&#x1f421;3.1.为图片添加题注&#xff0c;实现图片自动编号3.2.设置编号格式&#xff08;可选&#xff09;3.3.在文中引…

参数服务器的参数设置

#! /usr/bin/env python #condingutf-8 import rospy if __name__ __main__: #初始化节点 rospy.init_node(param_set) #新增参数 rospy.set_param(type_p,xiaohuangche) rospy.set_param(radius_p,0.15) #修改参数 rospy.set_param(radius_p,0.2…

我的【二哈喇子!】周岁生日

文章目录回看CSDN的2022新年新Flag回看CSDN的2022 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 各位朋友大家好&#xff0c;我是二哈喇子&#xff01;谢谢你现在在阅读这篇文章。 二零二二年一月二十一日&#xff0c;我的小二哈"出生"了&#x…

2022年报表开发工具Stimulsoft产品迭代汇总

Stimulsoft Reports是一款报告编写器&#xff0c;主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署&#xff0c;如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等&#xff0c;在你的应用程序中嵌入报告设计器…

AC7811-BLDC无感控制代码详解

BLDC控制框图 BLDC 的控制电路对电机转子位置信号进行逻辑变换后产生脉宽调制 PWM 信号&#xff0c;驱动逆变器的功率开关管&#xff0c;从而控制 BLDC 电机各相绕组按一定顺序工作&#xff0c;在电机气隙中产生跳跃式旋转磁场。BLDC 转子旋转时&#xff0c;每转过 60&#xf…