Spring第九阶段:Spring的注解功能

news2024/9/8 7:18:32

注解功能

1、注解配置Dao、Service、Controller组件

通过注解分别创建Dao、Service、Controller
Spring配置bean的常用注解有

@Controller	配置web层的组件	
@Service	配置Service组件
@Repository	配置Dao组件
@Component	配置JavaBean( 除Service , Dao , Controller组件之外的JavaBean )
@Scope						配置单例,或多例
@Scope("prototype") // 表示多例 , 默认不使用@Scope注解表示单例 

如果需要自定义id值. 只需要在注解中直接注入value属性值即可.
在这里插入图片描述
在这里插入图片描述

/**
 *  @Component 注解的作用相当于: <br/>
 *      <bean class="com.atguigu.annotation.Book" id="book"></bean> <br/>
 *      class 属性是当前Bean的全类名 <br/>
 *      id 属性默认是当前类名首字母小写 <br/>
 */
@Component
public class Book {  }

/**
 * @Controller 注解的作用相当于: <br/>
 * <bean class="com.atguigu.annotation.BookController" id="bookController"></bean> <br/>
 *  class 是当前类的全类名 <br/>
 *  id 是类名首字母小写 <br/>
 */
@Controller
public class BookController {  }


/**
 * @Repository注解作用相当于: <br/>
 * <bean class="com.atguigu.annotation.BookDao" id="bookDao"></bean>
 *  class 属性是当前类的全类名 <br/>
 *  id 默认是类名首字母小写 <br/>
 */
@Repository
public class BookDao {  }

/**
 * @Service 注解的作用相当于: <br/>
 *  <bean class="com.atguigu.annotation.BookService" id="bookService"></bean> <br/>
 *   class 属性是当前类的全类名 <br/>
 *   id 属性是当前类名首字母小写 <br/>
 */
@Service
public class BookService {  }

在applicationContext.xml配置文件中加入包扫描才可以使用注解:

<!--
    context:component-scan 表示组件扫描
        base-package 是你要搜索的包.( 也会扫描子包 )
-->
<context:component-scan base-package="com.atguigu"></context:component-scan>

测试

public class SpringTest {

    @Test
    public void test1() {

        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("applicationContext.xml");

        System.out.println(applicationContext.getBean("book"));
        System.out.println(applicationContext.getBean("bookDao"));
        System.out.println(applicationContext.getBean("bookService"));
        System.out.println(applicationContext.getBean("bookController"));

    }

}

2、指定扫描包时的过滤内容

使用context:include-filter指定扫描包时要包含的类
使用context:exclude-filter指定扫描包时不包含的类
<context:include-filter />	设置包含的内容
<context:exclude-filter />	设置排除的内容

在这里插入图片描述
注意:通常需要与use-default-filters属性配合使用才能够达到“仅包含某些组件”这样的效果。即:通过将use-default-filters属性设置为false,

applicationContext.xml 中配置的内容如下

<!-- use-default-filters="false" 设置取消默认包含规则 -->
	<context:component-scan base-package="com.atguigu" use-default-filters="false">
		<!-- context:include-filter 设置包含的内容 -->
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
		<!-- context:exclude-filter 设置排除的内容 -->
		<context:exclude-filter type="assignable" expression="com.atguigu.service.BookService"/>
	</context:component-scan>

以上配置会包含所有@Service注解的类。排除com.atguigu.service.BookService类

3、使用注解@Autowired自动装配

使用@Autowired注解实现根据类型实现自动装配
@Autowired 注解 会自动的根据标注的对象类型在Spring容器中查找相对应的类。如果找到,就自动装配。
使用@Autowired注解,不需要get/set方法

@Service
public class BookService {
    /**
     * @Autowired 注解的作用是在Spring容器中查找需要的Bean对象.然后赋值 <br/>
     *  1 先按类型查找,找到一个就注入 <br/>
     *
     */
    @Autowired
    private BookDao bookDao;

    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDao +
                '}';
    }
}

4、多个同类型的bean如何自动装配

如果资源类型的bean不止一个,默认根据@Autowired注解标记的成员变量名作为id查找bean,进行装配

@Service
public class BookService {
    /**
     * @Autowired 注解的作用是在Spring容器中查找需要的Bean对象.然后赋值 <br/>
     *  1 先按类型查找,找到一个就注入 <br/>
     *  2 如果按类型查找到多个,接着按属性名做为id继续查找并注入 <br/>
     */
    @Autowired
    private BookDao bookDao;

    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDao +
                '}';
    }
}

5、使用@Qualifier装配指定id的bean对象

如果根据成员变量名作为id还是找不到bean,可以使用@Qualifier注解明确指定目标bean的id

