Spring IOC

news2024/11/27 0:28:31

一、为什么要使用Spring?

Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。

为什么要使用Spring?原因很简单,Spring有很多特点:

轻量: Spring 是轻量的,基本的版本大约2MB。

控制反转: Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。

面向切面的编程(AOP): Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。

容器: Spring 包含并管理应用中对象的生命周期和配置。

MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。

事务管理: Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务

1.1、程序的耦合和解耦合

藕合就是程序间的依赖关系。解藕就是降低程序间的依赖关系。在开发过程中应做到编译期不依赖,运行时再依赖。

解藕思路:

1、使用反射来创建对象,而不使用new关键字

2、通过读取配置文件来获取要创建的对象全限定名

问:以前写的代码有什么问题?

创建java控制台程序

创建Dao类

 

创建service并调用Dao  

创建测试类并调用service  

层与层之间的关系通过new来实现调用,并且new对象时需要导入该对象所在的正确的包名,否则报错。这种关系称为耦合关系。

二、IOC

2.1、为什么要使用IOC?

IOC呢,也就是控制反转,它的核心思想就是把对象的管理权交给了容器,那么,应用程序如果需要使用某个对象的实例,就可以直接从IOC容器里获取了。

这种设计的好处就在于降低了程序中对象与对象之间的耦合性,使得程序的整个体系结构变得更加灵活。 

2.1、IDEA中使用IOC

第1步:创建一个普通Maven项目

 

第2步:添加依赖

在pom.xml中添加依赖

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>
    </dependencies>

三、切片1:通过xml使用IOC

3.1、注入Java实体

3.1.1、需求定义

 

使用IOC实现User对象的注入 

 

3.1.2、需求实现

User.java的创建

package practice.entity;

public class User {
    private int id;
    private String name;
    private Date birth;

    //Get和Set方法,重写toString方法
}

beans.xml配置文件

 

按图操作,将beans.xml配置文件设置成一个应用程序的上下文文件  

注入User对象的信息

在beans中配置User的信息,设定user的姓名等属性。

 

<?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="user" class="practice.entity.User">
        <property name="id" value="1001"></property>
        <property name="name" value="二哈"></property>
        <!-- 引用日期对象 -->
        <property name="birth" ref="date_ref"></property>
    </bean>

    <!-- 实例化日期对象 -->
    <bean id="date_ref" class="java.util.Date"></bean>
</beans>

创建测试类进行测试

package practice;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import practice.entity.User;

public class Test {
    public static void main(String[] args) {
        //在配置文件中获取应用程序上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //从ioc容器中获取User对象,并注入到myUser中
        User myUser = (User) context.getBean("user");
        System.out.println(user.toString());
    }
}

四、切片2:通过注解使用IOC

注解配置和 xml配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置的形式不一样。关于实际的开发中到底使用 xml还是注解,每家公司有着不同的使用习惯。

4.1、知识点讲解

4.1.1、@Component

用于创建对象的注解

相当于:<bean id="" class=""> 

作用: 把资源让 spring 来管理。相当于在 xml 中配置一个 bean。 属性: value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。

代码演示

User实体类

定义一个User实体类,通过@Component将该类的对象注入到IOC容器

package practice.entity;

import org.springframework.stereotype.Component;

@Component
//@Component("uuu")
public class UserInfo {
    public void showUser(){
        System.out.println("我叫二哈,今年18岁");
    }
}

beans.xml配置类

在配置类中我们通过component-scan注解扫描所有使用注解的类

 

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 扫描注解类 -->
    <context:component-scan base-package="practice"/>
</beans>

测试类  

package practice;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import practice.entity.User;

public class Test1 {
    public static void main(String[] args) {
        //读取Spring的核心配置文件
        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
        //从IOC容器中获取User对象
        User usr = (User) ctx.getBean("userInfo");
        usr.showUser();
    }
}

4.1.2、@Component衍生的注解

除了上面使用到的Component注解外还有几个常用的注解: @Component: 用于任意类的注入 @Repository: 用于标识在dao类上 @Service: 用于标识在Service类上 @Controller: 用于标识在控制器类上

Ps:使用方式和@Component一样

4.1.3、用于注入数据的注解

相当于:<property name="" ref="">

4.1.3.1、@Autowired

按照Bean的类型,从IOC容器中获取对象进行装配。

代码演示

UserInfo实体类

//@Component("uuu")
//@Component
@Repository
public class UserInfo {

    public void showUserInfo(){
        System.out.println("我叫二哈,今年18岁");
    }
}

UserService

通过@Autowired注解从ioc容器获取UserInfo对象

@Service
//@Scope("singleton") //单例
@Scope("prototype") //多例
public class UserService {

    @Autowired
    //@Resource
    private UserInfo userInfo;

    public void showUser(){
        System.out.println("哈哈哈,我是userService");
        userInfo.showUserInfo();
    }
}

beans.xml  

在beans.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 扫描注解类 -->
    <context:component-scan base-package="practice"/>
</beans>

测试类  

package practice;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test1 {

    public static void main(String[] args) {
        //读取Spring的核心配置文件
        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
        //从IOC容器中获取User对象
        UserService userService = (UserService) ctx.getBean("userService");
        userService.showUser();
    }
}

