Spring定义Bean对象笔记(二)

前言:上一篇记录了通过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对象成功输出了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cesium 加载mapbox底图 黑色主题底图 84底图

cesium提供MapboxStyleImageryProvider&#xff0c;加载mapbox的影像图层&#xff0c;底图是84坐标系。 viewer.imageryLayers.addImageryProvider(new Cesium.MapboxStyleImageryProvider({styleId: dark-v11,accessToken: mapbox的token})); 效果图&#xff1a;加载mapbox黑…

简单使用bootstrap-datepicker日期插件

目录 下载datepicker 方式一&#xff1a; 方式二&#xff1a; 下载依赖 下载bootstarp.js 下载jquery 使用示例 日期选择 单独选择年 单独选择月 单独选择日 设置截止日期 设置默认日期 总结 下载datepicker 方式一&#xff1a; 下载地址 GitHub - uxsolution…

java运行时内存

从jdk1.7以及以后&#xff0c;静态变量和常量池存在堆空间。

关于搭建电商独立站跨境电商接入主流电商平台API商品接口对于商品功能模块的巨大应用

功能设计 首先我们来看下mall项目中商品功能的设计&#xff0c;主要包括商品管理、添加\编辑商品、商品分类、商品类型、品牌管理等功能&#xff0c;这里的功能同时涉及前台商城和后台管理系统。 商品管理【接入主流电商平台商品API接口丰富自建商城商品】 在mall项目的后台管…

JavaScript基础(5)之对象的方法和调用

JavaScript基础5之对象的方法和调用 对象对象使用语法属性和访问方法和调用null遍历对象 内置对象Math属性方法 基本数据类型和引用数据类型堆栈空间分配区别&#xff1a;简单类型的内存分配复杂类型的内存分配 对象 对象是 JavaScript 数据类型的一种&#xff0c;之前已经学习…

填谷式无源PFC电路

目录&#xff1a; 1、概述 2、原理 1、概述 如果不采用PFC&#xff0c;那么典型开关模式电源的功率因数约为0.6&#xff0c;因而会有相当大的奇次谐波失真(第三谐波有时和基本谐波一样大)。令功率因数小于1以及来自峰值负载的谐波减少了运行设备可用的实际功率。为运行这些低…

书生·浦语2.0体系技术报告

前言 本文是书生浦语二期实战营课程视频笔记&#xff0c;如果需要详细视频教程可自行搜索。 InternLM2 InternLM2-Base 高质量和具有很强可塑性的模型基座&#xff0c;是模型进行深度领域适配的高质量起点InternLM2 在Base基础上&#xff0c;在多个能力方向进行了强化&#x…

WSL安装与使用

开启之后&#xff0c;会提示你重启电脑才能使配置生效&#xff0c;我们重启即可。 电脑重启后&#xff0c;打开Microsoft Store搜索WSL&#xff0c;既可以看到支持的操作系统&#xff0c;我们选择Ubuntu即可&#xff0c;我们选择第一个就可以。 随后我们打开&#xff0c;发现报…

提升办公效率,一起了解流程自定义表单优势

提高办公效率&#xff0c;可以一起了解低代码技术平台。对于很多中小型企业而言&#xff0c;低代码技术平台及流程自定义表单优势突出&#xff0c;是助力企业实现流程化办公&#xff0c;实现数字化转型的得力助手。流辰信息是专业研发开发平台、数据治理、数据分析等产品的服务…

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(13)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之云原生架构设计理论与实践&#xff08;12&#xff09; 所属章节&#xff1a; 第14章. 云原生架构设计理论与实践 第3节 云原生架构相关技术 14.3.2 云原生微服务 1. 微服务发展背景 过去开发一个后端应用最为直接的方…

软件架构风格_4.虚拟机体系结构风格

虚拟机体系结构风格的基本思想是人为构建一个运行环境&#xff0c;在这个环境之上&#xff0c;可以解析与运行自定义的一些语言&#xff0c;这样来增加架构的灵活性。虚拟机体系结构风格主要包括解释器风格和规则系统风格。 1.解释器体系结构风格 一个解释器通常包括完成解释工…

Win11 绕过 TPM 或 CPU 检测

方法 1&#xff1a;修改注册表绕过 TPM 或 CPU 检测&#xff08;升级安装&#xff09; 如果你的硬件不完全符合安装 Windows 11 的基本硬件要求&#xff0c;可以通过修改注册表&#xff0c;在至少拥有 TPM 1.2 和不支持的 CPU 上升级安装 Windows 11 系统. 适用场景&#xff…

Nginx是什么?

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

知识产权与标准化

根据希赛相关视频课程汇总整理而成&#xff0c;是个人软考的复习笔记&#xff0c;仅供参考 知识产权概述 知识产权类型&#xff1a; ①著作权&#xff08;版权、文学产权&#xff09; ② 工业产权&#xff08;产业产权&#xff09; 知识产权的特点&#xff1a; 无形性、独占性…

C++的并发世界(五)——线程状态切换

0.线程状态 初始化&#xff1a;该线程正在被创建&#xff1b; 就绪&#xff1a;该线程在列表中就绪&#xff0c;等待CPU调度&#xff1b; 运行&#xff1a;该线程正在运行&#xff1b; 阻塞&#xff1a;该线程被阻塞挂机&#xff0c;Blocked状态包括&#xff1a;pend&#xff…

win11安装wsl报错:无法解析服务器的名称或地址

一 说明 项目开发中&#xff0c;需要用到wsl&#xff0c;因此根据wsl官方&#xff08;WSL安装教程&#xff09;命令 wsl --install 进行wsl的安装。而本文主要是记录自己在安装wsl中遇到的问题 “无法解析服务器的名称或地址” 的解决办法。 二 方法一&#xff1a;更改DNS&…

回溯算法|47.全排列II

力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking (vector<int>& nums, vector<bool>& used) {// 此时说明找到了一组if (path.size() nums.size()) {result.push_back(path);r…

Java基于微信小程序的电子竞技信息交流系统,附源码(V2.0)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

C++的并发世界(六)——互斥解决数据共享冲突

0.数据共享的问题 在多个线程中共享数据时。需要注意线程安全问题。如果多个线程同时访问同一个变量。并且其中至少有一个线程对该变量进行了写操作。那么就会出现数据竞争问题。数据竞争可能会导致程序崩溃,产生来定义的结果,或者得到错误的热果。为了避免数据竞争问题。需要…

IDEA连接SqlServer数据库

目录 下载jar包 下载sqljdbc_12.6压缩包 解压 导入IDEA 新建文件夹 复制粘贴进JDBC文件夹并设为library 编写类及方法 代码 下载jar包 以sqljdbc_12.6为例 下载sqljdbc_12.6压缩包 最新地址&#xff1a;sqljdbc 官方最新地址 解压 解压即用 导入IDEA 新建文件夹 复制…