@Service
public class BookService {
    /**
     * @Autowired 注解的作用是在Spring容器中查找需要的Bean对象.然后赋值 <br/>
     *  1 先按类型查找,找到一个就注入 <br/>
     *  2 如果按类型查找到多个,接着按属性名做为id继续查找并注入 <br/>
     *  3 @Qualifier("xxx")注解可以指定一个id到Spring容器中查找并注入 (会忽略属性名) <br/>
     */
    @Qualifier("bookDao")
    @Autowired
    private BookDao bookDaoExt;

    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDaoExt +
                '}';
    }
}

6、@Autowired注解的required属性作用

@Autowired注解的required属性指定某个属性允许不被设置

@Service
public class BookService {
    /**
     * @Autowired 注解的作用是在Spring容器中查找需要的Bean对象.然后赋值 <br/>
     *  1 先按类型查找,找到一个就注入 <br/>
     *  2 如果按类型查找到多个,接着按属性名做为id继续查找并注入 <br/>
     *  3 @Qualifier("xxx")注解可以指定一个id到Spring容器中查找并注入 (会忽略属性名) <br/>
     *  4 如果@Qualifier("xxx")注解没有按照指定id找到Bean,也可以设置required = false允许字段值为null.
     */
    @Qualifier("bookDao1")
    @Autowired(required = false)
    private BookDao bookDaoExt;

    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDaoExt +
                '}';
    }
}

7、@Autowired和@Qualifier在方法上的使用

在方法的形参位置使用@Qualifier注解

/**
 * @Autowired 注解如果标识在方法上,则Bean对象创建好之后,就会马上调用,一般用于给JavaBean属性初始化赋值 <br/>
 *  1 Spring框架会自动的按参数的类型到Spring容器中按类型查找Bean并传递赋值 <br/>
 *  2 如果按类型找到多个,再按参数名做id继续查找并赋值 <br/>
 *  3 使用@Qualifier("xxx")注解在参数上指定一个id到Spring容器中查找并注入 (会忽略参数名) <br/>
 *  4 如果@Qualifier("xxx")注解没有按照指定id找到Bean,也可以设置required = false允许方法不调用
 */
@Autowired(required = false)
public void abc(@Qualifier("bookDao1") BookDao bookDaoExt1){
    System.out.println("abc() ===>>> " + bookDaoExt1);
    this.bookDaoExt = bookDaoExt1;
}

8、泛型注入

测试泛型依赖注入
在这里插入图片描述

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

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

相关文章

台积电和三星都变脸了,美国图谋失败,外媒:拜登心都碎了

美国的图谋甚大&#xff0c;然而美国的图谋却又如此迅速的浮现&#xff0c;看穿美国图谋的台积电和三星两家芯片企业如今不干了&#xff0c;这将破坏美国的计划&#xff0c;让美国无可奈何。 一、美国精心编织的大网 从数年前开始&#xff0c;美国就要求台积电和三星上交机密数…

想学编程但没有好的资料 来这 Python 爬取信息并写入数据,最详细教程

提示一下&#xff1a;我这个中一些用import引用的软件包&#xff0c;你们小白记得要下载哟 不然的话会报错的哟&#xff01; 下载软件包很简单的! 话不多说&#xff0c;直接开始… from selenium.webdriver.common.by import By from selenium import webdriver import re, …

5月2日第壹简报,星期二,农历三月十三

5月2日第壹简报&#xff0c;星期二&#xff0c;农历三月十三坚持阅读&#xff0c;静待花开1. “港车北上”政策公布&#xff1a;6月1日起接受申请&#xff0c;7月1日起可驶入广东&#xff0c;将惠及45万香港车主。2. 全球女性第一人&#xff01;董红娟登顶全部14座8000米级高峰…

nvm 安装 node,配置 yarn,cnpm

nvm 安装 node&#xff0c;配置 yarn, cnpm nvmnodeyarncnpm nvm 是什么&#xff1f;nodejs 的版本管理工具&#xff0c;为了解决 node.js 各种版本存在不兼容现象可以通过它安装和切换不同版本的 node.js重要&#xff1a;完全卸载本地 node下载链接 卸载完成之后&#xff0c;…

初识C++之智能指针

目录 一、智能指针的概念 二、RAII 三、 智能指针的拷贝构造 1. 智能指针的拷贝构造问题 2. C库中的智能指针 2.1 auto_ptr 2.2 unique_ptr 2.3 shared_pt 2.4 weak_ptr 四、shared_ptr的循环引用问题 五、 定制删除器 一、智能指针的概念 在了解智能指针的概念前&…

Java连接与操作Perforce

对于源码控管的基本使用来说&#xff0c; 使用Perforce的客户端工具就可以了&#xff0c; 但是某些应用场景下可能需要使用代码来与Perforce服务器进行交互&#xff0c; 比如&#xff1a; 自动部署流程中的自动取代码&#xff08;该场景一般也可以使用P4命令行工具实现&#x…

Windows共享内存与死锁

