Spring常用的注解有哪些?作用是什么?怎么用?

一、怎么用?

       首先需要在bean.xml文件中配置注解组件扫描,只有配置了组件扫描,spring才会去指定包下面扫描你使用了哪些注解,并让其生效。例如:

    <!--spring会去扫描com.frank包及其子包下所有的注解,并让其生效-->
    <context:component-scan base-package="com.frank"></context:component-scan>

       其次,依据注解的使用方法,在类或者方法的头上标记注解。

二、有哪些以及它的作用是什么? 

1、@Conponent注解

 作用:表示把该类交给spring容器管理。

例如:

1、先写个用于给spring管理的类,UserImp

package com.frank.service;
​
import org.springframework.stereotype.Component;
​
/*** UserImp* 我要把该类交给spring容器管理* 按照以前的操作,在bean.xml文件中使用bean标签,给class属性一个值(值就是该类的全限定名)* 现在使用注解的方式平替,@Conponent*/
@Component("userImp")
public class UserImp {
}

2、再创建bean.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd">
​
<!--    <bean id="userImp" class="com.frank.service.UserImp"></bean>-->
​<!--spring会去扫描com.frank包及其子包下所有的注解,并让其生效--><context:component-scan base-package="com.frank"></context:component-scan>
​
</beans>

3、编写测试类,获取userImp对象

package com.frank;
​
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
public class TestApp {public static void main(String[] args) {ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");Object userImp = app.getBean("userImp");System.out.println(userImp);}
}
2、@Controller+@Service+@Repository

@Controller注解:使用在Controller层的类上面

@Service注解:使用在Service层的类上面

@Repository注解:使用在Dao层的类上面

 3、@Scope+@Lazy+@PostConstruct+@PreDestroy

 @Scope注解:平替<bean scope="">,表示该类的作用域

@Lazy注解:平替<bean lazy-init="">,表示bean开启延迟加载

@PostConstruct注解:平替<bean init-method="">,表示告诉spring下面的方法是一个初始化方法

@PreDestroy注解:平替<bean destroy-method="">,表示告诉spring下面的方法是销毁方法

 例如:

 1、先写个用于给spring管理的类,UserImp

package com.frank.service;

import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;


@Component// 该注解表示把该类交给spring容器管理
@Scope(value = "singleton")//该注解表示该类的作用域使用单例模式
@Lazy(true)//该注解表示bean开启延迟加载
public class UserImp {
    public UserImp() {
        System.out.println("构造方法执行。。。。");
    }
    @PostConstruct//该注解表示告诉spring下面的方法是一个初始化方法
    public void init(){
        System.out.println("初始化方法执行......");
    }
    @PreDestroy//该注解表示告诉spring下面的方法是销毁方法
    public void destroy(){
        System.out.println("销毁方法执行......");
    }
}

 此次省略bean.xml配置文件的代码,因为跟上一个例子一样。

 2、编写测试类,获取userImp对象

package com.frank;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 此类专用于测试
 */
public class TestApp {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");
        Object userImp = app.getBean("userImp");
        System.out.println(userImp);
        app.destroy();
    }
}

4、@Value+@Autowired+@Qualifier+@Resource

 平替bean标签注入时的标签

原先使用xml实现注入的时候使用的是<property>标签来指明注入的关系;现在我们可以通过下面的注解来替换它。

@value注解:使用在字段或者方法上面,用于注入普通数据

@Autowired注解:使用在属性或者方法上面,用于注入引用数据(默认按照byType方式注入)

@Qualifier注解:使用在字段或者方法上面,搭配@Autowired根据名称进行注入

@Resource注解:不给参数的时候相当于@Autowired进行注入;给了参数相当于@Autowired+@Qualifier

 例如:

1、bean.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd">
​<!--spring会去扫描com.frank包及其子包下所有的注解,并让其生效--><context:component-scan base-package="com.frank"></context:component-scan>
​
</beans>

2、创建UserDao接口

package com.frank.dao;
​
public interface UserDao {
}
​

3、编写UserDao的实现类

package com.frank.dao;
​
import org.springframework.stereotype.Repository;
​
@Repository("userDaoImp")
public class UserDaoImp implements UserDao{
}
​

4、在UserImp类中添加两个属性,一个是普通字符串属性,一个是UserDao的引用

