Spring复习-注解开发

news/2025/2/21 18:51:24/文章来源:https://www.cnblogs.com/Helix6/p/18729845

@Component

基本Bean注解,主要是使用注解的方式替代原有xml的 标签及其标签属性的配置

使用@Component 注解替代标签

使用:再类上使用

@Component(value = "userDao") //若没有配置value,默认使用类名作为beanName
public class UserDaoImpl implements UserDao {
}

在Spring配置xml中配置包扫描

<!--  扫描指定包下的@Component注解  -->
<context:component-scan base-package="com.demo"></context:component-scan>

容器获取bean方式与之前相同

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Object userDao = context.getBean("userDao");
System.out.println(userDao);//com.demo.dao.impl.UserDaoImpl@101df177

其他注解

@Component的三个衍生注解

由于JavaEE开发是分层的,为了每层Bean标识的注解语义化更加明确,(
@Component又衍生出如下三个注解:

依赖注入

Bean依赖注入的注解,主要是使用注解的方式替代xml的标签完成属性的注入操作

Spring主要提供如下注解,用于在Bean内部进行属性注入的:

@Autowired

写两个同类型的bean,名称不一样

@Repository(value = "userDao")
public class UserDaoImpl implements UserDao {
}@Repository(value = "userDao2")
public class UserDaoImpl2 implements UserDao {
}

目前单例池中有两个同类型(UserDao)的bean

userDao和userDao2

在UserServiceImpl中,使用@Autowired注入UserDao成员变量

@Autowired //根据类型注入,若同类型多个再根据name匹配,没有指定name就报错
private UserDao userDao1;//注入单例池中没有的bean

结果会报错,,没有指定的bean
此时可以通过@Autowired+@Qualifier来配置

@Autowired //根据类型注入,若同类型多个再根据name匹配,没有指定name就报错
@Qualifier(value = "userDao2") //指定beanName
private UserDao userDao1;

@Autowired写在方法上会根据参数类型进行匹配
下面有一个特殊的情况,参数写一个List,@Autowired会从单例池中根据类型找到所有类型的实例化bean,并放入list中。

//@Autowired用在方法上,根据类型匹配(方法自动执行,不需要调用)
@Autowired
public void fullList(List<UserDao> list) {System.out.println("fullList:"+list);
}

结果:

fullList:[com.demo.dao.impl.UserDaoImpl@551bdc27, com.demo.dao.impl.UserDaoImpl2@58fdd99]

@Resource

@Resource(name = "userDao2") //先类型,有name就根据name
private UserDao userDao1;

相当于@Autowired+@Qualifier

非自定义Bean注解开发

非自定义Bean不能像自定义Bean一样使用@Component进行管理,非自定义Bean要通过工厂的方式进行实例化
使用@Bean标注方法即可,@Bean的属性为beanName,如不指定为当前工厂方法名称
PS:工厂方法所在类必须要被Spring管理

写一个类,其中方法返回指定类型,方法内创建对象

@Component //交给Spring管理
public class OtherBean {@Bean //默认通过方法名'dataSource'来配置beanNamepublic DataSource dataSource() {DruidDataSource druidDataSource = new DruidDataSource();return druidDataSource;}
}

如果@Bean工厂方法需要参数的话,则有如下几种注入方式
使用@Autowired 根据类型自动进行Bean的匹配,@Autowired可以省略
使用@Qualifier 根据名称进行Bean的匹配
使用@Value 根据名称进行普通数据类型匹配,

@Component //交给Spring管理
public class OtherBean {@Bean //默认通过方法名'dataSource'来配置beanName,引用参数类型默认添加了@Autowiredpublic DataSource dataSource(@Value("${jdbc.driver}") String driverName,@Qualifier("userDao2")UserDao userDao) {DruidDataSource druidDataSource = new DruidDataSource();druidDataSource.setDriverClassName(driverName);System.out.println(userDao);return druidDataSource;}
}

Spring配置类开发

使用各种注解代替Spring配置文件xml中的标签

@Configuration
@ComponentScan(basePackages = {"com.demo"}) //替代<context:component-scan>
@PropertySource(value = "classpath:jdbc.properties") //替代<context:property-placeholder>
@Import(value = {OtherBean.class}) //替代Import,引入OtherBean中定义的bean,OtherBean不再需要加@Component
public class SpringConfig {
}

使用配置类的方式加载ApplicationContext,使用AnnotationConfigApplicationContext实现类

public class ApplicationContextTest {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);Object dataSource = applicationContext.getBean("dataSource");System.out.println(dataSource);}
}

Spring配置其他注解

@Primary

扩展:@Primary注解用于标注相同类型的Bean优先被使用权,@Primary是Spring3.0引入的,与@Component和@Bean一起使用,标注该Bean的优先级更高,则在通过类型获取Bean或通过@Autowired根据类型进行注入时会选用优先级更高的

@Profile

注解 @Profile 标注在类或方法上,标注当前产生的Bean从属于哪个环境,只有激活了当前环境,能被注册到Sprng容器里,不指定环境的Bean,任何环境下都能注册到Spring容器里(公共环境)。