实验一 一、实验内容或题目&#xff1a; 利用共享内存完成一个生产者进程和一个消费者进程的同步。 二、实验目的与要求&#xff1a; 1、编写程序&#xff0c;使生产者进程和消费者进程通过共享内存和mutex来完成工作同步。 2、了解通过操作系统接口调用&#xff0c;实现通…

Linux字符设备驱动

前言 代码结构简单&#xff0c;旨在用最简单的原理理解最主要的框架逻辑&#xff0c;细节需要自行延伸。 -----------------学习的基础底层逻辑 基础步骤 开发linux内核驱动需要以下4个步骤&#xff1a; 编写驱动代码编写makefile编译和加载驱动编写应用程序测试驱动 由于硬…

Android9.0 系统Framework发送通知流程分析

1.前言 在android 9.0的系统rom定制化开发中,在systemui中一个重要的内容就是系统通知的展示,在状态栏展示系统发送通知的图标,而在 系统下拉通知栏中展示接收到的系统发送过来的通知,所以说对系统framework中发送通知的流程分析很重要,接下来就来分析下系统 通知从frame…

开发攻城狮必备的Linux虚拟机搭建指南|原创

hi&#xff0c;我是阿笠&#xff01; 这篇文章主要面对的是不常搭建Linux操作系统环境的开发同学&#xff0c;文中介绍了基本操作步骤并且提供了相关云盘资源&#xff0c;都是为了节约时间&#xff01; 因为从我自身来讲&#xff0c;作为一名后端开发&#xff0c;经常需要练习一…

c#笔记-内置类型

内置类型 内置类型是一些有关键字表示的类型。关键字具有非常高的优先级&#xff0c;可以让你在没有别的配置的情况下&#xff0c; 只要用的是c#就可以使用。这也意味着这些类型是非常重要&#xff0c;或是基本的东西。 整数&#xff1a;byte, sbyte, short, ushort, int, ui…

【Python入门】搭建开发环境-安装Pycharm开发工具

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

【数据结构】线性表之单链表(讲解实现——带动图理解)

文章目录 单链表单链表主体结构单链表操作函数介绍单链表操作函数实现单链表的初始化&#xff1a;打印函数单链表插入函数&#xff1a;头插尾插指定结点后插入和查找函数单链表结点之前插入数据 单链表删除函数头删尾删指定结点后删除指定结点删除 销毁单链表 文件分类test.cLi…

【STM32】基础知识 第十课 CubeMx

【STM32】基础知识 第十课 CubeMx STM32 CubeMX 简介安装 JAVACubeMX 安装新建 STM32 CubeMX 工程步骤新建工程时钟模块配置GPIO 配置生成源码 main.c STM32 CubeMX 简介 CubeMX (全称 STM32CubeMX) 是 ST 公司推出的一款用于 STM32 微控制器配置的图形化工具. 它能帮助开发者…

「Bug」解决办法:Could not switchto this profil,无法使用节点的解决方法,彻底解决

♥️作者&#xff1a;白日参商 &#x1f935;‍♂️个人主页&#xff1a;白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

二十五、OSPF高级技术——开销值、虚链路、邻居建立、LSA、静默接口

文章目录 调试指令&#xff08;三张表&#xff09;1、邻居表&#xff1a;dis ospf peer brief2、拓扑表&#xff08;链路状态数据库&#xff09;&#xff1a;dis ospf lsdb3、路由表&#xff1a;dis ip routing-table 一、OSPF 开销值/度量值&#xff08;cost&#xff09;1、co…

Python基础合集 练习15(内置函数 匿名函数)

匿名函数 以lambda开头表示这是匿名函数&#xff0c;之后的x,y是函数参数 def sub(a,b): return a-b print(sub(10,3)) print(lambda x,y:x-y) sublambda x,y:x-y print(sub(8,4)) def game(math,chinese,english): “”" 功能&#xff1a;计算三科的成绩 math&#xf…

谈谈多线程的上线文切换

大家好&#xff0c;我是易安&#xff01; 我们知道&#xff0c;在并发程序中&#xff0c;并不是启动更多的线程就能让程序最大限度地并发执行。线程数量设置太小&#xff0c;会导致程序不能充分地利用系统资源&#xff1b;线程数量设置太大&#xff0c;又可能带来资源的过度竞争…

【C++】隐式转换与explicit关键字、运算符及其重载、this关键字

C隐式转换与explicit关键字 隐式构造函数 隐含的意思是不会明确告诉你要做什么 隐式转换 C允许编译器对代码执行一次隐式转换&#xff0c;而不需要使用casr强制转换 例1 #include <iostream> #include <string>class Entity { private:std::string m_Name;in…

13 SQL——数值函数

1 ceil() 数值向上取整&#xff08;前提是小数位不是0&#xff09; select ceil(1.2);2 floor() 数值向下取整&#xff08;前提是小数位不是0&#xff09;select floor(1.8);3 mod() 取&#xff08;x%y&#xff09;的模运算&#xff08;求余数运算&#xff09; select …