Spring简介及IOC使用

news2024/11/17 9:35:40

Spring介绍

官网:https://spring.io/

Spring是一个对象的容器,负责管理对象的创建、销毁,以及对象的属性注入,对象的之间的依赖关系。

Spring可以整合其它框架,他基于IOC和AOP来构架多层JavaEE系统,以帮助分离项目组件之间的依赖关系,简化企业开发。

Spring的组成

可分为:

数据访问/集成:Data Access/Integration

Web:springmvc
 
面向切面:AOP、Aspects
 
设备:Instrumentation
 
消息:Messaging
 
核心容器:Core Container
 
测试:Test

两个概念:依赖注入、控制反转 

依赖注入(DI)

Dependency Injection,创建对象实例时,同时为这个对象注入它所依赖的属性,也就是把每个bean与bean之间的关系交给容器管理,例如:在Service层注入它所依赖的Dao层的实例;在Controller层注入它所依赖的Service层的实例。

控制反转(IOC)

Inversion of Control,是一种设计思想,意思是说,开发者不需要人工的创建对象(只需要关注对象创建之后的操作),而是把创建的对象权利转交给Spring容器,让Spring容器去创建并管理这些对象,以达到程序的高度解耦的目的。

IOC使用

pom依赖等

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.qzcsbj.myspring</groupId>
    <artifactId>myspring</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <spring.version>4.3.14.RELEASE</spring.version>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
    </properties>

    <dependencies>
        <!-- spring需要的jar包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--<dependency>-->
            <!--<groupId>org.springframework</groupId>-->
            <!--<artifactId>spring-context-support</artifactId>-->
            <!--<version>${spring.version}</version>-->
        <!--</dependency>-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!--日志-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>

        <!--单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
创建一个实体类,添加:get、set方法、无参、有参构造方法、toString方法
package com.qzcsbj.bean;

/**
 * @公众号 : 全栈测试笔记
 * @博客 : www.cnblogs.com/uncleyong
 * @微信 : ren168632201
 * @描述 : <创建一个类,添加:get、set方法、无参、有参构造方法、toString方法>
 */
public class Person {
    private String name;
    private String job;

    public Person() {
        System.out.println("==============无参构造方法");
    }

    public Person(String name, String job) {
        System.out.println("==============带参构造方法");
        this.name = name;
        this.job = job;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", job='" + job + '\'' +
                '}';
    }
}

创建对象方式一:传统方式,new创建 

package com.qzcsbj.test;

import com.qzcsbj.bean.Person;
import org.junit.Test;

/**
 * @公众号 : 全栈测试笔记
 * @博客 : www.cnblogs.com/uncleyong
 * @微信 : ren168632201
 * @描述 : <>
 */
public class TestPerson {
    @Test
    public void test(){
        Person p = new Person("jack", "dev");
        System.out.println(p);
    }
}

创建对象方式二:Spring底层用反射创建对象

resources下创建spring配置文件

xml文件名字可以改,但是一般都保持这个名称: 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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="p1" class="com.qzcsbj.bean.Person">
        <property name="name" value="jack"/>
        <property name="job" value="tester"/>
    </bean>
</beans>

测试:

package com.qzcsbj.test;

import com.qzcsbj.bean.Person;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @公众号 : 全栈测试笔记
 * @博客 : www.cnblogs.com/uncleyong
 * @微信 : ren168632201
 * @描述 : <>
 */
public class TestPerson {
    // 创建对象方式一:传统方式,new创建
    @Test
    public void test(){
        Person p = new Person("jack", "dev");
        System.out.println(p);
    }

    // 创建对象方式二:使用Spring帮我们创建对象
    @Test
    public void test2(){
        // 启动加载配置文件,并启动Spring框架,得到一个context对象
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 从Spring容器中获取对象
        Person p1 = context.getBean("p1", Person.class);
        System.out.println(p1);
    }
}

结果

上面有红色警告,加日志,添加:log4j.properties

