Spring定义Bean对象笔记(二)

news2024/11/19 4:17:00

前言:上一篇记录了通过XML文件来定义Bean对象,这一篇将记录通过注解和配置类的方式来定义Bean对象。

核心注解

定义对象:@Component,@Service,@Repository,@Controller
依赖注入:

按类型:@Autowired
按名称:@Resource或者使用@Autowired+@Qualifier

@Resource需要导入下面的依赖,因为从JDK9-17移除了javax的包
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
作用域:@Scope
生命周期:@PostConstruct,@PreDestroy

一、注解方式定义Bean对象

定义Bean对象的注解有4个,分别是@Component,@Service,@Repository,@Controller,这四个注解的功能都是一样的,唯一的区别就是名字不从。

这几个注解一般按照这种方式使用
@Component: 用于实体类的Bean对象定义
@Service: 用于接口实现类的Bean对象定义
@Repository: 用于读取数据库的DAO Bean对象定义
@Controller: 用于控制层的Bean对象定义

此外,对于不同的分层使用不同的注解,一方面可以使得层级更加分明,另一方面后续Spring可以依据注解的名称进行灵活操作。

定义Bean&注入



import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

@Component
@PropertySource("test.properties")
public class Employee {
    @Value("karry")
    private String name;
    @Value("0")
    private Integer gender;//0=女 1=男
    @Value("10000.0")
    private Double salary;

    @Autowired
    private Car car;//开的什么车

    @Resource
    private Car car2;

    @Resource(name = "car")
    private Car car3;

    @Qualifier("car")
    @Autowired
    private Car car4;

    @Autowired
    private List<Car> carList;

    @Autowired
    private Set<Car> carSet;

    @Value("#{${my.map}}")
    private HashMap<String, String> strMap;

    @Value("#{'${my.set}'.split(',')}")
    private Set<String> strSet;

    @Value("#{'${my.set}'}")
    private Set<String> strSet2;

    @Value("#{'${my.str}'.split(',')}")
    private List<String> strList;

    @Value("${my.str}")
    private List<String> strList2;

    @Value("${my.str}")
    private String[] strArr;


    public void showInfo(){
        System.out.println("name:" + name + " gender:" + gender + " salary:" + salary);
        System.out.println(" car:" + car);
        System.out.println(" car2:" + car2);
        System.out.println(" car3:" + car3);
        System.out.println(" car4:" + car4);
        System.out.println("carList:" + carList + " size:" + carList.size());
        System.out.println("carSet:" + carSet + " size:" + carSet.size());
        System.out.println("strMap:" + strMap + " size:" + strMap.size());
        System.out.println("strSet:" + strSet + " size:" + strSet.size());
        System.out.println("strSet2:" + strSet2 + " size:" + strSet2.size());
        System.out.println("strList:" + strList + " size:" + strList.size());
        System.out.println("strList2:" + strList2 + " size:" + strList2.size());
        System.out.println("strArr:" + Arrays.toString(strArr) + " size:" + strArr.length);
    }

}



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

@Component
public class Car {
    @Value("red")
    private String color;
    @Value("保时捷")
    private String name;
    @Value("600")
    private Integer speed;


    public Car() {
    }


    public void setColor(String color) {
        this.color = color;
    }


    public void setName(String name) {

        this.name = name;
    }


    public void setSpeed(Integer speed) {

        this.speed = speed;
    }

    @Override
    public String toString() {
        return "Car{" +
                "color='" + color + '\'' +
                ", name='" + name + '\'' +
                ", speed=" + speed +
                '}';
    }

    public void showInfo(){
        System.out.println("color:" + color + " name:" + name + " speed:" + speed);
    }
}

测试类

package com.xlb;

import com.xlb.bean.Employee;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class TestBean {
    public static void main(String[] args) {
        test1();
    }
    public static void test1(){
        ApplicationContext ctx =
                new ClassPathXmlApplicationContext("applicationContext.xml");

        Employee emp = ctx.getBean("employee", Employee.class);
        emp.showInfo();
    }
}

配置文件

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

    <context:component-scan base-package="com.xxx.bean"/>
</beans>

test.propertiest文件

my.set=foo,bar
my.list=foo,bar
my.map={"foo": "bar","foo2": "bar2"}
my.str=foo,bar

输出结果
在这里插入图片描述

从输出结果我们可以看出以下几点:

1.通过@Component成功定义了Bean对象(也可以使用@Service,@Repository,@Controller等注解来定义Bean对象,具体使用哪个可以根据当前的业务层级来确定。)
2.对于普通类型(包装类型或String)的属性,我们通过@Value注解进行依赖注入。
3.对于引用类型的属性,如Car,我们通过@AutoWired注解进行注入。
4.对于数组类型的属性(数组里的元素为String或者其他包装类型),通过@Value注解,并且各元素间使用逗号分隔,即可以成功将数据注入到数组中。

4.1 对于集合类型的属性(集合里的元素为String或者其他包装类型),通过@Value注解,并且各元素间使用逗号分隔,此外需要利用SPEL表达式(即在后面加split(‘,’))来切分元素【注:其中切分的符号不一定是逗号,和注入元素间的符号统一即可】

5.使用注解注入Bean对象时,我们需要在配置文件中添加注解的扫描路径。即 <context:component-scan base-package=“com.xxx.bean”/>这句>话来标识我们包扫描的路径
6.在注入引用类型的对象时,我们可以使用@Autowired,@Autowired+@Qualifier(“car”),@Resource,@Resource(name = “car”),其中:

6.1 @Autowired:为按类型注入
6.2 @Autowired+@Qualifier(“car”):为按名称注入,名称即为@Qualifier(“car”)中指定的名称,这里名称为car
6.3 @Resource:为按名称注入,名称为注解内name的值,如果不写,默认是该注解所注解的变量的名称
6.4 @Resource(name = “car”):为按名称注入,名称即为name指定的名称
6.5 @Autowired+@Qualifier(“car”) == @Resource(name = “car”)

7.注入map类型的属性时,不需要使用split进行切分。

二、配置类方式定义Bean对象

2.1 环境准备

bean对象

package com.xlb.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

@Component("employee2")
@PropertySource("test.properties")
public class Employee2 {
    @Value("karry")
    private String name;
    @Value("0")
    private Integer gender;//0=女 1=男
    @Value("10000.0")
    private Double salary;


    @Resource
    private Car2 car2;

    @Resource(name = "car2")
    private Car2 car3;

    @Qualifier("car2")
    @Autowired
    private Car2 car4;

    @Autowired
    private List<Car2> carList;

    @Autowired
    private Set<Car2> carSet;

    @Value("#{${my.map}}")
    private HashMap<String, String> strMap;

    @Value("#{'${my.set}'.split(',')}")
    private Set<String> strSet;

    @Value("#{'${my.set}'}")
    private Set<String> strSet2;

    @Value("#{'${my.str}'.split(',')}")
    private List<String> strList;

    @Value("${my.str}")
    private List<String> strList2;

    @Value("${my.str}")
    private String[] strArr;


    public void showInfo(){
        System.out.println("name:" + name + " gender:" + gender + " salary:" + salary);
        System.out.println(" car2:" + car2);
        System.out.println(" car3:" + car3);
        System.out.println(" car4:" + car4);
        System.out.println("carList:" + carList + " size:" + carList.size());
        System.out.println("carSet:" + carSet + " size:" + carSet.size());
        System.out.println("strMap:" + strMap + " size:" + strMap.size());
        System.out.println("strSet:" + strSet + " size:" + strSet.size());
        System.out.println("strSet2:" + strSet2 + " size:" + strSet2.size());
        System.out.println("strList:" + strList + " size:" + strList.size());
        System.out.println("strList2:" + strList2 + " size:" + strList2.size());
        System.out.println("strArr:" + Arrays.toString(strArr) + " size:" + strArr.length);
    }

}

package com.xlb.bean;

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

@Component("car2")
public class Car2 {
    @Value("red")
    private String color;
    @Value("保时捷")
    private String name;
    @Value("600")
    private Integer speed;


    public Car2() {
    }


    public void setColor(String color) {
        this.color = color;
    }


    public void setName(String name) {

        this.name = name;
    }


    public void setSpeed(Integer speed) {

        this.speed = speed;
    }

    @Override
    public String toString() {
        return "Car{" +
                "color='" + color + '\'' +
                ", name='" + name + '\'' +
                ", speed=" + speed +
                '}';
    }

    public void showInfo(){
        System.out.println("color:" + color + " name:" + name + " speed:" + speed);
    }
}

配置类

package com.xlb.config;


import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.xlb.bean")
public class SpringConfig {

}

test.properties文件

my.set=foo,bar
my.list=foo,bar
my.map={"foo": "bar","foo2": "bar2"}
my.str=foo,bar

