spring(1)

news2025/1/15 23:27:13

文章目录

  • IOC容器
    • IOC容器和beans的介绍
      • 实例化 Bean
      • BeanFactory:
      • ApplicationContext
    • 容器概述
      • 配置元数据
      • 实例化容器
      • 组合基于xml的配置元数据
      • 使用容器
    • bean的概述
      • 命名bean
        • 别名的使用
      • 实例化bean
        • 构造函数实例化
        • 静态工厂实例化
        • 实例工厂方法
        • bean 在运行时的实际类型
    • 依赖
      • 依赖注入

IOC容器

IOC容器和beans的介绍

IOC 容器是 Spring 框架的核心部分之一,它负责管理和维护应用程序中的对象(beans)
“Inversion of Control” 指的是将对象的创建、组装和依赖关系的管理权从应用程序代码转移到框架中

实例化 Bean

IOC 容器有两种主要的实现:

BeanFactory:

这是 Spring 最基本的容器,提供了最简单的 bean 容器功能。它延迟初始化 beans,即只有在请求时才会实际创建和初始化 bean。这对于资源消耗较大的 bean 非常有用。

ApplicationContext

这是 BeanFactory 的子接口,提供了更多的功能,如国际化支持、事件传播、AOP 功能等。ApplicationContext 在启动时会预先实例化和初始化 beans,以便在应用程序运行期间能够更快地访问和使用它们

容器概述

高水平概括
在这里插入图片描述

配置元数据

XML 配置文件:

<bean id="userService" class="com.example.UserService">
    <property name="userRepository" ref="userRepository" />
</bean>

注解
使用 @Component 注解将一个类标记为一个 Spring bean:

@Component
public class UserService {
    // ...
}

Java 配置类:

@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserService();
    }
}

实例化容器

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- services -->

    <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
        <property name="accountDao" ref="accountDao"/>
        <property name="itemDao" ref="itemDao"/>
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for services go here -->

</beans>

组合基于xml的配置元数据

模块化配置:
可以将不同的模块分开定义在不同的 XML 文件中。每个模块可以有自己的配置文件,其中定义了与该模块相关的 beans 和依赖关系。然后,在主配置文件中通过 元素引入这些模块的配置文件
所有位置路径都相对于执行导入的定义文件,

<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">

    <import resource="services.xml"/>
    <import resource="resources/messageSource.xml"/>
    前导斜杠会被忽略。然而,考虑到这些路径是相对的,最好不要使用斜杠
    <import resource="/resources/themeSource.xml"/>

    <!-- Define additional beans or configurations -->
</beans>

Profile 切换:
你可以使用 Spring 的 Profile 功能,在不同的环境或条件下切换配置

<beans profile="development">
    <!-- Define beans and configurations for development environment -->
</beans>

<beans profile="production">
    <!-- Define beans and configurations for production environment -->
</beans>

使用容器

意味着在 Spring 框架中如何使用容器来管理和组织你的应用程序的组件

  1. 定义 Beans:
  2. 获取 Beans:
//1
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);

//2
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
//petStore是xml文件中的一个id
PetStoreService service = context.getBean("petStore", PetStoreService.class);
List<String> userList = service.getUsernameList();


//3
GenericApplicationContext context = new GenericApplicationContext();
new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml");
context.refresh();
  1. 依赖注入:Spring 容器负责处理 beans 之间的依赖关系。你可以通过构造函数注入、setter 方法注入或字段注入等方式
  2. 生命周期管理:

bean的概述

在这里插入图片描述

命名bean

确保 bean 的名称是唯一的,以便在容器中准确引用

  1. xml
    Bean 的名称用于在**容器中引用、获取和识别 beans。**可以通过多种方式指定 bean 的名称
id一定是唯一的
<bean id="userService" class="com.example.UserService" />


name 属性可以指定多个名称,使用逗号或分号分隔。
<bean name="userBean,userService" class="com.example.UserService" />

  1. java:
    可以使用 @Component 注解来为 bean 分配一个默认名称,该名称是类名的小写字母开头的形式。