4.1.4、@ Scope

@ Scope注解:用于指定bean的作用范围,属性value:指定范围的取值。 常用取值:singleton(单例)、 prototype(多例)和生命周期相关,他们的作用就和在bean标签中使用init-method和destroy-methode的作用是一样的

案例:演示单例模式

修改service实现类

修改service实现类

@Service
//@Scope("singleton") //单例
@Scope("prototype") //多例
public class UserService {

//    @Autowired
    @Resource
    private UserInfo userInfo;

    public void showUser(){
        System.out.println("哈哈哈,我是userService");
        userInfo.showUserInfo();
    }
}

修改测试类  

package demo1;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test2 {
    public static void main(String[] args) {
        ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");
        UserService userService = (UserService) cxt.getBean("userService");
        userService.showUser();
        UserService userService1 = (UserService) cxt.getBean("userService");
        System.out.println(userService == userService1);
    }
}

 

五、Spring5的新注解

spring的核心配置文件除了可以用xml之外还可以使用一个java类来代替xml配置文件。如果要使用java类做为核心配置类,需要使用特定的注解,这些注解是在spring 5的版本中新加的

5.1、@Configuration

用于指定当前类是一个 spring 配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext(有@Configuration 注解的类.class)。 

5.2、@ComponentScan

用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的:
<context:component-scan base-package="com "/>是一样的
属性: basePackages:用于指定要扫描的包。和该注解中的 value 属性作用一样
语法:
@ComponentScan(basePackages = {"要扫描的包名1","要扫描的包名2",...})

5.3、综合应用

@Configuration和@ComponentScan的综合应用,零配置文件实现IOC

修改之前切片2的案例

第1步:将beans.xml配置文件删除

第2步:添加配置文件

使用@Configuration注解定义配置类,使用@ComponentScan注解开启注解的自动扫描

 

package demo2;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan({"demo2"})
public class SpringConfig {

}

 第3步:添加要注入到ioc容器的实体

package demo2;

import org.springframework.stereotype.Component;

@Component
public class UserIntro {

    public void showUserInfo(){
        System.out.println("我叫二哈,今年18岁");
    }
}

第3步:修改测试类

通过AnnotationApplicationContext获取IOC容器。

package demo2;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
    public static void main(String[] args) {
        ApplicationContext cxt = new AnnotationConfigApplicationContext(SpringConfig.class);
        UserIntro intro = (UserIntro) cxt.getBean("userIntro");
        intro.showUserInfo();
    }
}

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

RPA案例|云扩助力保险行业开启超自动化运营新阶段

近五年&#xff0c;全球平均保险深度总体呈小幅平稳下降趋势&#xff0c;2021年中国保险深度为4.15%&#xff0c;全球平均保险深度为5.96%&#xff0c;而美国、英国等发达国家的保险深度则保持在10%以上&#xff0c;中国保险深度仍然具有很大的上升空间。 为进一步拓展增量空间…

软考是什么?---2023年软考最全解析

软考是什么&#xff1f; 软考全称为&#xff1a;计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;发证机构为国家人力资源和社会保障部、工业和信息化部&#xff0c;简称为&#xff1a;人社部和工信部。中日韩三国互认&#xff0c;证书的含金量很高…

Navicat操作数据库与Mysql常见命令操作实战

一&#xff1a;Navicat下载与安装 官网下载链接&#xff1a;Navicat 下载完后直接安装即可 二&#xff1a;数据库的连接 1.打开Navicat软件&#xff0c;点击左上角连接按钮&#xff0c;选择mysql数据库 输入完成后双击连接名&#xff0c;连接成功后&#xff0c;小海豚变绿色 …

Advances in Graph Neural Networks笔记5:Dynamic Graph Neural Networks

诸神缄默不语-个人CSDN博文目录 本书网址&#xff1a;https://link.springer.com/book/10.1007/978-3-031-16174-2 本文是本书第五章的笔记。 懒得看了&#xff01;反正我也不是做这个的。以后要是真的去做动态图了也不是没资源找&#xff0c;这个我懒得看了&#xff0c;就写一…

CentOS 7安装Redis+Springboot整合Redis

1、虚拟环境条件&#xff1a; 已安装VMwareVMware Tools 使用的是视图界面并配置了基本开发环境&#xff0c;参照超详细VMware安装CentOs图文教程_Sq夏颜的博客-CSDN博客 2、直接把已经下载好的redis安装包拖进来&#xff0c;下载地址&#xff1a;CRUG网站 3、解压 tar -zxv…

美国fba海运清关基本流程

美国fba海运清关是美国物流运输的重要组成部分&#xff0c;准备好清关材料和正确流程是确保货物安全快速进口到美国的关键。虽然很多客户会选择双清包税的方式&#xff0c;但是当跨境电商越来越大的时候&#xff0c;双清包税的成本也会相应增加。选择自税不包清关&#xff0c;按…

react配置项目路径别名@

