Spring 用法学习总结(二)之基于注解注入属性

news2024/11/30 6:49:34

Spring学习

  • 5 基于注解方式创建对象
  • 6 基于注解注入属性

5 基于注解方式创建对象

注解是代码的特殊标记,可以简化xml配置,格式:@注解名称(属性名称=属性值),可以作用在类、方法、属性上
以下注解都可以创建bean实例

  • @Component
  • @Service
  • @Controller
  • @Repository

创建一个bean2.xml文件,其中component-scan是组件扫描,默认是全扫描,会扫描包中所有的注解并将它们加入到bean容器,可以扫描多个包(包用逗号隔开),此外,还可以通过use-default-filters=“false” 和context:include-filter 设置只扫描哪些内容或context:exclude-filter设置哪些内容不进行扫描

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

    <!--component-scan组件扫描-->
    <context:component-scan base-package="springstudy1"></context:component-scan>
    
    <!-- type="annotation"表示按照注解进行排除,指定注解不加入bean容器中,此处Component注解不会加入bean容器 -->
	<context:component-scan base-package="springstudy1">
    	<context:exclude-filter type="annotation"
        	expression="org.springframework.stereotype.Component"/>
    </context:component-scan>
	
	<!-- 排除指定包springstudy下的User类的扫描,不会将该类的注解加入bean容器-->
	<context:component-scan base-package="springstudy">
	    <context:exclude-filter type="assignable"
	        expression="springstudy.User"/>
	</context:component-scan>
	
	<!-- 排除扫描符合正则表达式的类,此处排除springstudy包下的所有类,不会将这些类的注解加入bean容器-->
	<context:component-scan base-package="springstudy1">
	    <context:exclude-filter type="regex"
	        expression="springstudy.*"/>
	</context:component-scan>
</beans>

注:上述代码中若注解已经加入bean容器,之后通过exclude-filter排除注解没有用,context:include-filter和exclude-filter用法类似,type的属性值相同,不过多说明

创建User类,添加@Component注解,其中value可以省略,默认值是类名称,首字母小写

package springstudy1;

import org.springframework.stereotype.Component;

@Component(value = "user") //等价于在xml文件中添加<bean id="user" class="springstudy1.User"></bean>
public class User {
    public void add() {
        System.out.println("add...");
    }
}

创建Test类

package springstudy1;

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

public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
        User user = context.getBean("user", User.class);
        user.add();
    }
}

在这里插入图片描述

补充:通过@Bean注解创建对象
创建Card类,使用@Bean注解创建User对象,name默认是类名(首字母小写)

package springstudy1;
import org.springframework.context.annotation.Bean;

public class Card {

    @Bean(name="test")
    public User test() {
        return new User();
    }
}

修改Test类

package springstudy1;

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

public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(Card.class);
        User user = (User) context.getBean("test");
        user.add();
    }
}

在这里插入图片描述

6 基于注解注入属性

  • @Autowired,根据属性类型进行自动装配
  • @Qualifier,根据名称进行注入,和@Autowired 一起使用
  • @Resource,可以根据类型注入,可以根据名称注入
  • @Value,注入普通类型属性

@Autowired根据属性类型选择bean,但有时容器中会有多个相同类型的bean,在这种情况下,注入不会成功,因为 Spring 不知道需要注入哪个 bean。这时需要通过@Qualifier根据名称选择注入哪个bean,也可以使用 @Primary 注解来简化这种情况

@Component
@Primary
class Car implements Vehicle {}

@Component
class Bike implements Vehicle {}

@Component
class Driver {
    @Autowired
    Vehicle vehicle;
}

@Component
class Biker {
    @Autowired
    @Qualifier("bike")
    Vehicle vehicle;
}

上述代码中,Car注解了@Primary。因此,在Driver类中,Spring 注入了一个Car bean。在 Biker bean 中,vehicle 字段的值将是 Bike 对象,因为它注解了 @Qualifier 并且指定了bean 名称。

此外还可以在声明bean和注入bean时添加@Qualifier也可以起到过滤其他同类型bean的效果

@Component
@Primary
class Car implements Vehicle {}

@Component
@Qualifier
class Bike implements Vehicle {}

@Component
class Driver {
    @Autowired
    @Qualifier
    Vehicle vehicle;
}

上述代码会注入Bike bean

@Resource有两个重要的属性:name和type,Spring会将@Resource注解的name属性解析为bean的名字(id属性值),而type属性则解析为bean的类型(class属性值)。如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时会尝试按名称查找,如果未找到,则按类型查找。

效率好低。。。

除夕快乐!!!

@value介绍