测试类

package com.xlb;

import com.xlb.bean.Employee;
import com.xlb.bean.Employee2;
import com.xlb.config.SpringConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.support.ClassPathXmlApplicationContext;



public class TestBean2 {
    public static void main(String[] args) {
        test1();
    }
    public static void test1(){
        ApplicationContext ctx =
                new AnnotationConfigApplicationContext(SpringConfig.class);

        Employee2 emp = ctx.getBean("employee2", Employee2.class);
        emp.showInfo();
    }
}

测试结果
在这里插入图片描述
从输出结果可以看到可以正常输出,这个和上面介绍的通过注解实现的方式基本一样,唯一的区别就是在测试类启动时,我们是通过配置类启动的。

2.2 配置类中通过@Bean注解定义Bean对象

首先注释掉通过@Component注解创建的对象
在这里插入图片描述
然后在SpringConfig配置类中添加返回Bean对象 的代码

package com.xlb.config;


import com.xlb.bean.Car2;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan({"com.xlb.bean", "com.xlb.config"})
public class SpringConfig {
    @Bean("car2")
    public Car2 buildCar(){
        Car2 car = new Car2();
        car.setColor("blue");
        car.setName("梅赛德斯-迈巴赫");
        car.setSpeed(600);
        return car;
    }
}

测试结果
在这里插入图片描述
可以看到,在SpringConfig配置类里定义的Bean对象成功输出了。

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

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

相关文章

Windows下Docker搭建Flink集群

编写docker-compose.yml 参照&#xff1a;https://github.com/docker-flink/examples/blob/master/docker-compose.yml version: "2.1" services:jobmanager:image: flink:1.14.4-scala_2.11expose:- "6123"ports:- "18081:8081"command: jobma…

03 Python进阶:MySQL - mysql-connector

mysql-connector安装 要在 Python 中使用 MySQL 数据库&#xff0c;你需要安装 MySQL 官方提供的 MySQL Connector/Python。下面是安装 MySQL Connector/Python 的步骤&#xff1a; 首先&#xff0c;确保你已经安装了 Python&#xff0c;如果没有安装&#xff0c;可以在 Python…

OpenHarmony实战:轻量级系统之配置其他子系统

除上述子系统之外&#xff0c;还有一些必要但是无需进行移植的子系统。如&#xff1a;分布式任务调度子系统、DFX子系统。 这些子系统添加方式比较简单&#xff0c;在“vendor/MyVendorCompany/MyProduct/config.json”文件中进行如下配置即可&#xff1a; {"subsystem&…

Nginx是什么?

一、什么是Nginx? Nginx是一个高性能的HTTP和反向代理Web服务器 二、Nginx有什么优点 Nginx稳定性好、资源消耗低、配置简单、功能丰富 1、作为Web服务器&#xff0c;Nginx处理静态文件、索引文件&#xff0c;自动索引的效率非常高 2、作为代理服务器&#xff0c;Nginx可以…

大创项目推荐 深度学习 python opencv 火焰检测识别 火灾检测

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

Linux:ip和ip协议的初步认识

文章目录 ip协议基本认识ip协议的报头网段划分ip的类型划分 ip协议基本认识 前面对于TCP的内容已经基本结束了&#xff0c;那么这也就意味着在传输层也已经结束了&#xff0c;那么下一步要进入的是的是网络层&#xff0c;网络层中也有很多种协议&#xff0c;这里主要进行解析的…

uniapp微信小程序真机图片不显示

不同设备可能出现部分设备显示不了图片&#xff0c;解决办法&#xff1a;图片地址直接使用&#xff0c;不要拼接&#xff1a; https://images.weserv.nl/?urlhttp

Leetcode442. 数组中重复的数据

Every day a Leetcode 题目来源&#xff1a;442. 数组中重复的数据 解法1&#xff1a;将元素交换到对应的位置 由于给定的 n 个数都在 [1,n] 的范围内&#xff0c;如果有数字出现了两次&#xff0c;就意味着 [1,n] 中有数字没有出现过。 因此&#xff0c;我们可以尝试将每一…

【fastadmin】脚本模式下,日志钩子函数执行出现死循环,导致内存溢出奔溃

问题出现原因是想对项目中error级别的日志&#xff0c;接入钉钉告警&#xff0c;方便查看 于是使用钩子方法&#xff0c;日志写入完成后&#xff0c;自动调用自定义的告警方法中 1、在application/tags.php 中添加log_write_done > [app\\common\\behavior\\Common, ],2、在…