package com.frank.service;
​
import com.frank.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
​
@Service("userImp")
public class UserImp {@Value("frank")// 给属性name注入字符串类型的值String name;
​@Autowired// 根据类型,给userDao属性注入引用类型的值UserDao userDao;
​// 写个方法,里面打印两个属性,如果控制台打印有值说明注解注入成功public void show(){System.out.println(name);System.out.println(userDao);}
}
​

5、在测试类中测试运行

package com.frank;
​
import com.frank.service.UserImp;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
public class TestApp {public static void main(String[] args) {ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");UserImp userImp = (UserImp) app.getBean("userImp");userImp.show();}
}

@Autowired注解是根据类型进行注入的,如果有多个UserDao类型,这个时候@Qualifier注解的作用就起来了,它的作用是当发现你使用了@Autowired注解后,却有多个相同的类型,可以通过@Qualifier注解指定其中的一个名字进行注入(按名字注入)。

5、@Bean

 @Bean注解:写在某个方法上面,一般用于注入非自定义的bean。

例如:

@Bean("dataSource")// 使用@Bean注解把dataSource()方法返回的对象交给spring管理

 

6、@Configuration+@ComponentScan+@PropertySource+@import

@Configuration 注解: 平替bean.xml文件

@ComponentScan 注解: 平替 <context:component-scan base-package="com.frank">

@PropertySource("jdbc.properties") 注解: 平替 <context:property-placeholder location="classpath:jdbc.properties">

@Import(MyDataSource.class)注解:平替 <import resource="classpath:">

 

注意:bean.xml文件都被配置类给替换了,那么我在写测试类创建容器对象的时候就不能用

new ClassPathXmlApplicationContext(“bean.xml”)了;而是选择使用new AnnotationConfigApplicationContext(SpringConfig.class)。

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

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

相关文章

引号的艺术:用CSS quotes 属性打造个性化引用

引号的艺术&#xff1a;用CSS quotes 属性打造个性化引用 摘要 CSS 的 quotes 属性是一个强大的工具&#xff0c;它允许开发者自定义网页上的引用标记&#xff0c;从而增强网页的视觉效果和用户体验。本文将深入探讨 quotes 属性的使用方法&#xff0c;包括如何设置不同的引号…

ssrf漏洞之——漏洞复现

漏洞介绍 SSRF漏洞&#xff1a;SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由恶意访问者构造url&#xff0c;由服务端对此url发起请求的一个安全漏洞。 漏洞原理 SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能&#xff0c;并且没有对目…

Python :使用 YOLOv8、ultralytics 的 YOLO 模型识别图片里面有多少辆车

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo :联系我们:VX :tja6288 / EMAIL: 347969164@qq.com 文章目录 Python :使用 YOLOv8、ultralytic…

S7通信协议从入门到精通_1_Sharp7(C#)类编写西门子 S7系列 plc驱动程序(扩展C++语言)

文章目录 1. 什么是Sharp71.1 什么是Sharp71.2 下载文件中包含的内容1.3 使用示例2. 如何使用Sharp7进行上位机开发2.1 S7-1200的配置2.2 创建示例项目2.3 连接到plc2.3 从DB读取2.4 写入DB2.5 示例代码3. 扩展3.1 C++上位软件通过Snap7开源库访问西门子S7-1200/S7-1500数据块的…

打卡52天------图论(应用题)

一、孤岛的总面积 基础题目 可以自己尝试做一做 。 代码随想录 二、沉没孤岛 和上一题差不多&#xff0c;尝试自己做做 代码随想录 三、水流问题 需要点优化思路&#xff0c;建议先自己读题&#xff0c;相处一个解题方法&#xff0c;有时间就自己写代码&#xff0c;没时间就…

工业4G路由器

设备概述 路由器是基于4G 技术研发的无线路由网关设备&#xff0c;除了具备传统路由器 的 VPN 、防火墙、 NAT 、 PPPoE 、 DHCP 等功能之外&#xff0c;还能支持 4G 无线拨号&#xff0c;提供最高可达 150Mbps 的无线高速带宽。路由器支持四个以太网接口&#xff0c;可更好…

谷歌、火狐及Edge等浏览器中实现allWebPlugin中间件自动安装及升级

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

【Kotlin设计模式】Kotlin实现单例模式

前言 单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;是确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。在 Android 中&#xff0c;有许多系统服务和 API 使用了单例模式&#xff0c;比如&#xff1a; Context: 通过getApplication…

Mora:多智能体框架实现通用视频生成

人工智能咨询培训老师叶梓 转载标明出处 尽管已有一些模型能够生成视频&#xff0c;但大多数模型在生成超过10秒的长视频方面存在局限。Sora模型的出现标志着视频生成能力的一个新时代&#xff0c;它不仅能够根据文本提示生成长达一分钟的详细视频&#xff0c;而且在编辑、连接…

Image Stride(内存图像行跨度)

When a video image is stored in memory, the memory buffer might contain extra padding bytes after each row of pixels. The padding bytes affect how the image is store in memory, but do not affect how the image is displayed. 当视频图像存储在内存时&#xff0…

HeidiSQL中一些简单mysql语句的含义(二)

一、排序 #根据年龄进行降序排序 select * from student order by age desc; #根据年龄进行升序排序 select * from student order by age asc; #给字段起别名&#xff0c;as可以省略 select no as 编号, name as 姓名,age as 年龄 from student order by age asc; #查找…

【USRP】 Link 16 战术数据链 实训系统

Link 16 战术数据链 实训系统 一、基于USRP的Link16平台简介1、整体架构2、JTIDS终端架构3、平台特点3.1、提高技术理解与应用能力3.2、培养创新思维与问题解决能力3.3、加强跨学科融合与团队合作 4、平台建设4.1、基础理论教学模块4.2、LabVIEW 算法模块4.3、USRP仿真模块4.4、…

Unity+Addressable

前期准备 下载一个hfs本地服务器&#xff0c;打开即可 HFS ~ HTTP 文件服务器 (rejetto.com) 1.安装Addressable插件 创建组 2.使用图片创建预制体 放入Addressable Groups内 3.右键 新建组 创建预制体t拖拽放入新建组里 新组命名为Gameobject 简化名称 4.创建一个测试脚本 …

点亮编程之路:如何克服学习中的挫折感

目录 引言 一、心态调整 A. 保持积极乐观的学习态度 1. 接受错误和失败 2. 专注于过程而非结果 3. 设定合理的目标和期望 B. 培养持续学习的习惯 1. 制定学习计划 2. 定期反思和总结 3. 寻找学习的乐趣 二、学习方法 A. 有效的学习策略 1. 分解复杂问题 2. 主动实践…

第三十一章:docker如何部署Nexus

docker如何部署Nexus 目标 掌握 Nexus docker compose安装安装Docker和Docker Compose:确保您的系统已安装Docker和Docker Compose。如果尚未安装,可以参考Docker官方文档进行安装12。 创建Docker Compose文件:在您选择的目录下创建一个名为docker-compose.yml的新文件,并…

jmeter中CSV 数据文件设置用例

1、CSV数据文件的基础使用 线程组->添加->配置远近->CSV数据文件设置 2、多条用例运行CSV数据文件 由于我的csv请求的json数据有“&#xff0c;”所以我这边 分隔符选择了*号 写了两行需要测试的用例&#xff0c;需要添加一个“循环控制器” 线程组->添加-&g…

内存管理篇-09伙伴系统初始化一:memblock管理

1.伙伴系统的初始化概述 硬件初始化&#xff1a;计算机加电后进行硬件检测。加载引导程序&#xff0c;将Linux内核加载到内存中。 内核初始化&#xff1a;内核被加载后开始初始化各个子系统。进行CPU架构相关的初始化。初始化内存控制器和其他设备驱动。 内存管理初始化&…

Oracle开始严查Java许可!

0x01、 前段时间在论坛里就看到一个新闻&#xff0c;说“Oracle又再次对Java下手&#xff0c;开始严查Java许可&#xff0c;有企业连夜删除JDK”&#xff0c;当时就曾在网上引起了一阵关注和讨论。 这不最近在科技圈又看到有媒体报道&#xff0c;Oracle再次严查&#xff0c;对…

C语言典型例题51

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题4.3 while循环与do……while循环的比较 代码&#xff1a; &#xff08;1&#xff09;while语句 #include <stdio.h> int main() {int sum0;// char ch;while(1){sum0;//每一次输入结束后数的和重置int …

GDB的基本使用(1)

我有话说 因为时间和精力原因&#xff0c;本文写的虎头蛇尾了&#xff0c;除了启动调试与程序执行以外只有少量截图演示&#xff0c;只是简单的说明。如果有需要可以联系我&#xff0c;我有时间的话会把演示补上&#xff0c;谢谢理解。 启动调试与程序执行 启动调试并传递参数…