为什么有的项目引入路径写可以&#xff0c;自己的不行呢&#xff1f; 因为别人的项目是配置过路径别名的&#xff0c;就表示src目录&#xff0c;因此我们也需要配置一遍&#xff0c;以下是react项目示范&#xff0c;vue项目同理。 ts对指向src目录的提示是不支持的&#xff0…

Linux命令学习之原来最简单的ls命令这么复杂

ls命令的使用格式如下 ls [选项] [具体的文件] # [] 表示可选 直接在命令行输入ls将当前目录下的列出当前目录下的文件和目录。 1 2 $ls LICENSE README.md hello.c 也可以指定具体的目录和文件 1 2 3 $ls / bin dev home lib32 libx32 mnt proc run srv tmp …

Kotlin 基础学习笔记第七章——运算符重载及其他约定

如你所知&#xff0c;java在标准库中有一些与特定的类相关联的语言特性。例如&#xff0c;实现java.lang.Iterable接口的对象可以在for循环中使用&#xff1b;实现了java.lang.AutoCloseable接口的对象可以在try-with-resource语句中使用。 一、重载算术运算符 1、重载二元运算…

IIC的使用

借鉴于&#xff1a;蓝桥杯嵌入式快速通关篇&#xff0c;IIC通讯及EEPROM_穿上我的格子衫的博客-CSDN博客 IIC原理超详细讲解---值得一看_Z小旋的博客-CSDN博客_iic 总线空闲&#xff1a;SDA 1,SCL 1; 启动信号&#xff1a;SCL 1,SDA 1 -> 0; 停止信号&#xff1a;SCL …

【王道计算机网络笔记】物理层-通信基础

文章目录物理层接口特性典型的数据通信模型数据通信相关术语三种通信方式&#xff08;交互方式&#xff09;串行传输&并行传输&#xff08;数据传输方式&#xff09;同步传输&异步传输码元速率带宽失真失真的一种现象——码间串扰奈氏准则&#xff08;奈奎斯特定理&…

矩阵股份上市首日跌破发行价:振幅达10%,王冠为实际控制人

11月22日&#xff0c;矩阵纵横设计股份有限公司&#xff08;下称“矩阵股份”&#xff0c;SZ:301365&#xff09;在深圳证券交易所创业板上市。本次上市&#xff0c;矩阵股份的发行价为34.72元/股&#xff0c;发行数量为3000万股&#xff0c;募资总额约为10.42亿元&#xff0c;…

SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.15 SpringBoot 整合 task

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇5 整合第三方技术5.15 SpringBoot 整合 task5.15.1 SpringBoot 整合 …

对zygote的理解

一、 zygote的作用 启动SystemServer SystemServer需要用于zygote准备好的一些系统资源&#xff0c;比如常用类、注册的JNI函数、主题资源、共享库等等&#xff0c;直接从zygote那继承过来&#xff0c;SystemServer就不用重新再加载一遍&#xff0c;这样对性能有很大的提升。 …

CRM系统中联系人管理的十大好处

联系人管理通常是你的CRM策略中的一个关键部分。它是存储和组织联系人数据以便于访问的做法。简而言之&#xff0c;就是管理联系人数据的过程。如今联系人管理已内置到 CRM 系统中。因此&#xff0c;我们可以考虑利用系统软件将以下优点应用于联系人管理中。 1、更好、更持久的…

Matplotlib用法使用、Matplotlib绘图作图画图

一、Matplotlib Matplotlib&#xff1a;专门用于开发2D或3D图表&#xff0c;以渐进、交互式方式实现数据可视化 可视化是在整个数据挖掘的关键辅助工具&#xff0c;可以清晰的理解数据&#xff0c;从而调整我们的分析方法 能将数据进行可视化&#xff0c;更直观的呈现使数据…

希望所有计算机学生能看到这篇c语言教程

大部分程序员走入编程世界第一个学习的语言就是C语言。 作为一门古老的编程语言&#xff0c;c语言拥有48年的发展历程。 为什么要学习 C语言&#xff1f; C语言是学习计算机程序设计语言的入门语言。C语言是一门偏底层的语言&#xff0c;学好它&#xff0c;可以让你更好的了…

E - Fire! (双向bfs)

UVA-11624-Fire! 题意&#xff1a;在n*m的网格内&#xff0c;有一个人和n堆火&#xff0c;人可以往上下左右四个方向走&#xff0c;同时所有的火也会想四周蔓延&#xff0c;问你人可不可以在火包围他之前逃离这个n*m的范围。 思路&#xff1a;问人可不可以逃离这个范围&#xf…

m基于VDLL的矢量型GPS信号跟踪算法matlab仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 载波跟踪环是传统独立式GPS接收机最脆弱的环节&#xff0c;针对弱信号环境下其比伪码跟踪环路更容易失锁的问题&#xff0c;给出一种基于矢量频率锁定环&#xff08;vector-frequency lo…

集成学习-Boosting

Boosting 采用串行的方式训练&#xff0c;各基分类器之间有依赖。根据当前模型损失函数的负梯度训练新的弱分类器&#xff0c;将训练好的弱分类器以累加的形式结合到现有模型中。 过程中会不断减小损失函数&#xff0c;使模型偏差不断降低&#xff0c;方差不会降低。因为各弱分…