@value有两种使用格式,@value(${})和@value(#{}),其中#{}可以包含${},即@value(#{${}})

@value(${})常用来注入配置文件的数据(如连接数据库的数据),需要结合@PropertySource注解才能使用

对于@value(#{}),{}中的内容被认为是SpEL(Spring Expression Language)即Spring表达式语言,可以干以下几件事

  • 注入普通字符串
  • 注入操作系统属性
  • 注入表达式结果
  • 注入其他Bean属性
  • 注入集合
  • 注入文件资源
  • 注入URL资源

注:${}中直接使用“:”对未定义或为空的值进行默认值设置,而#{}则需要使用“?:”对未设置的属性进行默认值设置

在src目录下创建配置文件test.properties

festival=除夕
hongbao=200,400,600
foods={'food1':'牛肉炒红椒','food2':芹菜炒牛肉','food3':'牛肝炖汤','food4':'滑肉'
//通过@value(${})获得配置文件中的数据
//可以是@PropertySource(value = {"file:文件绝对路径"}, encoding="utf-8")
/*多个配置文件
	方式1:@PropertySource("classpath:redis.properties","classpath:database.properties")
	方式2:@PropertySources({ @PropertySource("classpath:redis.properties"), 
					   @PropertySource("classpath:database.properties")})
*/
@PropertySource("classpath:test.properties")//注意路径,此处配置文件地址类似./src/test.properties
@value(${festival:除夕}) //如果festival不存在,默认注入 除夕 ,不用加引号
private String festival;
//被static修饰的变量通过@Value会注入失败,可通过setter方式进行注入该属性

//注入普通字符串,相当于直接给属性默认值
@Value("程序新视界")
private String wechatSubscription;

//注入操作系统属性
@Value("#{systemProperties['os.name']}")
private String systemPropertiesName;

//注入表达式结果
@Value("#{ T(java.lang.Math).random() * 100.0 }")
private double randomNumber;

//注入其他Bean属性:注入config对象的属性tool
@Value("#{config.tool}")
private String tool;

//注入集合
//Spring默认情况下会以“,”进行分割,转换成对应的数组或列表
@Value("#{${hongbao}.split(',')}")
private List<Integer> numList;
//或者private int[] numArray;

//Map
@Value("#{${foods}}")
private Map<String, String> foods;
//如果需要获取 Map 中特定 Key 的 Value,只需在表达式中添加 Key 的名称即可:
@Value("#{${foods}.food1}")
private String food1;
//如果不确定 Map 是否包含某个 Key,可以选择一个更安全的表达式,它不会抛出异常,但会在找不到 Key 时将值设置为 null:
@Value("#{${foods}['unknownKey']}")
private String unknownMapKey;

//注入文件资源
@Value("classpath:config.xml")
private Resource resourceFile;

//注入URL资源
@Value("http://www.choupangxia.com")
private URL homePage;

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

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

相关文章

VS Code中的JDK设置

在VS Code使用中&#xff0c;如果机器只安装了一个版本的JDK版本&#xff0c;一般不需要特别关注JDK 的配置&#xff0c;但是在以下状况下&#xff0c;需要对JDK进行特别的配置&#xff1a; 机器有多个JDK版本&#xff0c;不同的项目使用不同的JDK版本项目使用的JDK版本较低&a…

【web | CTF】BUUCTF [护网杯 2018] easy_tornado

天命&#xff1a;这题是框架性的漏洞&#xff0c;Python的web服务器框架&#xff0c;应该已经比较古老了 开局先看一下三个文件 简单阅读后会发现&#xff0c;这里存在文件包含漏洞&#xff0c;可以直接读取文件&#xff0c;但是有一个哈希值校验 一开始我以为是扫描文件后得到…

vue3 之 商城项目—支付

支付模版 pay/index.vue <script setup> const payInfo {} </script> <template><div class"xtx-pay-page"><div class"container"><!-- 付款信息 --><div class"pay-info"><span class"ic…

腾讯云4核8G服务器够用吗?能支持多少人?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

Linux实用指令

Linux实用指令 1.指定运行级别 运行级别说明&#xff1a; 0 &#xff1a;关机 1 &#xff1a;单用户【找回丢失密码】 2&#xff1a;多用户状态没有网络服务 3&#xff1a;多用户状态有网络服务 4&#xff1a;系统未使用保留给用户 5&#xff1a;图形界面 6&#xff1a;系统重…

山西电力市场日前价格预测【2024-02-11】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-11&#xff09;山西电力市场全天平均日前电价为121.99元/MWh。其中&#xff0c;最高日前电价为475.98元/MWh&#xff0c;预计出现在19:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

姿态传感器MPU6050模块的基本使用总结

以下两篇文章可作为参考&#xff1a; 姿态传感器MPU6050原理及应用超详细讲解 - 采芯网 基于STM32的四旋翼无人机项目&#xff08;二&#xff09;&#xff1a;MPU6050姿态解算&#xff08;含上位机3D姿态显示教学&#xff09;-CSDN博客 基本介绍 随着科技的发展&#xff0c;我们…

Write operation failed: computed value is readonly问题解决

源代码&#xff1a; // 封装倒计时逻辑函数 import { computed, ref } from vue import dayjs from dayjs export const useCountDown () > {// 1.响应式数据const time ref(0)// 格式化时间const formatTime computed(()>dayjs.unix(time.value).format(mm分ss秒))/…

表的连接

目录 内连接实现效果 使用左外连接&#xff0c;将所有的员工信息都显示出来&#xff0c;即便他没有对应的部门 使用右外连接&#xff0c;将所有的部门信息都显示出来 查询每个员工的编号、姓名、职位&#xff0c;以及所在各部门的领导姓名、领导职位 确定所需要的数据表 确…

了解Ping、Wget、端口、Netstat和Curl命令

1. 端口 1.1 什么是端口&#xff1f; 端口是一种用于标识不同应用程序或服务的逻辑通道。它是一个数字&#xff0c;取值范围从0到65535。常见的端口有一些已经被标准化&#xff0c;比如HTTP使用的80端口&#xff0c;HTTPS使用的443端口。 1.2 了解端口状态 使用netstat -an…

springboot191教师工作量管理系统

简介 【 毕设 源码 推荐 javaweb 项目】 基于 springbootvue 的教师工作量管理系统&#xff08;springboot191&#xff09; 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后…

深度学习的新进展:探索人工智能的未来

文章目录 &#x1f4d1;引言深度学习技术概述计算机视觉领域的深度应用自然语言处理的深度革命跨领域应用的深度拓展深度学习的挑战与未来展望结语 &#x1f4d1;引言 在科技日新月异的今天&#xff0c;深度学习作为人工智能领域的一颗璀璨明珠&#xff0c;正在引领着技术创新…

计算机服务器中了360后缀勒索病毒怎么办?360后缀勒索病毒处理流程

网络技术的不断应用与发展&#xff0c;为企业的生产运营提供了有利保障&#xff0c;越来越多的企业走向数字化办公模式&#xff0c;并且企业的发展离不开数据支撑&#xff0c;重视数据安全成为了众多企业关心的主要话题。春节前后&#xff0c;云天数据恢复中心接到很多企业的求…

数据卷的常见命令,如何创建Nginx容器,修改nginx容器内的html目录下的index.html文件

数据卷 什么是数据卷 数据卷&#xff08;volume&#xff09;是一个虚拟目录&#xff0c;是容器内目录与宿主机**目录**之间映射的桥梁。 以Nginx为例&#xff0c;我们知道Nginx中有两个关键的目录&#xff1a; html&#xff1a;放置一些静态资源 conf&#xff1a;放置配置文…

【51单片机】直流电机驱动(PWM)(江科大)

1.直流电机介绍 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转 直流电机主要由永磁体(定子)、线圈(转子)和换向器组成 除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等 2.电机驱动…

奔跑吧小恐龙(Java)

前言 Google浏览器内含了一个小彩蛋当没有网络连接时&#xff0c;浏览器会弹出一个小恐龙&#xff0c;当我们点击它时游戏就会开始进行&#xff0c;大家也可以玩一下试试&#xff0c;网址&#xff1a;恐龙快跑 - 霸王龙游戏. (ur1.fun) 今天我们也可以用Java来简单的实现一下这…

判断一个时间序列中的元素是否属于一个月的第一天或最后一天

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断一个时间序列中的元素 是否属于一个月的第一天或最后一天 Series.dt.is_month_start Series.dt.is_month_end [太阳]选择题 以下代码的输出结果中正确的是? import pandas as pd ts pd.S…

书生浦语大模型实战营-课程作业(3)

下载sentence_transformer的代码运行情况。sentence_transformer用于embedding&#xff08;转向量&#xff09; 本地构建持久化向量数据库。就是把txt和md文件抽取出纯文本&#xff0c;分割成定长&#xff08;500&#xff09;后转换成向量&#xff0c;保存到本地&#xff0c;称…

抽象的前端

问题背景&#xff1a;vue3&#xff0c;axios 直接导致问题&#xff1a;路由渲染失败 问题报错&#xff1a;Uncaught SyntaxError: The requested module /node_modules/.vite/deps/axios.js?v7bee3286 does not provide an export named post (at LoginIn.vue:16:9) 引入组…