spring之IoC注解(三)负责注入的注解

news2024/11/17 7:46:47

文章目录

  • 前言
  • 一、@Value注解
    • Product类
    • spring配置文件
    • 测试程序
    • 运行结果
  • 二、@Autowired与@Qualifier注解
    • 1.创建OrderDao接口
    • 2.创建OrderDao接口实现类
    • 3.创建OrderService类
    • 4.配置文件
    • 5.测试程序
    • 6.运行结果
  • 三、@Resource注解(重要)
    • 1、创建StudentDao接口
    • 2、创建接口实现类
    • 3、创建StudentService类
    • 4、测试程序
    • 5、运行结果
  • 四、全注解式开发


前言

IoC是控制反转,指的是①、把创建对象的权利交出去,让别人创建,②、创建之后两个对象之间关系的维护也不管了,交给Spring去管理。spring去依赖注入。
@Component、@Controller、@Service、@Repository
这四个注解是用来声明Bean的,声明后这些Bean将被实例化。如何给Bean的属性赋值?


一、@Value注解

当属性的类型是简单类型时。可以使用@Value注解进行注入,用这个注解的前提是先声明Bean,交给Spring容器来管理。

Product类

使用@Value注解的注入的话,可以用在属性上,并且可以不提供setter方法

@Component
public class Product {
    @Value("亲亲虾条")
    private String name;
    @Value("3")
    private int price;

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

spring配置文件

<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.powernode.bean3"></context:component-scan>
</beans>

测试程序

    @Test
    public void testValue(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-Di.xml");
        Product product = (Product) context.getBean("product");
        System.out.println(product);

    }

运行结果

在这里插入图片描述

@Value注解也可以用在set方法上

@Component
public class Product {
    private String name;
    private int price;

    @Value("盼盼虾条")
    public void setName(String name) {
        this.name = name;
    }
    @Value("5")
    public void setPrice(int price) {
        this.price = price;
    }

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

在这里插入图片描述
@Value注解也可以用在构造方法的形参上

@Component
public class Product {
    private String name;
    private int price;

    public Product(@Value("达利园虾条") String name, @Value("4") int price) {
        this.name = name;
        this.price = price;
    }

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

在这里插入图片描述

二、@Autowired与@Qualifier注解

@Autowired注解可以用来注入非简单类型
单独使用@Autowire注解,默认根据类型类型装配

1.创建OrderDao接口

public interface OrderDao {
    void insert();
}

2.创建OrderDao接口实现类

@Repository
public class OrderDaoImpl implements OrderDao {
    @Override
    public void insert() {
        System.out.println("正在保存订单信息");
    }
}

3.创建OrderService类

OrderService类中有OrderDao 属性
在属性上添加@Autowired注解
不需要指定任何属性,直接使用这个注解即可
这个注解的作用的根据类型byType进行自动装配

这里给属性添加set方法 并且在set方法上添加@Autowired注解也是可以的
在这里插入图片描述

给带有参数的构造方法上添加@Autowired注解也是可以的
在这里插入图片描述

给带有参数的构造方法的参数上添加@Autowired注解也是可以的
在这里插入图片描述
只有一个构造方法,并且构造方法的一个参数要和属性对应上,这种情况下@Autowired可以省略
在这里插入图片描述

@Service
public class OrderService {

    //不需要指定任何属性,直接使用这个注解即可
    //这个注解的作用的根据类型byType进行自动装配
    @Autowired
    private OrderDao orderDao;
    public void generate(){
        orderDao.insert();
    }
}

4.配置文件

<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd">


    <context:component-scan base-package="org.powernode"></context:component-scan>

</beans>

5.测试程序

    @Test
    public void testAutowired(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-autowired.xml");
        OrderService orderService = context.getBean("orderService", OrderService.class);
        orderService.generate();
    }

6.运行结果

在这里插入图片描述
但是当impl包下有两个实现类时,只靠@Autowired注解完成不了给属性赋值的操作
在这里插入图片描述
如果使用@Autowired注解,一定是根据类型进行装配的
如果想解决以上问题,只能根据名字进行装配。
@Autowired和@Qualifier联合使用就可解决以上问题
@Autowired
@Qualifier(“orderDaoImpl2”)
指定是哪个Bean

@Service
public class OrderService {

    //不需要指定任何属性,直接使用这个注解即可
    //这个注解的作用的根据类型byType进行自动装配
    @Autowired
    @Qualifier("orderDaoImpl2")
    private OrderDao orderDao;
    public void generate(){
        orderDao.insert();
    }
}

在这里插入图片描述

三、@Resource注解(重要)

@Resource注解也可以完成非简单类型的注入,那它和@Autowired注解有什么区别?