@Component
public class UserService {
    // ...
}


使用 Qualifier 注解:
@Autowired
@Qualifier("userService")
private UserService userService;


使用 Java 配置类:
@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserService();
    }
}

别名的使用

  1. xml
<bean id="userService" class="com.example.UserService" />
<alias name="userService" alias="userManagementService" />

引用别名
<bean id="anotherBean" class="com.example.AnotherBean">
    <property name="userService" ref="userManagementService" />
</bean>

2.AliasFor
这要求使用 @AliasFor 注解的类和 bean 必须具有相同的注解类型

@AliasFor("userService")
@Component("userManagementService")
public class UserManagementService {
    // ...
}

实例化bean

构造函数实例化

通过调用类的构造函数来完成的

 你可以使用 <constructor-arg> 元素来指定构造函数的参数值
<bean id="user" class="com.example.User">
   <constructor-arg value="John" />
   <constructor-arg value="Doe" />
</bean>

静态工厂实例化

public class UserFactory {
   private UserFactory() {
       // private constructor to prevent direct instantiation
   }

   public static User createUser(String firstName, String lastName) {
       return new User(firstName, lastName);
   }
}

指定工厂类

<bean id="user" class="com.example.UserFactory" factory-method="createUser">
这是值
   <constructor-arg value="John" />
   <constructor-arg value="Doe" />
</bean>

实例工厂方法

public class UserFactory {
    public User createUser(String firstName, String lastName) {
        return new User(firstName, lastName);
    }
}

指定

<bean id="userFactory" class="com.example.UserFactory" />

<bean id="user" factory-bean="userFactory" factory-method="createUser">
    <constructor-arg value="John" />
    <constructor-arg value="Doe" />
</bean>

bean 在运行时的实际类型

Bean 类型和代理:用bean类型的和代理的类型
getClass() 方法:返回对象的实际运行时类,要注意,如果有代理存在,这个方法返回的可能是代理类的类型。
AopProxyUtils.ultimateTargetClass() 方法:这个方法会遍历代理链,找到最终的目标类。
目的:你可能需要了解对象的实际类型,特别是在处理代理、动态代理、AOP 等情况时。这有助于你更好地理解对象的行为和工作原理

依赖

依赖注入

Spring 框架的核心概念之一,它用于管理和注入对象之间的依赖关系。依赖注入的目的是降低组件之间的耦合度

  1. 构造函数
@Component
public class UserService {
    private UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // ...



package examples;

public class ExampleBean {

    // Fields omitted

    @ConstructorProperties({"years", "ultimateAnswer"})
    public ExampleBean(int years, String ultimateAnswer) {
        this.years = years;
        this.ultimateAnswer = ultimateAnswer;
   

使用xml

public class ThingOne {

    public ThingOne(ThingTwo thingTwo, ThingThree thingThree) {
        // ...
    }
}


}
<beans>
    <bean id="beanOne" class="x.y.ThingOne">
        <constructor-arg ref="beanTwo"/>
        <constructor-arg ref="beanThree"/>
    </bean>

    <bean id="beanTwo" class="x.y.ThingTwo"/>

    <bean id="beanThree" class="x.y.ThingThree"/>
</beans>

也可以指定类型
<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg type="int" value="7500000"/>
    <constructor-arg type="java.lang.String" value="42"/>
</bean>

指定index
<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg index="0" value="7500000"/>
    <constructor-arg index="1" value="42"/>
</bean>

指定名字
<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg name="years" value="7500000"/>
    <constructor-arg name="ultimateAnswer" value="42"/>
</bean>
  1. Setter 方法注入
@Component
public class UserService {
    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // ...
}
setter与constructor

因此对于**强制依赖项使用构造函数**,而对于**可选依赖项使用setter方法**或配置方法是一条很好的经验法则。**注意,在setter方法上使用@Required注释可以使属性成为required依赖项**
  1. 字段注入
@Component
public class UserService {