可以使用以下两种方式指定被激活的环境:
使用命令行动态参数,虚拟机参数位置加载-Dspring.profiles.active=test
使用代码的方式设置环境变量 System.setProperty("spring.profiles.active","test”);

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

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

相关文章

测试用例编写技巧

一、用例模板 模板1:模板2:模板3:二、用例的来源 (1)公司就有模板 (2)自己设计模板 (3)用例管理工具种导出模板 三、写用例的核心要素 用例编号、用例标题、前置条件、用例步骤,预期结果、优先级(必填) 系统名称、模块名称、用例创建时间、用例类型、实际结果、执行…

利用deepseek,体验ai写代码

vscode利用cline接入火山引擎deepseek,免费体验ai写代码。注册火山引擎,开通deepseek服务进行火山引擎官网https://www.volcengine.com/,进行注册。进入控制台,访问火山方舟在左侧下拉菜单选择开通管理,开通模型,由于我已经开通过R1模型,以DeepSeek-R1-Distill-Qwen-32B…

测试用例编写

模板1:模板2:模板3:二、用例的来源(1)公司就有模板(2)自己设计模板(3)用例管理工具种导出模板三、写用例的核心要素用例编号、用例标题、前置条件、用例步骤,预期结果、优先级(必填)系统名称、模块名称、用例创建时间、用例类型、实际结果、执行时间(非必填项)四…

TEN 现已接入智谱 GLM-Realtime丨社区来稿

就在上周,三星 Galaxy S25 系列全球首发。基于最新 Galaxy AI 的三星 Galaxy S25 系列手机是三星在全球范围内首次推出具有视频通话功能的原生 AI 智能硬件产品。三星 Galaxy S25 系列背后的智谱最新实时音视频通话 GLM-Realtime 模型,今天已经以插件形式接入 TEN。现在你可以…

Canvas._left will be removed, DO NOT USE IT

问题:SignaturePad 手绘板,在电脑端可以绘制,在小程序端绘制以后不显示。开发者工具打印日志:Canvas._left will be removed, DO NOT USE IT.原因:真机使用时确实无法获取该canvas的实例属性_left.解决:通过微信小程序的wx.createSelectorQuery()方法得到query筛选器,通…

实战解析传统发电站智能化改造-第二期(带图带教程)

传统发电站的智能化改造,如同为老工匠配备高科技工具,提升效率与精准度。改造后的发电站兼具传统与智能,更高效、环保,适应现代能源需求。智慧系统搭建平台是连接感知层和应用层的桥梁,将原始数据转化为有价值的信息,为智能决策和应用提供支持。上期介绍了传统发电站改造…

PostgreSQL技术大讲堂 - 第80讲:duckdb数据库

PostgreSQL第80讲:主题:duckdb数据库 内容介绍: 1、duckdb身世之谜 2、duckdb性能为什么秒杀众多数据库 3、安装duckdb时如何跳过众多的坑 4、duckdb的使用和管理 5、duckdb、pg_duckdb、pg三个数据库性能大比拼 主讲老师:CUUG数据库老陈,PG中文社区委员、CCF数据库专委会…

LLM高效推理:KV缓存与分页注意力机制深度解析

随着大型语言模型(LLM)规模和复杂性的持续增长,高效推理的重要性日益凸显。KV(键值)缓存与分页注意力是两种优化LLM推理的关键技术。本文将深入剖析这些概念,阐述其重要性,并探讨它们在仅解码器(decoder-only)模型中的工作原理。https://avoid.overfit.cn/post/db8875…

Nuclei漏洞扫描器:快速、灵活的漏洞检测工具

免责声明 本文旨在介绍有关特定漏洞检测工具或安全风险的详细信息,以帮助安全研究人员、系统管理员和开发人员更好地理解和修复潜在的安全威胁,协助提高网络安全意识并推动技术进步,而非出于任何恶意目的。利用本文提到的漏洞信息或进行相关测试可能会违反法律法规或服务协议…

BUUCTF-Web方向16-20wp

[极客大挑战 2019]PHP 由内容提示应该存在源码备份,常见的如下,一个个尝试 后缀:tar tar.gz zip rar 名字:www web website backup back wwwroot temp访问www.zip,下载下来解压查看index.phpflag.phpclass.php <?php include flag.php;error_reporting(0);class Name{…

【Nginx开发】如何使用Nginx搭建旁路服务器获取客户端IP

一、前言 在实际业务开发过程中,很多时候有记录客户端真实IP的需求,但是从客户端发送的请求往往会经过很多代理服务器,导致后端服务获取的IP为代理以后的IP,不具有业务含义。为了解决这个问题,可以搭建一个旁路服务器,前端在发起请求的时候需要先请求旁路服务器,获取该客…

PyBy2:若依计划任务自动化上线+内存马自动生成v2.0

免责声明 本公众号文章以技术分享学习为目的。由于传播、利用本公众号发布文章而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任。一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!前言 攻防中,遇到一个ruo…