SpringIOC

2023-11-17

一、Sping理解

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

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

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

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

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

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

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

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

二、SpringIOC(DI)控制反转(依赖注入)

2.1IOC理解

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

2.2创建过程

2.2.1新建Maven项目

2.2.2添加porm依赖

<!--Spring依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.0.RELEASE</version>
    </dependency>

刷新porm

2.2.3新建User类

package com.demo.enity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private int id;
    private String name;
    private String birth;
}

2.2.4新建Spring配置文件

在resources中添加

添加之后点击右上角将文件设置为应用程序的上下文文件

2.2.5注入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 name="user" class="com.demo.enity.User">
            <property name="id" value="001"></property>
            <property name="name" value="张三"></property>
            <property name="birth" value="1999-12-12"></property>
        </bean>
</beans>

2.2.6创建测试类进行测试

import com.demo.enity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        //解析beans.xml配置文件,将配置好的bean对象交给ioc容器管理
        //创建ioc容器
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //从IOC容器中获取User对象
        User u = (User) context.getBean("user");
        System.out.println(u);
    }

}

2.2.7引用数据类型的调整

假如我在User中添加引用数据类型Data的话

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 name="user" class="com.demo.enity.User">
            <property name="id" value="001"></property>
            <property name="name" value="张三"></property>
            <property name="birth" ref="date_ref"></property>
        </bean>
    <bean id="date_ref" class="java.util.Date"></bean>
</beans>

运行后

2.3SpringIOC进阶

2.3.1相关注解

@Component

用于创建对象的注解

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

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

代码演示

import org.springframework.stereotype.Component;
@Component
//@Component("hello")
//相当于在beans中写入了<bean id="userDao" class="com.demo02.dao.UserDao"/>
public class UserDao {
    public void select(){
        System.out.println("我是xxx,我喜欢xxx");
    }
}

@Component(“hello”)可以将<bean>标签中的id重命名为hello

@Component的衍生注解

除了上面使用到的Component注解外还有几个常用的注解:

@Component: 用于任意类的注入

@Repository: 用于标识在dao类上

@Service: 用于标识在Service类上

@Controller: 用于标识在控制器类上

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="com"/>
</beans>

<context:component-scan base-package="com"/>扫描注解类,可以扫描com包下的所有注解

@Autowired

用于注入数据的注解

代码演示

package com.demo02.service;
import com.demo02.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
@Service
//与@Component功能相同,这里只是区分各功能作用
 @Scope("prototype")
public class UserService {
    @Autowired//按照类型去ioc里面找对象,如果存在类型相同的bean,则会按照名称查找
    //@Resource按照对象的名称去 ioc容器中获取对象
    private UserDao userDao;
    public void select(){
        userDao.select();
    }
}

@Scope

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

修改service代码

package com.demo02.service;
import com.demo02.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
@Service
//与@Component功能相同,这里只是区分各功能左右

 @Scope("prototype")
public class UserService {
    @Autowired//按照类型去ioc里面找对象,如果存在类型相同的bean,则会按照名称查找
    //@Resource按照对象的名称去 ioc容器中获取对象
    private UserDao userDao;
    public void select(){
        userDao.select();
    }
}

修改测试类代码

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

public class Test {
    @Scope("prototype")
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(configuration.class);
        UserService us1 = (UserService) context.getBean("userService");
        UserService us2 = (UserService) context.getBean("userService");
        System.out.println(us1);
        System.out.println(us2);
    }
}

运行结果

三、Spring5的新注解

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

3.1@Configuration

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

3.2@ComponentScan

1.用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的:

2.<context:component-scan base-package="com "/>是一样的

3.属性: basePackages:用于指定要扫描的包。和该注解中的 value 属性作用一样

4.语法:@ComponentScan(basePackages = {"要扫描的包名1","要扫描的包名2",...})

3.3综合练习

  1. 删除beans.xml文件

因为我们可以通过@configuration注解将类配置成我们的Spring配置类,所以我们不需要beans.xml文件来配置spring了,让代码更加优雅

configuration类

package com.demo02.configuration;

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

@Configuration
@ComponentScan({"com"})
public class configuration {
}

Dao层配置

package com.demo02.dao;

import org.springframework.stereotype.Component;

@Component
//@Component("hello")
//相当于在beans中写入了<bean id="userDao" class="com.demo02.dao.UserDao"/>
public class UserDao {
    public void select(){
        System.out.println("我是xxx,我喜欢xxx");
    }
}

Service层

package com.demo02.service;
import com.demo02.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
@Service
//与@Component功能相同,这里只是区分各功能左右

 @Scope("prototype")
public class UserService {
    @Autowired//按照类型去ioc里面找对象,如果存在类型相同的bean,则会按照名称查找
    //@Resource按照对象的名称去 ioc容器中获取对象
    private UserDao userDao;
    public void select(){
        userDao.select();
    }
}

测试类

package com.demo02;
import com.demo02.configuration.configuration;
import com.demo02.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;

public class Test {
    @Scope("prototype")
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(configuration.class);
        UserService us1 = (UserService) context.getBean("userService");
        us1.select();
    }
}

运行结果

