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

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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://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 {@AutowiredVehicle 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@QualifierVehicle 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.mzph.cn/news/683320.shtml

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

相关文章

LeetCode 每日一题 Day 62 - 75

1686. 石子游戏 VI Alice 和 Bob 轮流玩一个游戏&#xff0c;Alice 先手。 一堆石子里总共有 n 个石子&#xff0c;轮到某个玩家时&#xff0c;他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双方都知道对方的评判标准。 给你…

提前部署游戏业务防护,为何如此重要?

现在做网络游戏的企业都知道服务器的安全对于我们来说很重要&#xff01;互联网上面的DDoS攻击和CC攻击等等无处不在&#xff0c;而游戏服务器对服务器的防御能力和处理能力要求更高&#xff0c;普通的服务器则是比较注重各方面能力的均衡。 随着游戏行业的壮大&#xff0c;网络…

Shell 学习笔记(一)-Shell脚本编程简介

一 什么是shell&#xff1f; shell是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内…

【学网攻】 第(28)节 -- OSPF虚链路

系列文章目录 目录 系列文章目录 文章目录 前言 一、什么是OSPF虚链路&#xff1f; 二、实验 1.引入 实验目标 实验背景 技术原理 实验步骤 实验设备 实验拓扑图 实验配置 扩展 实验拓扑图 实验配置 实验验证 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻…

winprop二次开发

winprop二次开发 前言工具1——整合多个天线结果用途代码实现 工具2——wallman辅助工具需求代码实现 前言 工作需求&#xff0c;对该软件进行简单地二次开发&#xff0c;都是一些挺简单的代码&#xff0c;单纯是为了上传之后将其从本地删除 工具1——整合多个天线结果 用途…

鲁南制药“健康幸福中国年”主题航班,开启探寻健康与幸福的旅程

“小年&#xff0c;小年&#xff0c;过了今天就是年。”提到过年&#xff0c;北方人的“过年”是从腊月二十三的“小年”开始的&#xff0c;而南方地区是在明天。虽然时间不同&#xff0c;但是浓浓的年味是一样的&#xff0c;红彤彤是主色调&#xff0c;喜洋洋是主乐曲&#xf…

C语言:内存分配---栈区、堆区、全局区、常量区和代码区

一、C语言内存分区 C语言内存分区示意图如下&#xff1a; 1. 栈区 栈区介绍 栈区由编译器自动分配释放&#xff0c;由操作系统自动管理&#xff0c;无须手动管理。栈区上的内容只在函数范围内存在&#xff0c;当函数运行结束&#xff0c;这些内容也会自动被销毁。栈区按内存…

前端秘法进阶篇之事件循环

目录 一.浏览器的进程模型 1.进程 2.线程 二.浏览器的进程和线程 1. 浏览器进程 2. 网络进程 3. 渲染进程 三.渲染主线程 四.异步 五.优先级 1. 延时队列&#xff1a; 2.交互队列&#xff1a; 3.微队列&#xff1a; 六.JS 的事件循环 附加:JS 中的计时器能做到精…

java 宠物在线商城系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java 宠物在线商城系统是一套完善的java web信息管理系统 servletdaobean mvc模式&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

open ai api 国内配置代理指南(网上最全)

1.配置须知 open ai 作为这一波AI浪潮的推动者&#xff0c;opne ai的gpt 系列产品在使用和体验上绝对是最强大的&#xff0c;现在对于开发者来说要在代码中访问open ai api是不可用的。所以本文就主要解决这个问题。我们要了解open ai 的网站gpt的访问和api的访问收费是分开来…

配置Juniper虚墙vSRX基于策略的IPsec VPN(WEB方式)

正文共&#xff1a;1444 字 18 图&#xff0c;预估阅读时间&#xff1a;2 分钟 关于IPsec VPN&#xff0c;我们已经有一个合集了&#xff08;IPsec VPN&#xff09;。之前接触比较多的是H3C的IPsec VPN&#xff0c;后来接触的厂家多了&#xff0c;才发现大家的模型或者叫法还是…

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

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

文心一言4.0 VS ChatGPT4.0哪家强?!每月60块的文心一言4.0值得开吗?

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

AI短视频一键换脸小程序源码/带流量主

微信云开发AI一键视频换脸小程序源码是由极客二改后发布的&#xff0c;小程序增加了广告控制&#xff0c;插屏广告&#xff0c;激励广告和原生广告&#xff0c;由于采用了微信云开发没有后台&#xff0c;所以不需要域名和服务器也可以正常搭建使用&#xff0c;所有的配置都可以…

C++,stl,函数对象,谓词,内建函数对象

目录 1.函数对象使用 2.谓词 1.一元谓词 2.二元谓词 3.内建函数对象 1.算术仿函数 2.关系仿函数 3.逻辑仿函数 1.函数对象使用 #include<bits/stdc.h> using namespace std;class add { public:int operator()(int v1,int v2){return v1 v2;} };class print { p…

从C向C++8——多态

一.多态基础 面向对象程序设计语言有封装、继承和多态三种机制&#xff0c;这三种机制能够有效提高程序的可读性、可扩充性和可重用性。 “多态&#xff08;polymorphism&#xff09;”指的是同一名字的事物可以完成不同的功能。多态可以分为编译时的多态和运行时的多态。前者主…

Unity(单元测试)在STM32上的移植与应用

概述 Unity Test是一个为C构建的单元测试框架。本文基于STM32F407为基础&#xff0c;完全使用STM32CubeIDE进行开发&#xff0c;移植和简单使用Unity。 单片机型号&#xff1a;STM32F407VET6 软件&#xff1a;STM32CubeIDE Version: 1.14.1 Unity Version&#xff1a;2.…

儿童护眼台灯哪个值得推荐?推荐专业的儿童护眼台灯

现在的孩子很多都存在视力问题&#xff0c;而且年龄也越来越早&#xff0c;不少还为上学的孩子都早已戴上小眼镜。虽说这可能存在家族近视遗传的可能性&#xff0c;不过更多的还是后天导致的。长时间玩耍电子产品、缺乏运动、不良用眼习惯、不合适的光线等等都是导致孩子近视的…

【JavaScript 教程】

JavaScript 教程 JavaScript 在线实例为什么学习 JavaScript? JavaScript 是 Web 的编程语言。 所有现代的 HTML 页面都可以使用 JavaScript。 JavaScript 非常容易学。 JavaScript 在线实例 <!DOCTYPE html> <html> <head> <meta charset"utf-8&q…

23款奔驰S400商务版没有后排电动座椅那改装一套跟选装有区别吗

改装的后排电动座椅通常提供以下功能&#xff1a; 电动调节&#xff1a;座椅可以通过按钮或控制面板进行前后调节&#xff0c;以适应乘客的腿部空间需求。 靠背角度调节&#xff1a;乘客可以通过电动调节功能来调整座椅的靠背角度&#xff0c;以获得更舒适的坐姿。 座椅倾斜调…