    @Autowired
    private UserRepository userRepository;

    // ...
}

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

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

相关文章

Microsoft Learn AI 技能挑战赛|开启你的 Azure OpenAI Service 应用

点击蓝字 关注我们 Microsoft Learn AI 技能挑战赛已经结束&#xff0c;完赛的小伙伴请保存完赛截图并登记奖品领取表单&#xff01;此外&#xff0c;挑战赛作品提交将截止到8月18日&#xff0c;优秀作品将获得惊喜礼包奖励。 奖品领取、作品提交等详情请查看&#xff1a; 活动…

Docker入门——实战图像分类

一、背景 思考&#xff1a; 在一个项目的部署阶段&#xff0c;往往需要部署到云服务器或者是终端设备上&#xff0c;而环境的搭建往往是最费时间和精力的&#xff0c;特别是需要保证运行环境一致性&#xff0c;有什么办法可以批量部署相同环境呢&#xff1f; Docker本质——…

揭秘热门工作秘籍:ChatGPT大显身手!轻松提升工作效率的高效Prompt技巧曝光!

目录 01 背景 福利&#xff1a;文末有chat-gpt纯分享&#xff0c;无魔法&#xff0c;无限制 02 AI 可以帮助程序员做什么&#xff1f; 2.1 技术知识总结 2.2 拆解任务 2.3 阅读代码/优化代码 2.4 代码生成 2.5 生成单测 2.6 更多 AI 应用/插件 AIPRM Voice Control for Ch…

改善神经网络——优化算法(mini-batch、动量梯度下降法、Adam优化算法)

改善神经网络——优化算法 梯度下降Mini-batch 梯度下降&#xff08;Mini-batch Gradient Descent&#xff09;指数加权平均包含动量的梯度下降RMSprop算法Adam算法 优化算法可以使神经网络运行的更快&#xff0c;机器学习的应用是一个高度依赖经验的过程&#xff0c;伴随着大量…

SUMO 充电站与电动车详解

官方文档参考&#xff1a;Electric 创建电动车 首先在rou.xml文件中定义一个电动车类型&#xff0c;例如&#xff1a; <vType id"EV" length"5.00" minGap"2.50" maxSpeed"70.00" color"white" accel"1.0" …

【边缘设备】yolov5训练与rknn模型导出并在RK3588部署~2.环境验证(亲测有效)

保姆级教程&#xff0c;看这一篇就够用了。 在翻阅了网络上很多资料后&#xff0c;发现很多版本的信息比匹配。 花了一周的时间配置环境&#xff0c;以及环境验证&#xff0c;然后写了这篇长文。 有过程&#xff0c;有代码&#xff0c;有经验&#xff0c;欢迎大家批评指正。 一…

Linux 操作文件的系统调用

一、系统调用 系统调用表现出来的形式和库函数看着是一样的&#xff0c;但是系统调用的实现是在内核中&#xff0c;一旦执行系统调用以后&#xff0c;会产生中断&#xff0c;陷入内核&#xff0c;内核去执行相应的代码。我们无法直接去执行内核的代码&#xff0c;系统调用执行…

烧烤炉跨境电商UL检测报告UL 2728A标准

烧烤炉是一种烧烤设备&#xff0c;可以用来做烤羊肉串、烤肉、烤蔬菜等烧烤食品。烧烤炉根据加热源的不同可以分为木炭烧烤炉、燃气烧烤炉和电热烧烤炉&#xff1b;根据烧烤形式的不同&#xff0c;可分为手动烧烤炉和自动烧烤炉&#xff1b;根据用途的不同&#xff0c;可分为家…

如何使用PE修改win10系统的开机密码

前言&#xff1a;忘记自已电脑密码的人真的是太可怜了&#xff0c;半年多的时间没在公司&#xff0c;公司电脑也有半年多没有碰过&#xff0c;导致再回公司上班电脑密码早就忘记了。平时各类电子设备&#xff0c;软件应用的密码都是设成一样的&#xff0c;公司电脑因为有保密机…

ACM模式专业集训

在笔试的时候&#xff0c;大部分都是ACM模式&#xff0c;这让我们习惯于leetcode刷题确实输入输出很难下手&#xff0c;有的时候&#xff0c;明明题可以做出来&#xff0c;但是就是因为输入输出比较欠缺&#xff0c;因此无缘笔试&#xff0c;所以我们在平常的时候应该多去用ACM…

Scratch 之 翻页器制作

众所周知&#xff0c;在原版scratch上有一块480360大小的屏幕。但是我们如果在scratch编译器上编一些文字比较多的文章时&#xff0c;就会发现&#xff1a;字太多舞台区大小不够用怎么办&#xff1f;别着急&#xff0c;看我怎么解决。 标题大家都看到了吧&#xff0c;这个作品解…

pe文件的Import table导入表的手工修复

一、实验目的&#xff1a; 实验提供了一个不能正常运行的程序&#xff0c;如果在正常运行的情况下&#xff0c;程序的功能是弹出一个messagebox&#xff0c;然后正常退出。要做的&#xff0c;是通过排查错误&#xff0c;找到问题所在&#xff0c;修改程序&#xff0c;使其正常运…

猿辅导发布素质教育品牌,助力孩子学习底层能力培养

近年来&#xff0c;我国教育改革逐步深化&#xff0c;发展素质教育已成社会共识。2022年教育部发布新课标&#xff0c;根据学生的核心素养要求&#xff0c;确定了各门课程具体目标&#xff0c;优化了课程内容结构。其中&#xff0c;跨学科学习、探究式学习成为了新的学习方式。…

bigemap如何添加在线高清卫星图?

一、先那安装bigemap 软件 BIGEMAP电脑全能版 下载连接&#xff1a;http://www.bigemap.com/reader/download/detail201802015.html 二、鼠标放在左上角选择地图源这里&#xff0c;点击第一个加号按钮 选择从配置文件添加在线地图 吧地图配置文件选择导入添加&#xff0c;勾选…

【取证】2022美亚杯资格赛个人赛

【取证】2022美亚杯资格赛个人赛 加载检材创建案件个人赛部分&#xff08;共70题&#xff09;1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.6…

攻防演习常用威胁情报中心

攻防演习常用威胁情报中心 微步在线&#xff1a;https://x.threatbook.com/绿盟威胁分析中心&#xff1a;https://poma.nsfocus.com/奇安信威胁情报中心&#xff1a;https://ti.qianxin.com/360安全大脑&#xff1a;https://sc.360.net/360沙箱云地址“”https://ata.360.net/天…

使用pysnmp报错lambda错误

pip install pyasn10.4.8 pysnmp4.4.12 python - Takes exactly 3 arguments (4 given) - Stack Overflow

CorelDRAW2023(简称CDR23)官方最新中文版下载教程

CorelDRAW&#xff08;简称CDR&#xff09;是一款专业的图形设计软件。该软件是加拿大Corel公司开发的一款功能强大的专业平面设计软件、矢量设计软件、矢量绘图软件。这款矢量图形制作工具软件广泛应用于商标设计、标志制作、封面设计、CIS设计、产品包装造型设计、模型绘制、…

树的子结构

声明 该系列文章仅仅展示个人的解题思路和分析过程&#xff0c;并非一定是优质题解&#xff0c;重要的是通过分析和解决问题能让我们逐渐熟练和成长&#xff0c;从新手到大佬离不开一个磨练的过程&#xff0c;加油&#xff01; 原题链接 树的子结构https://leetcode.cn/leet…

每天一道leetcode:剑指 Offer 36. 二叉搜索树与双向链表(中等深度优先遍历递归)

今日份题目&#xff1a; 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 示例 我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于…