  • @Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更加具有通用性
  • @Autowired注解是spring框架自己的
  • @Resource注解默认根据名称来装配byName,未指定name时,使用属性名作为name,通过name找不到的话会自动启动通过类型byType装配
  • @Autowired注解默认根据类型装配byType,如果想根据名称装配,需要配合@Qualifier注解一起用
  • @Resource注解用在属性上、setter方法上
  • @Autowirede注解用在属性上、setter方法上、构造方法上、构造方法参数上。

1、创建StudentDao接口

public interface StudentDao {
    void deleteById();
}

2、创建接口实现类

StudentDaoImpl:

@Repository
public class StudentDaoImpl implements StudentDao {
    @Override
    public void deleteById() {
        System.out.println("mysql数据库正在删除学生信息");
    }
}

3、创建StudentService类

使用@Resource注解

这里给属性添加set方法 并且在set方法上添加@Resource注解也是可以的
在这里插入图片描述
不能出现在构造方法上

@Service
public class StudentService {
    @Resource(name ="studentDaoImpl")//根据名字进行装配
    private StudentDao studentDao;
    public void deleteStudent(){
        studentDao.deleteById();
    }
}

4、测试程序

   @Test
    public void testResource(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-resource.xml");
        StudentService service = context.getBean("studentService", StudentService.class);
        service.deleteStudent();
    }

5、运行结果

在这里插入图片描述

@Resource注解默认根据名称来装配byName,未指定name时,使用属性名作为name,通过name找不到的话会自动启动通过类型byType装配

未指定name时,使用属性名作为name
Resource注解没有指定name属性的值时,就默认将当前的属性名(studentDao)作为name的值进行查找,此时需要对StudentDaoImpl类中的@Repository注解name值也得为属性值才行(@Repository(“studentDao”)):

StudentService:

@Service
public class StudentService {
    @Resource//根据名字进行装配
    private StudentDao studentDao;
    public void deleteStudent(){
        studentDao.deleteById();
    }
}

StudentDaoImpl:

@Repository("studentDao")
public class StudentDaoImpl implements StudentDao {
    @Override
    public void deleteById() {
        System.out.println("mysql数据库正在删除学生信息");
    }
}

四、全注解式开发

所谓全注解式开发就是不再使用spring配置文件了。写一个配置类来代替配置文件。
编写一个类代替spring框架的配置文件

@Configuration
@ComponentScan({"cn.powernode.dao","cn.powernode.service"})
public class SpringConfig {
}

测试程序:
注意:测试程序中不能再写
ApplicationContext context = new ClassPathXmlApplicationContext(“spring-resource.xml”);

应该如下:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);


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

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

相关文章

皮带断裂识别检测系统 opencv

皮带断裂识别检测系统通过opencv深度学习yolo计算机视觉识别技术对皮带运行状态进行全天候实时监测&#xff0c;当识别到皮带断裂撕裂时立即抓拍告警存档。OpenCV-Python是一个Python绑定库&#xff0c;旨在解决计算机视觉问题。OpenCV-Python使用Numpy&#xff0c;这是一个高度…

LeetCode刷题复盘笔记—一文搞懂动态规划之392. 判断子序列问题(动态规划系列第三十八篇)

今日主要总结一下动态规划的一道题目&#xff0c;392. 判断子序列 题目&#xff1a;392. 判断子序列 Leetcode题目地址 题目描述&#xff1a; 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&a…

08 LIN

基础知识 LIN的全称为Local Interconnect Network。LIN主要功能是为CAN总线网络提供辅助功能&#xff0c;应用场合有智能传感节点、自动车窗节点等。 硬件 特点 1.采用单主多从的组网方式&#xff0c;无CAN总线那样的仲裁机制&#xff0c;最多可连接16个节点&#xff08;1主…

大数据技术——HBase安装配置DDLDML操作

HBase文章目录1. HBase 安装1.1 HBase下载1.2 HBase安装1.3 HBase 初始配置2. 配置高可用并且群起集群2.1 HBase高可用2.2 群起集群2.3 进入HBase客户端3. DDL&DML操作3.1 DDL操作3.2 DML操作1. HBase 安装 1.1 HBase下载 HBase下载官方网站直达 选择自己需要的版本&…

Allegro孔和线被做到器件里面如何解锁操作指导

Allegro孔和线被做到器件里面如何解锁操作指导 在做PCB设计的时候,会遇到孔和线被做到器件的情况,当需要移动器件的时候,孔和线也会跟着移动。如下图 具体操作如下 选择Route选择Convert Fanout

Acwing 796子矩阵的和

Acwing 796子矩阵的和 前缀和 更新 (前缀和数组)&#xff1a;s[i][j]s[i-1][j]s[i][j-1]-s[i-1][j-1]a[i][j] 查询(x1,y1)-------(x2,y2)矩阵的元素和 Ss[x2][y2]-s[x-1][y2]-s[x2][y1-1]s[x1-1][y1-1] 输入一个 n 行 m 列的整数矩阵&#xff0c;再输入 q 个询问&#xff0c;每…

QML教程(二)视觉对象

目录 一、矩形类型&#xff1a;Rectangle 二、图像类型&#xff1a;Image 三、基类类型&#xff1a;Item 一、矩形类型&#xff1a;Rectangle 矩形是最基本的视觉效果&#xff0c;Qt Quick提供了一个矩形类型来绘制矩形。这些矩形可以用颜色或垂直渐变着色。矩形类型还可以在…

【Linux】进程程序替换及shell的模拟实现

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;进程程序替…

Mybatis-Plus 映射匹配兼容性

目录 问题一&#xff1a;表字段与编码属性设计不同步 问题二&#xff1a;编码中添加了数据库中未定义的属性 问题三&#xff1a;采用默认查询开放了更多的字段查看权限 TableField 问题四&#xff1a;表名与编码开发设计不同步 TableName 从表中查询出数据&#xff0c;并…

31.项目部署

目录 1 一些概念 1.1 项目部署 1.2 WSGI 1.3 uWSGI 1.4 Nginx 2 安装环境与迁移项目 2.1 项目内容 2.2 项目配置 2.2.1 DEBUG 2.2.2 STATIC_ROOT 2.2.3 ALLOWED_HOST 3 uWSGI 3.1 安装uWSGI 3.2 配置uWSGI 3.3 启动 uWSGI 3.4 停止 uWSGI 4 …

官方更新:基于VRA Tokenomics 社区常见问题解答

您好 Verasity 社区&#xff0c; 我们最近通过 Medium 发布了最新的代币经济学&#xff0c;您可以在此处阅读。 我们引入了一些新概念来促进我们作为产品的增长&#xff0c;例如我们的企业收购基金&#xff0c;我们还澄清了我们的流通和总供应量。 在我们的代币经济学文章发布…

SpringBoot概念、创建、运行、Spring Boot 配置文件

Spring Boot 就是 Spring 框架的脚⼿架&#xff0c;它就是为了快速开发 Spring 框架⽽诞⽣的。 1.Spring Boot 优点 快速集成框架&#xff0c;Spring Boot 提供了启动添加依赖的功能&#xff0c;⽤于秒级集成各种框架。内置运⾏容器&#xff0c;⽆需配置 Tomcat 等 Web 容器…

c++11 标准模板(STL)(std::deque)(五)

定义于头文件 <deque> std::deque 迭代器 返回指向容器第一个元素的迭代器 std::deque<T,Allocator>::begin, std::deque<T,Allocator>::cbegin iterator begin(); (C11 前) iterator begin() noexcept; (C11 起) const_iterator begin() const; (C11 前)…

Spring简介及IOC使用

Spring介绍 官网&#xff1a;https://spring.io/ Spring是一个对象的容器&#xff0c;负责管理对象的创建、销毁&#xff0c;以及对象的属性注入&#xff0c;对象的之间的依赖关系。 Spring可以整合其它框架&#xff0c;他基于IOC和AOP来构架多层JavaEE系统&#xff0c;以帮助分…

linux常用命令(六)- 文件属性查看

查看文件类型 - file file命令用于辨识文件类型。 语法 file [-bcvz] [文件或目录...]b&#xff1a;列出辨识结果时&#xff0c;不显示文件名称。c&#xff1a;详细显示指令执行过程&#xff0c;便于排错或分析程序执行的情形。v&#xff1a;显示版本信息。z&#xff1a;尝试…

基于麻雀搜索算法(SSA)优化长短期记忆神经网络参数SSA-LSTM冷、热、电负荷预测(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

第三十六讲:无线AP胖AP模式配置与管理

胖AP(Fat AP)配置一个开放式WLAN非常方便&#xff0c;需要完成的操作包括有线和无线两部分的配置。有线部分即ethernet接口的配置&#xff0c;保证AP能够接入Internet,无线部分的配置包括关联WLAN与VLAN&#xff0c;广播SSID,启用VAP&#xff0c;若无其他DHCP服务器的话&#x…

万物皆有裂痕,那是光进来的地方|2022年个人总结

前两天朋友说要做个视频&#xff0c;记录下2022年的不平凡。突然想到今年是否要写年终总结呢&#xff1f;反复挣扎后&#xff0c;感觉还是应该写个总结&#xff0c;一则记录这一年的不平凡&#xff0c;二则检视这一年的生活与工作状态。- 1 - 工作的危与机2022年对所有的人来说…

Cocos Creator 常见错误排查方法

Cocos Creator 新手开发的时候经常会遇到一些错误不知道如何解决&#xff0c;今天把这些错误总结一下&#xff0c;下次遇到的时候&#xff0c;自己知道如何分析。 对啦&#xff01;这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白&#xff0c;也有一些正在从…

【bp靶场portswigger-服务端2】身份认证漏洞-16个实验(全)

目录 一、身份验证定义 1、三个身份验证因素 2、身份验证和授权 3、身份验证漏洞的产生 4、实验的字典 二、基于密码的登录中的漏洞 1、强制策略 2、用户枚举 3、有缺陷的强力保护 实验1&#xff1a;通过不同响应的用户名枚举 实验4&#xff1a;通过细微不同的响应进…