【Spring(四)】Spring基于注解的配置方式

news2024/11/22 17:26:00

有关Spring的所有文章都收录于我的专栏:👉Spring👈
目录
一、前言
二、基于注解需要的依赖
三、通过注解来配置Bean
四、注解配置Bean再补充
五、基于注解的自动装配
六、泛型依赖注入


相关文章

【Spring(一)】如何获取对象(Bean)【Spring(一)】如何获取对象(Bean)
【Spring(二)】java对象属性的配置(Bean的配置)【Spring(二)】java对象属性的配置(Bean的配置)
【Spring(三)】熟练掌握Spring的使用【Spring(三)】熟练掌握Spring的使用

一、前言

 前面的三节,我们已经对Spring基于XML方式配置做了一个完整的讲解。从这节开始,我们开始对Spring基于注解的配置方式做一个讲解。

二、基于注解需要的依赖

spring-aop-5.3.8.jar,这个jar包在spring的lib目录下。到这里我们Spring基本使用,一共需要六个jar包。
在这里插入图片描述

三、通过注解来配置Bean

package com.jl.spring.entity;

import org.springframework.stereotype.Component;

/**
 * @author Long
 * @date 2022/11/21
 * @CSDN https://blog.csdn.net/qq_35947021
 **/
@Component
public class MyCal {
    public MyCal(){
        System.out.println("MyCal被调用.....");
    }
}

在Spring配置文件中指定"自动扫描的包",这样IOC容器才能检测到哪些类有注解。而且context:也得在头部添加声明,在IDEA中我们可以按ALT+ENTER自动补全,所以我们这里不再赘述。

<context:component-scan base-package="com.jl.spring.entity"></context:component-scan>

测试类

@Test
public void setBeanByAnnotation(){
      ApplicationContext ioc = new ClassPathXmlApplicationContext("bean.xml");
      MyCal bean = ioc.getBean(MyCal.class);
      System.out.println(bean);
  }

结果截图:
在这里插入图片描述

四、注解配置Bean再补充

 上面我们介绍了Spring基于注解配置Bean的方式,但那只是最简单的一种用法,我们这里继续对注解配置Bean深入了解一下。
 除了上边我们用到的@Component之外,我们还有@Controller@Service@Repository。它们都可以用来标注在一个类上面创建Bean对象。有这么多相同功能的注解是为了,标识不同层的类,可以理解为每个层都有它对应的注解,这样做的目的是为了使我们的程序架构逻辑更加的清晰。
在这里插入图片描述
当我们不清楚一个类属于哪一层的时候,我们就可以使用@Component

过滤不需要扫描的类

 我们上边知道了,想要通过注解来配置Bean的前提是需要让Spring容器知道,我们的哪个包下的类有注解。但有时我们的需求是:不想让Spring扫描下面的包下的某些类。这种情况我们就可以使用下边的这种方式:
<context:component-scan base-package="com.jl.spring.entity">
	<context:exclude-filter type="annotation"  expression="org.springframework.stereotype.Service"/>
</context:component-scan>
  1. <context:exclude-filter>:表示扫描过滤掉当前包的某些类。
  2. type="annotation":表示按照注解类型进行过滤。
  3. expression:就是注解的全类名。比如:org.springframework.stereotype.Service就是 @Service 注解的全类名,其它注解也是这个道理。

通过注解指定id值

 在上边的演示中,我特意用了通过类型来获取创建的Bean对象,并不是注解不支持指定id值。我们通过XML方式可以做到了,我们注解也可以。

package com.jl.spring.entity;

import org.springframework.stereotype.Component;

/**
 * @author Long
 * @date 2022/11/21
 * @CSDN https://blog.csdn.net/qq_35947021
 **/
@Component(value = "myCal")
public class MyCal {
    public MyCal(){
        System.out.println("MyCal被调用.....");
    }
}

XML中指定扫描的包,我们这里不再列出。

测试类

@Test
public void setBeanByAnnotation(){
    ApplicationContext ioc = new ClassPathXmlApplicationContext("bean.xml");
    MyCal bean = ioc.getBean("myCal",MyCal.class);
    System.out.println(bean);
}

结果:
在这里插入图片描述
而且如果我们不指定id值,默认的id值是:将类名的首字母小写作为id值
在这里插入图片描述

基于注解来配置多例Bean

 和XML方式一样,Spring容器默认的就是单例。我们想要使用多例就得使用@Scope,值设置为prototype。单例就是singleton

package com.jl.spring.entity;

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

/**
 * @author Long
 * @date 2022/11/21
 * @CSDN https://blog.csdn.net/qq_35947021
 **/