总结:

  第二种方式更灵活,对象没直接创建死,配置文件可以随时被修改,然后通过反射修改对象

  创建对象(不管是new还是通过反射)一定会调用构造方法,Spring帮我们创建对象默认调用无参构造方法

【bak1】

【bak2】

原文会持续更新,原文地址:https://www.cnblogs.com/uncleyong/p/17018342.html

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

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

相关文章

linux常用命令(六)- 文件属性查看

查看文件类型 - file file命令用于辨识文件类型。 语法 file [-bcvz] [文件或目录...]b&#xff1a;列出辨识结果时&#xff0c;不显示文件名称。c&#xff1a;详细显示指令执行过程&#xff0c;便于排错或分析程序执行的情形。v&#xff1a;显示版本信息。z&#xff1a;尝试…

基于麻雀搜索算法(SSA)优化长短期记忆神经网络参数SSA-LSTM冷、热、电负荷预测(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

第三十六讲:无线AP胖AP模式配置与管理

胖AP(Fat AP)配置一个开放式WLAN非常方便&#xff0c;需要完成的操作包括有线和无线两部分的配置。有线部分即ethernet接口的配置&#xff0c;保证AP能够接入Internet,无线部分的配置包括关联WLAN与VLAN&#xff0c;广播SSID,启用VAP&#xff0c;若无其他DHCP服务器的话&#x…

万物皆有裂痕,那是光进来的地方|2022年个人总结

前两天朋友说要做个视频&#xff0c;记录下2022年的不平凡。突然想到今年是否要写年终总结呢&#xff1f;反复挣扎后&#xff0c;感觉还是应该写个总结&#xff0c;一则记录这一年的不平凡&#xff0c;二则检视这一年的生活与工作状态。- 1 - 工作的危与机2022年对所有的人来说…

Cocos Creator 常见错误排查方法

Cocos Creator 新手开发的时候经常会遇到一些错误不知道如何解决&#xff0c;今天把这些错误总结一下&#xff0c;下次遇到的时候&#xff0c;自己知道如何分析。 对啦&#xff01;这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白&#xff0c;也有一些正在从…

【bp靶场portswigger-服务端2】身份认证漏洞-16个实验(全)

目录 一、身份验证定义 1、三个身份验证因素 2、身份验证和授权 3、身份验证漏洞的产生 4、实验的字典 二、基于密码的登录中的漏洞 1、强制策略 2、用户枚举 3、有缺陷的强力保护 实验1&#xff1a;通过不同响应的用户名枚举 实验4&#xff1a;通过细微不同的响应进…

【Web前端】一文带你吃透CSS(完结篇)

前端学习路线小总结&#xff1a; 基础入门&#xff1a;HTML CSS JavaScript 三大主流框架&#xff1a;VUE REACT Angular 深入学习&#xff1a;小程序 Node jQuery TypeScript 前端工程化 文章目录一.CSS布局-对齐1.水平对齐1.1元素居中对齐1.2文本居中对齐1.3图片居中对齐1.4使…

九章 - 2022年度文章大合集

今天&#xff0c;是九章成立的第639天&#xff0c;元旦节。九章全体员工在这里祝大家&#xff0c;2023年元旦快乐&#xff01;2022年&#xff0c;《九章智驾》这个账号里共发布了87篇原创深度内容&#xff0c;内容覆盖了自动驾驶的各个领域&#xff0c;有一直关注我们的读者的深…

怎么录屏?如何录制足球比赛直播视频?

等了多时&#xff0c;热血的足球赛事终于要来了。 不知道今年你看好哪支球队。皇马&#xff1f;曼联&#xff1f;拜仁&#xff1f; 虽然今年不用熬夜&#xff0c;但总是怕加班错过笔试。 今天给大家送一个安利神器&#xff0c;让你完美记录足球赛事精彩瞬间&#xff01; 如果您…

Eclipse JNI Demo --【Linux】

目录 1、建工程 2、建java类 3、生成头文件 4、CPP实现 5、配置及编译 6、验证 1、建工程 先创建一个android标准工程&#xff1a; 2、建java类 在com.phuket.tour.studio包下&#xff0c;建立一个Java文件Mp3Encoder.java&#xff0c;并且在文件中新增一个方法encode&…

MySQL数据库服务器的优化步骤

在数据库调优中&#xff0c;我们的目标就是响应时间更快&#xff0c; 吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮我们快速找到调优的思路和方式。 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢&#xff1f; 这里把思考的流程整理成下面这张图。整个流…

Docker环境下配置Es自定义分词器(ik)

分词 一个 tokenizer&#xff08;分词器&#xff09;接收一个字符流&#xff0c;将之分割为独立的 tokens&#xff08;词元&#xff0c;通常是独立 的单词&#xff09;&#xff0c;然后输出 tokens 流。 例如&#xff0c;whitespace tokenizer 遇到空白字符时分割文本。它会将…

路由 OSPF简介、OSPF与其它路由的区别、OSPF区域概念、OSPF路由代名词IR、BR、ABR、ASBR概念简介。

4.2.0 路由 OSPF&#xff08;简介、OSPF与静态、OSPF区域概念、OSPF路由代名词&#xff09; 目录OSPF简介OSPF与其它路由的区别OSPF区域概念OSPF路由代名词概念OSPF简介 OSPF 开放式最短路径优先&#xff08;Open Shortest Path First&#xff09; OSPF动态路由协议属于内部网…

【C语言 数据结构】二叉树

文章目录二叉树一、二叉树的概念二、二叉树的基本形态三、二叉树的性质四、特殊的二叉树五、二叉树的存储结构5.1 顺序5.2 链表5.2.1 二叉链表5.2.1 三叉链表六、二叉树的遍历先序遍历&#xff08;T L R&#xff09;中序遍历&#xff08;L T R&#xff09;后序遍历&#xff08;…

#P05807. 等差数列

Description 小J学习了等差数列&#xff0c;于是他很开心的知道了 123.....1005050. 现在他想知道&#xff0c;对于某个公差为1的等差数列&#xff0c;如果总和为N的话。 有多少个等差数列满足这个条件 Format Input 一行给出整数N N<10^12 Output 一行给出你的结…

【学习】domain adaptation、BERT

文章目录一、domain adaptation领域适应domain shiftdomain adversarial training![在这里插入图片描述](https://img-blog.csdnimg.cn/26ef051b6a6148cbadb2dc6a9067fce2.png)domain generalization二、自监督学习多语言BERT的跨语言能力交叉学科能力用人工数据进行预训练一、…

JUC高并发-进程与线程

1.idea快捷键 shiftalt向上箭头 &#xff1a;表示把代码向上移动一行 ctrlaltL&#xff1a;整理代码的格式 ctrlshiftF10&#xff1a;启动程序 2.进程与线程 2.1 进程与线程 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就…

多变量微积分1

叉乘的定义&#xff1a; 混合积的几何意义&#xff1a;就是平行六面体的体积 三个向量共面的充要条件&#xff1a; 这里要注意&#xff0c;混合机对应的就是三阶行列式的值。 平面方程&#xff1a; 点法式&#xff1a; 一般式&#xff1a; 截距式&#xff1a; 三点式&#xff…

CMake中link_libraries的使用

CMake中的link_libraries命令用于将库链接到稍后添加的所有targets.其格式如下&#xff1a; link_libraries([item1 [item2 [...]]][[debug|optimized|general] <item>] ...) 指定在通过诸如add_executable或add_library等命令链接稍后在当前目录或更低(below)目录中创建…

RabbitMQ实现延迟队列

业务场景&#xff1a; 延迟发送短信用户下单&#xff0c;若15分钟内用户未支付&#xff0c;取消订单预约工作会议&#xff0c;20分钟后通知所有参会人员 … 实现方式1&#xff1a;死信交换机 死信概念&#xff1a;当一个队列中的消息满足下列情况之一&#xff0c;就会变成死…