运行结束

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringIOC 的相关文章

  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 将不同类型的参数传递给 jdbctemplate 查询

    我正在尝试使用带有少量不同类型参数的 where 子句从数据库中检索记录 这是我编写的简单方法 我将breedId和性别作为参数传递 public List
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 使用Spring将war文件WEB-INF目录下的资源导入到applicationContext文件中

    我在我的项目中使用 Spring 框架 我想导入下面的所有 xml 资源 文件 WEB INF CustomerService spring integration Jobs applicationContext配置文件中war文件的目录
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • Selenium中get_attribute、get_property和text详解

    Selenium中WebElement类中get attrubute get propertry和text详解 get attribute get property和text的详解 特点如下 get property self name g
  • 2D/3D人体姿态估计 (2D/3D Human Pose Estimation)

    1 基本概念 算法改进入口 网络设计 特征流 损失函数 数据集的重要性 只要有一个好的 针对性的数据集 问题都可以解决 过集成新一代AutoML技术 可降低算法试错成本 人体姿态估计 Human Pose Estimation 是指图像或视
  • 利用cglib的BeanCopier用原型模式以及享元模式完成对象的拷贝

    实际上对象拷贝的工具有很多种 比如apache BeanUtils apache PropertyUtils spring BeanUtils 在一些业务代码中现在经常看到的都是spring BeanUtils来进行对象拷贝 大部分情况下来
  • Tensorflow运行报错:tensorflow/core/common_runtime/gpu/gpu_event_mgr.cc:220] Unexpected Event status: 1

    在跑keras上的代码时突然报错 tensorflow core common runtime gpu gpu event mgr cc 220 Unexpected Event status 1 跑了一下以前的代码都是跑的出来的 所以应该
  • 决策树损失函数

    决策树损失函数 一 决策树的损失函数 二 如何理解 在学习决策树的过程中 会存在损失函数 损失函数是什么呢 如何理解 一 决策树的损失函数 为了避免出现过拟合的现象 我们要对决策树进行剪枝 决策树的剪枝类似一种参数正则化的过程 其选择正则化
  • uart协议_UART协议帧格式

    参考文章 地址1 地址2 地址3
  • 安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制&文件管理模块&包含&上传&遍历&写入&删除&下载&安全

    文章目录 文件管理模块 上传 过滤机制 文件管理模块 显示 过滤机制 PHP文件操作安全 文件包含 文件上传 文件删除 文件下载 文件编辑 文件管理模块 上传 过滤机制 FILES PHP中一个预定义的超全局变量 用于在上传文件时从客户端接
  • JS逆向之基础定位技巧

    篇幅有限 完整内容及源码关注公众号 ReverseCode 发送 冲 当我们拿到一个网站时 首先就是抓包定位加密参数的实现 本文将通过常用的定位方案结合实际案例完成对加密参数的分析 搜索关键参数 这是最常见也是最简单的定位方案 F12打开网
  • 详解在vue项目当中绑定键盘事件

    在vue项目当中 有时会遇到为文本输入框或者button按钮绑定键盘事件 最常见的就是enter回车事件 按照vue官网给出的方法是 v on keyup enter 简写 keyup enter 如果是绑定在组件上的话 需要加native
  • Spring Boot + Vue的网上商城之订单商品评价实现

    Spring Boot Vue的网上商城之订单商品评价实现 在网上商城中 用户下单购买商品后 通常会有一个订单评价的功能 用户可以对购买的商品进行评价和打分 本篇博客将介绍如何使用Spring Boot和Vue js实现订单商品评价功能 包
  • hp打印机怎么连接电脑_小白使用手册

    工作中 总是离不开文印 文印难题也是在所难免 而对于文印小白来说 只有在打印机一切正常的情况下才能顺利使用打印机 当打印机出现一点 异常 时 就变得不知所措 比如 电脑如何通过无线网络设置打印机 手机如何连接打印机等 问题 遇到这些问题不用
  • 华为od机考真题-跳跃比赛

    def dfs nums i 0 if len nums lt i 1 return 0 return min dfs nums i j 1
  • 视频瞳孔跟踪之星团模型

    视频瞳孔跟踪之星团模型 http www cnblogs com ren19930504 p 4319156 html 视频瞳孔跟踪之星团模型 1 预处理 1 1去除图像噪声 使用5 5的高斯平滑处理散粒噪声 使用 模型处理线路噪声 是第
  • 【华为OD机试真题2023B卷 JAVA&JS】分积木

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 分积木 知识点位运算线性表 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 Solo和koko是两兄弟 妈妈给了他们一大堆积木 每块积木上都有自己的重量 现在他们想要将这
  • 003:打印ASCII码

    003 打印ASCII码 描述 输入一个除空格以外的可见字符 保证在函数scanf中可使用格式说明符 c读入 输出其ASCII码 输入 一个除空格以外的可见字符 输出 一个十进制整数 即该字符的ASCII码 样例输入 A 样例输出 65 这
  • 毕设教学 多分类与数据预测分析算法 - python

    文章目录 0 前言 机器学习 基于逻辑回归 LightGBM XGBoost额的分类预测 一 基于逻辑回归的分类预测 1 逻辑回归的介绍和应用 1 1 逻辑回归的介绍 1 2逻辑回归的应用 2 Demo实践 Step1 库函数导入 Step
  • 加快edge网页的下载速度

    1 edge flags enable parallel downloading 2 点击enabled
  • tomcat8.5之后版本,远程无法登录管理页面

    1 修改 webapps magager META INF context xml文件 注意是webapp下manager发布包里的 不是conf下的context xml 隐藏其中的内容
  • python参数之间用什么分割_如何根据python的两个参数在美丽的汤中分割

    我使用beutifulsoup来提取文档中图像的地址 但是文档中的链接需要清理 特别是大多数图像都有类似的链接 image jpg amp 随机文本和我想要的信息https www webaddress com image jpg file
  • SpringIOC

    一 Sping理解 Spring 是个java企业级应用的开源开发框架 Spring主要用来开发Java应用 但是有些扩展是针对构建J2EE平台的web应用 Spring 框架目标是简化Java企业级应用开发 并通过POJO为基础的编程模型