@Scope(scopeName = "prototype")
@Component(value = "myCal")
public class MyCal {
    public MyCal(){
        System.out.println("MyCal被调用.....");
    }
}

测试类

@Test
public void setBeanByAnnotation(){
    ApplicationContext ioc = new ClassPathXmlApplicationContext("bean.xml");
    MyCal bean = ioc.getBean("myCal",MyCal.class);
    MyCal bean1 = ioc.getBean("myCal",MyCal.class);
    System.out.println(bean);
    System.out.println(bean1);
}

结果截图:
在这里插入图片描述

基于注解给Bean注入属性值

&esmp;在使用XML方式给Bean注入属性值的时候,我们使用<property>或者<constructor-arg>。我们采用注解的方式可以使用@Value实现相同的效果。

package com.jl.spring.entity;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * @author Long
 * @date 2022/11/21
 * @CSDN https://blog.csdn.net/qq_35947021
 **/
@Component
public class Person {
    @Value(value = "张三")
    private String name;
    @Value(value = "123")
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类

@Test
public void setBeanByAnnotation(){
    ApplicationContext ioc = new ClassPathXmlApplicationContext("bean.xml");
    Person person = ioc.getBean("person", Person.class);
    System.out.println(person);
}

结果截图:
在这里插入图片描述
我们这里知识介绍属性值是基本数据类型时候的配置方式。详细的@Value注解的使用,我推荐大家去看冰河大佬有关@Value的文章:Spring注解驱动开发】如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!

五、基于注解的自动装配

我们直接上案例:

package com.jl.spring.component;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

/**
 * @author long
 * @date 2022/9/3
 * @Controller 标识该类是一个控制器Controller,通常这个类是一个Servlet
 */
@Controller
public class UserAction {
    @Autowired
    private UserService userService400;
    public void sayOk(){
        System.out.println("userAction 的sayOk方法");
        System.out.println(userService400);
        userService400.hi();
    }
}

@Autowired

  1. 在IOC容器中查找待装配的组件的类型,如果有唯一的bean匹配(按照类型),则使用该bean装配。
  2. 如何装配的类型对应的bean在IOC容器中有多个,则使用待装配的属性的属性名作为id值再进行查找,找到就装配,找不到就抛出异常。

除此之外,还有一个@Resource也可以用于Bean的自动装配

@Resource

  1. 此注解有两个属性nametype,Spring将@Resource注解的name属性解析为bean的id值。例如:@Resource(name = “userService”),表示将id=userService的对象装配。
  2. 如果@Resource没有指定nametype,则先使用byName注入策略。如果匹配不上,再使用byType策略。例如:@Resource(type = UserService.class), 表示按照UserService.class类型进行装配,这时只能有一个USerService类型的对象
  3. 如果两个属性都不写则先使用byName(按照属性名)注入策略,如果匹配不上,则使用byType策略,如果都不成功,则装配失败。

除了上述的两个注解外,我们还可以将@Qualifier和@Autowired搭配使用

@Autowired
@Qualifier(value = “userService”)
这两个注解配合使用,相当于@Resource(value = “userService”)。/

package com.jl.spring.component;

import org.springframework.stereotype.Service;

/**
 * @author long
 * @date 2022/9/3
 * @Service来标识这是一个Service类
 *
 */
@Service
public class UserService {
    public void hi(){
        System.out.println("service的hi方法");
    }
}
package com.jl.spring.component;

import org.springframework.stereotype.Repository;

/**
 * @author long
 * @date 2022/9/3
 * 使用 @Repository 标识该类是一个持久化类
 */
@Repository
public class UserDao {
}

测试类

@Test
public void setProByAnnotation(){
    ApplicationContext ioc = new ClassPathXmlApplicationContext("beans05.xml");
    UserAction userAction = ioc.getBean("userAction", UserAction.class);
    UserService userService = ioc.getBean("userService", UserService.class);
    System.out.println(userService);
    System.out.println(userAction);
    userAction.sayOk();
}

结果截图:
在这里插入图片描述

六、泛型依赖注入