JavaAgent 技术原理及实战

JavaAgent 技术原理及实战 1、引子2、JavaAgent 简单示例&#xff1a;方法开始和结束时打印日志2.1 创建 Agent2.2 编写验证 agent 功能的测试类2.2.1 使用JavaAgent 静态加载方式2.2.2 使用 JavaAgent 动态加载方式 2.3、小结 3、JavaAgent3.1 JavaAgent是什么&#xff1f;3.2…

搞学术研究好用免费的学术版ChatGPT网站-学术AI

https://chat.uaskgpt.com/mobile/?user_sn88&channelcsdn&sceneloginhttps://chat.uaskgpt.com/mobile/?user_sn88&channelcsdn&scenelogin 推荐一个非常适合中国本科硕士博士等学生老师使用的学术版ChatGPT&#xff0c; 对接了超大型学术模型&#xff0c…

考研数学|《1800题》基础练习基本不会,怎么办?

这其实是因为&#xff0c;知识点之间没有形成联结 这样只要题目难度提升&#xff0c;一个题目的知识点综合度变高&#xff0c;就不知道该怎么做了。 不要害怕&#xff0c;其实考研复习早起阶段&#xff0c;大家基本上都经过这个阶段&#xff0c;不过有的同学能够快速找到做题…

Vue ElementPlus Input 输入框

Input 输入框 通过鼠标或键盘输入字符 input 为受控组件&#xff0c;它总会显示 Vue 绑定值。 通常情况下&#xff0c;应当处理 input 事件&#xff0c;并更新组件的绑定值&#xff08;或使用v-model&#xff09;。否则&#xff0c;输入框内显示的值将不会改变&#xff0c;不支…

[C#]winform使用OpenCvSharp实现透视变换功能支持自定义选位置和删除位置

【透视变换基本原理】 OpenCvSharp 是一个.NET环境下对OpenCV原生库的封装&#xff0c;它提供了大量的计算机视觉和图像处理的功能。要使用OpenCvSharp实现透视变换&#xff08;Perspective Transformation&#xff09;&#xff0c;你首先需要理解透视变换的原理和它在图像处理…

WPF中动画教程(DoubleAnimation的基本使用)

实现效果 今天以一个交互式小球的例子跟大家分享一下wpf动画中DoubleAnimation的基本使用。该小球会移动到我们鼠标左键或右键点击的地方。 该示例的实现效果如下所示&#xff1a; 页面设计 xaml如下所示&#xff1a; <Window x:Class"AnimationDemo.MainWindow&qu…

mysql 正则表达式查询

学习了mysql 连接查询和子查询和myql join连接&#xff0c;接下来学习下正则表达式查询。正则表达式的规则都是相似的。 8&#xff0c;使用正则表达式查询 正则表达式通常被用来检索或替换那些符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的特殊字符串。例如从…

Android 高德地图

1.获取Key 进入高德开放平台控制台&#xff0c;创建一个新应用。在创建的应用上点击"添加key"按钮&#xff0c;在弹出的对话框中&#xff0c;依次输入key名称&#xff0c;选择服务平台为“Android平台”&#xff0c;输入发布版安全码 SHA1、以及 Package。 获取 S…

flutter获取手机中的系统路径信息

https://www.bilibili.com/video/BV1wE421g7sw获取系统中的路径 获取系统中的路径&#xff0c;并在这个路径中创建一个文本文件【str.txt】 然后进行写入【str.txt】 再读取这个文件【str.txt】 手机没有开通root权限无法看到写入到【应用程序文档目录】路径中的文件 用来…

案例分析-程序的机器级表示

案例一&#xff1a;关于编译优化 请自写一段if- else简单分支程序&#xff0c;分别尝试对它进行不带优化、-O1优化和-O2优化&#xff0c;比较它们的机器级表达&#xff0c;并讨论优劣。 图一为不带优化、图二为O1优化、图三为O2优化、图四为原始C代码。 &#xff08;1&#xff…

x-cmd-pkg | broot 是基于 Rust 开发的一个终端文件管理器

简介 broot 是基于 Rust 开发的一个终端文件管理器&#xff0c;它设计用于帮助用户在终端中更轻松地管理文件和目录&#xff0c;使用树状视图探索文件层次结构、操作文件、启动操作以及定义您自己的快捷方式。 同时它还集成了 ls, tree, find, grep, du, fzf 等工具的常用功能…