 泛型依赖注入就是允许我们在使用spring进行依赖注入的同时,利用泛型的优点对代码进行精简,将可重复使用的代码全部放到一个类之中,方便以后的维护和修改。

package com.jl.spring.depinjection;

/**
 * @author long
 * @date 2022/9/5
 */
public class Phone {
}
package com.jl.spring.depinjection;

import org.springframework.stereotype.Repository;

/**
 * @author long
 * @date 2022/9/5
 */
@Repository
public abstract class BaseDao<T> {
    public abstract void save();
}
package com.jl.spring.depinjection;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Repository;

/**
 * @author long
 * @date 2022/9/5
 */
@Repository
public class PhoneDao extends BaseDao<Phone>{
    @Override
    public void save() {
        System.out.println("PhoneDao save()...");
    }
}
package com.jl.spring.depinjection;

import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.Resource;

/**
 * @author long
 * @date 2022/9/5
 * 自定义泛型类
 */

public class BaseService<T> {
    @Autowired
    private BaseDao<T> baseDao;
    public void save(){
        baseDao.save();
    }
}
package com.jl.spring.depinjection;

import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

/**
 * @author long
 * @date 2022/9/5
 */
@Service
public class PhoneService extends BaseService<Phone>{
}

测试类

@Test
public void setProByDependencyInjection(){
    ApplicationContext ioc = new ClassPathXmlApplicationContext("beans06.xml");
    PhoneService phoneService = ioc.getBean("phoneService", PhoneService.class);
    phoneService.save();
    System.out.println("ok");
}

结果截图:
在这里插入图片描述


如果文章中有描述不准确或者错误的地方,还望指正。您可以留言📫或者私信我。🙏
最后希望大家多多 关注+点赞+收藏^_^,你们的鼓励是我不断前进的动力!!!
感谢感谢~~~🙏🙏🙏

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

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

相关文章

企业知识管理难?选对系统可解决90%的问题

编者按&#xff1a;知识管理是企业加强竞争优势和核心竞争力的保证。本文分析了企业知识管理中遇到的困难&#xff0c;并进一步提出了解决方案——天翎KMS群晖云盘一体机。 关键词&#xff1a;在线预览&#xff0c;在线编辑&#xff0c;权限管理&#xff0c;水印设置&#xff…

macOS Ventura13.0.1解决office缺少“宋体”等问题。安装微软雅黑、宋体等字体。

最近在弄项目验收文档&#xff0c;文档格式要求宋体&#xff0c;用微软的Word打开文件保存时经常提示&#xff0c;系统不存在宋体字体&#xff0c;查了下是是Mac系统本身不存在该字体导致的&#xff0c;下载该字体&#xff0c;然后通过字体册安装就行。 我打包成压缩包了具体有…

【易错小点记录】坑人的for循环与逻辑或

目录 1.题目 1.1.以下for循环的执行次数是&#xff08; &#xff09; 1.1.1.题目分析 1.1.2.题目答案 1.2.下列main()函数执行后的结果为&#xff08;&#xff09; 1.2.题目分析 1.3.题目答案 2.题目 2.1.下面程序输出是什么&#xff1f;&#xff08; &#xff09; 2.…

非线性海洋捕食者算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

树表的查找

二叉排序树 二叉排序树&#xff08;BST&#xff09;又称二叉搜索树&#xff0c;其满足以下性质&#xff1a; &#xff08;1&#xff09;若根节点的左子树非空&#xff0c;则左子树上的所有节点关键字均小于根节点的关键字。 &#xff08;2&#xff09;若根节点的右子树非空&a…

补充(二)古典密码两张思维导图速通

目录 目录 古典密码思维导图 古典密码分析思维导图 唯密文分析古典密码 单表代替密码 棋盘密码 曾公密码 置换密码的代表&#xff1a;斯巴达人的密码棒 古典密码思维导图 古典密码分析思维导图 唯密文分析古典密码 最困难的分析条件通常需要用到英文字母的频率分析和反…

【微服务】SpringCloud中Ribbon集成Eureka实现负载均衡

&#x1f496; Spring家族及微服务系列文章 ✨【微服务】SpringCloud轮询拉取注册表及服务发现源码解析 ✨【微服务】SpringCloud微服务续约源码解析 ✨【微服务】SpringCloud微服务注册源码解析 ✨【微服务】Nacos2.x服务发现&#xff1f;RPC调用&#xff1f;重试机制&#xf…

Maven打Jar包,启动报NoClassDefFoundError错误

今天准备将游戏服务器的压测机器人打包分发给其他人来运行对服务器进行压力测试。打成的jar包发现运行报错了。找了半天才找到最终原因。下面是原因和一些分析的情况。 原因 java -jar .\robot.jar发现错误如下 看到这个错误就知道jvm找不到对应的类。但是为什么找不到对应的…

JVM的内存区域划分

文章目录 前言一、本地方法栈&#xff08;线程私有&#xff09;二、程序计数器&#xff08;线程私有&#xff09;三、Java虚拟机栈&#xff08;线程私有&#xff09;四、堆&#xff08;线程共享&#xff09;五、方法区&#xff08;元数据区&#xff09;前言 JVM 是Java 运行的基…

Android:Navigation使用safe args插件传递参数

Navigation使用safe args插件传递参数1、 使用配置2、举例说明1、MainActivity2、AvalFragment, DovomFragment2.1、AvalFragment2.2、DovomFragment参考1、 使用配置 afe args与传统传参方式相比&#xff0c;好处在于安全的参数类型&#xff0c;并且通过谷歌官方的支持&#…

GameFrameWork框架(Unity3D)使用笔记(六)游戏主流程ProcedureMain——从数据表加载出所需实体

目录 前言&#xff1a; 一、Entity配置表 1、创建数据表 2、创建数据表行类 二、Character配置表 1、创建数据表 2、写数据表行类 三、加载数据表 四、扩展一下Entity模块 五、应用Character数据表的位置信息 六、测试 总结&#xff1a; 前言&#xff1a; 上一篇中我…

第2章 Elasticsearch入门

2.1 Elasticsearch 安装 2 . 1 .1 下载软件 Elasticsearch的官方地址&#xff1a;www.elastic.co/cn/ Elasticsearch最新的版本是7.11.2&#xff08;截止2021.3.10&#xff09;&#xff0c;我们选择7.8.0版本&#xff08;最新版本半年前的版本&#xff09; 下载地址&#x…

贝叶斯网络

贝叶斯网络的独立性&#xff1a; 当一个结点G的父节点已知的时候&#xff0c;该结点G与其所有非后代结点条件独立 交叉因果推断&#xff1a;如上述图中的例子,对于P&#xff08;i | g | d&#xff09;等于说是中D到I 这条路径中&#xff0c;做半边的路径是顺着箭头走的&#x…

表白墙(前端+后端+数据库)

目录 一、创建项目 1、创建maven项目&#xff0c;引入依赖 2、创建目录结构 二、前端代码 1、页面内容和样式 2、提交按钮的点击事件 3、发送GET请求 三、数据库 四、后端代码 1、重写doPost方法 1.1 创建Message类 1.2 重写doPost方法 1.3 实现save方法 2、重写…

你需要知道的50颗卫星:地球卫星清单

开放数据卫星 1陆地卫星 地球资源卫星令人难以置信的长期遗产已经保存了地球40多年的历史。通过无数的应用程序&#xff0c;它甚至发现 island Landsat in Canada。 图片来源&#xff1a;NASA 2哨兵 作为 Copernicus Programme 哨兵的6个任务的舰队是一个游戏改变者。明确地…

2022年经典散文:滚烫的石板

滚烫的石板 ——灵遁者 此刻&#xff0c;我想表达的情愫大概有千万种&#xff0c;如何表达并不容易&#xff0c;就好像一个人的时候&#xff0c;也在面对某个我认识或者不认识的人&#xff0c;话总是说不清&#xff0c;也说不出来。 小孩总是敢于表达的&#xff0c;就像一条没…

.NET 7 的 AOT 到底能不能扛反编译?

一&#xff1a;背景 1.讲故事 在B站&#xff0c;公众号上发了一篇 AOT 的文章后&#xff0c;没想到反响还是挺大的&#xff0c;都称赞这个东西能抗反编译&#xff0c;可以让破解难度极大提高&#xff0c;可能有很多朋友对逆向不了解&#xff0c;以为用 ILSpy,Reflector,DnSpy…

群勃龙-半琥珀酸酯(TR-HS)与BSA牛血清白蛋白偶联 TR-HS-BSA

产品名称&#xff1a;群勃龙-半琥珀酸酯与牛血清白蛋白偶联 英文名称&#xff1a;TR-HS-BSA 用途&#xff1a;科研 状态&#xff1a;固体/粉末/溶液 产品规格&#xff1a;1g/5g/10g 保存&#xff1a;冷藏 储藏条件&#xff1a;-20℃ 储存时间&#xff1a;1年 牛血清中的简单蛋白…

全光谱台灯对孩子眼睛有影响吗?什么样的全光谱台灯真的有用

全光谱台灯对眼睛当然是有影响的&#xff0c;因为光谱成分丰富度与太阳光类似&#xff0c;所以无限接近于太阳光的显色能力&#xff0c;这样的灯光下物体的色差如同沐浴太阳光一般真实&#xff0c;色差不失真&#xff0c;人眼自然就越舒服。 那么什么样的全光谱台灯有用呢&…

Python|excel表格数据一键转json格式小工具|支持xlsx、xls格式转json|【源码+解析】

背景 最近在使用JavaScript编写一些浏览器RPA脚本&#xff0c;脚本使用过程中遇到一些问题&#xff0c;脚本使用的数据往往存放在excel表&#xff0c;但运行时只能读取json数据&#xff0c;导致频繁人工excel转json&#xff0c;效率低下。 遇到问题后赶紧搜索excel转json小工…