JavaEE-Spring(Spring中的五大类注解,@Bean注解,对象装配(@Autowired,@Resource),Bean对象在Spring中的作用域)

news2024/11/25 18:37:44

文章目录

  • 1. 配置扫描路径
  • 2. Spring五大类注解
  • 3. Spring @Bean注解
    • 对象装配
  • 4. Bean对象在Spring中的作用域
  • 5. Bean生命周期

1. 配置扫描路径

只有设置了扫描路径,其他的路径下注解不会被Spring扫描

这里设置路径为com.beans下

<?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-3.0.xsd">
    <context:component-scan base-package="com.beans"></context:component-scan>

</beans>

2. Spring五大类注解

@Controller控制器
@Sever服务
@Repoistory仓库
@Configuration配置
@Component组件

软件分层一般分为4层
@Configuration配置层-> @Controller控制层(前端参数校验)-> @Sever服务(数据组装,接口调用)-> @Repoistory(数据库操作,数据持久)

Spring五大类对应软件分的四层,项目工具类划分到@Component组件上。让代码的可读性提高,可以直观的判断这个类的业务用途。

五大类的联系:

  1. @Component可以看作其他四种注解的父类,其他四种注解都是依靠@Component实现。

使用注解将对象注册到Spring中,这个对象在获取时的名称与类名有关;

如果类名是大驼峰,获取Spring中的类名采用小驼峰获取
如果类名无规则,获取Spring中的类名和原类名相同
eg:User -> user获取 / USer -> USer获取

3. Spring @Bean注解

@Bean只能添加到方法上

@Bean注解需要配合五大类方法使用才可以将方法返回的对象储存到Spring中。

获取方法返回的对象名称就是方法名

package com.beans;

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

@Component
public class beans {
    @Bean
    public user GetUser() {
        user us = new user();
        us.setId(1);
        us.setName("123");
        return us;
    }
}
import com.beans.user;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        user u = context.getBean("GetUser", user.class);
        System.out.println(u);
    }
}

对象装配

从Spring中获取对象称为对象装配,将对象取出放入某个类中,有时也叫对象注入

Spring对象注入又三种方式:

  1. 属性注入 / 字段注入@Autowired
  2. 构造方法注入
  3. Setter注入

方式一:属性注入 / 字段注入@Autowired

package com.beans;

import org.springframework.stereotype.Controller;

@Controller
public class user {
    private int id;
    private String name;

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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


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

@Controller
public class Test {
    @Autowired
    private user u;//将Spring中的user注入到这个类中

    public void SayHi() {
        u.setName("XXXX");
        System.out.println(u);
    }
}

在这里插入图片描述
方法二:通过构造方法注入对象

package com.beans;

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

@Controller
public class Test2 {
    private user u;

    //通过构造方法注入,从Spring中获取user对象
    @Autowired
    public Test2(user u) {
        this.u = u;
    }
}

如果类中的构造方法只有一个是,@Autowired可以省略,多个构造函数不能省略

方法三:Setter注入

package com.beans;

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

@Controller
public class Test2 {
    private user u;

    @Autowired
    public void setU(user u) {
        this.u = u;
    }
}

三种注入方式的区别:

  1. 属性注入简单,但是只适用于IoC容器,通用性不好.
  2. setter注入:通用性没有构造方法通用性高
  3. 构造方法注入:通用性更好,可以保证对象初始化。

需要注意:JDK也提供了属性注入方式@Resource
在三种注入方式中除了构造方式注入,其他都可以使用@Resource替换@Autowired进行属性注入。

@Resource与@Autowired区别:

  1. 出身不同,@Resource来自JDK,@Autowired来自Spring
  2. 用法不同:@Resource不支持构造方法注入
  3. @Resource支持更多参数设置(name,type),@Autowired只支持required参数设置

重命名Bean:
可以通过设置name属性,给Bean对象进行重命名,多个name使用{}括起来

package com.beans;

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

@Component
public class beans {
    @Bean(name = {"UserInfo","User"})
    public user GetUser() {
        user us = new user();
        us.setId(1);
        us.setName("123");
        return us;
    }
}

@Bean命名规则:

  1. 没有设定name属性,bean默认名称就是方法名
  2. 如果设定了name属性,只能通过重命名的name的值来获取,不能使用方法名获取对象

@Bean将一个对象注入多次,可以通过下列方式解决

  1. 精确的描述bean的名称,指定不同Bean的name属性。
  2. 使用@Resource注解@Resource(name=“xxx”)
  3. 使用@Autowired+@Qualifier(value=“xxx”)指定具体对象,value可以省略
package com.beans;

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

@Component
public class beans {
    @Bean(name = "UserInfo")
    public user GetUser() {
        user us = new user();
        us.setId(1);
        us.setName("123");
        return us;
    }

    @Bean(name = "UserInfo2")
    public user GetUser2() {
        user us = new user();
        us.setId(2);
        us.setName("456");
        return us;
    }
}

方式一:

package com.beans;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class Test {
    @Resource
    private user UserInfo2;
    private user UserInfo;//通过精确的描述bean的名称,指定不同Bean的name属性

    public void SayHi() {
        System.out.println(UserInfo2);
    }
}

方式二:

package com.beans;

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

import javax.annotation.Resource;

@Controller
public class Test {
    @Resource(name = "UserInfo")
    private user u;

    public void SayHi() {
        System.out.println(u);
    }
}

方法三:

package com.beans;

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

import javax.annotation.Resource;

@Controller
public class Test {
    @Autowired
    @Qualifier(value = "UserInfo2")
    private user u;

    public void SayHi() {
        System.out.println(u);
    }
}

4. Bean对象在Spring中的作用域

Bean对象在Spring中储存默认状态下是单例模式,不同人获取同类的对象是同一个

这样就会导致一个人修改了Spring中的对象,其他人获取到的对象就经过了修改。

Bean的作用域是指Bean在Spring中的某种行为模式

  1. singleton单例模型(默认)
  2. prototype原型模型(相当于多列模式,A修改不影响B用户使用这个对象)
  3. request请求作用域(SpringMVC项目,每一次请求共享一个对象)
  4. session会话作用域(SpringMVC项目,一个会话使用一个对象)
  5. application全局作用域(SpringMVC项目,一个项目中使用的对象)
  6. WebSocket作用域(HTTP web Socket作用域)

单例模型和全局作用域的区别:

  1. 单例作用域是Spring Core作用域,全局作用域是Spring WEB作用域
  2. 单例作用域适用于IoC容器,全局作用域适用于Servlet容器。

Bean对象作用域修改
@Scope(“prototype”)
或@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

package com.beans;

import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
public class beans {
    @Bean(name = "UserInfo")
//    @Scope("prototype")
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public user GetUser() {
        user us = new user();
        us.setId(1);
        us.setName("123");
        return us;
    }
}

5. Bean生命周期

Spring中的对象经历五个阶段

  1. 实例化,给Bean分配内存空间

  2. 设置属性,进行对象注入,防止后续操作出现空指针异常

  3. 初始化:

    • 执行各种通知
    • 执行初始化前置方法
    • 执行构造方法,执行@PostConstruct或执行init-method方法
    • 执行初始化的后置方法
  4. 使用Bean

  5. 销毁Bean:

    • 执行@PreDestory方法
    • 重写DisposableBean接口方法
    • destory-method

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

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

相关文章

(七)devops持续集成开发——jenkins流水线发布一个node环境下的前端vue项目

前言 在前面的章节中已经介绍了jenkins集成前端流水化部署环境的内容&#xff0c;本节内容是关于前端项目的流水化部署发布&#xff0c;通过实操发布一个前端项目&#xff0c;从而完成前端项目的流水化发布。前端项目主要是静态资源的发布&#xff0c;这里我们以一个vue项目为…

智慧物流信息化供应链管理体系转型发展现状

现如今&#xff0c;伴随着时代的迅速发展和高新科技水准的持续提升&#xff0c;人们慢慢进入了信息时代。在其中&#xff0c;物流制造行业也从以往20年前的粗放型管理机制慢慢变化为信息化、智慧化的管理机制。 5G、云计算技术、AI、物联网等新技术的出现加快了各个领域经营方法…

k线图中的三条线是什么?

新手投资朋友可能会在行情软件中发现&#xff0c;图表中除了K线以外&#xff0c;其下方还有三条颜色不一样的曲线&#xff0c;到底这三条线有什么功能呢&#xff1f;它们的使用方法又是怎样的呢&#xff1f; 其实&#xff0c;这三条线分别是短、中、长周期移动平均线&#xff0…

界面控件DevExpress WinForm——属于WinForm组件的MVVM框架

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

谷粒学院——Day17【数据同步工具、SpringCloud【GateWay网关】、权限管理功能(接口)】

❤ 作者主页&#xff1a;Java技术一点通的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是Java技术一点通&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得关注、点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习&#xff0c;共同进步&#xff01;&am…

sql调优

一、MySQL架构总览&#xff1a; 三、SQL解析顺序 SELECT DISTINCT< select_list > FROM< left_table > < join_type > JOIN < right_table > ON < join_condition > WHERE< where_condition > GROUP BY< group_by_list > HAVING<…

振弦采集模块的频率值与温度值的修正

振弦采集模块的频率值与温度值的修正 此功能在 SF3.51 版本时增加。 固件版本 V3.51 修改固件版本号为 V3.51_2200827。 增加了频率和温度的多项式修正参数和对应指令。 $STFP、 $GTFP、 $STTP、 $GTTP 增加了 FFT 频幅数据输出功能。设置 ATSD_SEL.[5]为 1。 修正了 VM608 采集…

java实现的非关系型数据库:nosqldb

nosqldb一、nosqldb介绍二、nosqldb功能介绍三、数据存储结构介绍1. 数据文件存储结构(data.nosqldb)2.索引文件存储结构(index.mbdb)三、优化点1. 不支持连表查询2. 不支持分片存储3. 碎片整理一、nosqldb介绍 github地址 https://github.com/MaBo2420935619/nosqldb nosqld…

2022年终总结2023年计划

目录 前言&#xff1a; 2022年总结&#xff1a; 工作上&#xff1a; 生活上&#xff1a; 2023年规划&#xff1a; 工作上&#xff1a; 生活上&#xff1a; 前言&#xff1a; 嗨&#xff0c;不知不觉一年又过去了&#xff0c;2022已经结束了&#xff0c;我们迎来了2023。…

c++ -- STL容器--list容器

7. list容器7.1 简介① 功能&#xff1a;将数据进行链式存储。② 链表(list)是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的。③ 链表的组成&#xff1a;链表由一系列结点组成。④ 结点的组成&#xff1a;一个是存储数据元素…

serverless论文总结

1.Benchmarking, Analysis, and Optimization of Serverless Function Snapshots https://zhuanlan.zhihu.com/p/572288442 这项工作引入了vHive&#xff0c;一个针对无服务器实验的开源框架&#xff0c;它使系统研究人员能够在整个无服务器堆栈中进行创新。vHive集成了来自领…

ITSM | 权威指南发布,高速IT服务管理团队是什么样子的?

当Netflix正在打造流媒体平台时&#xff0c;还有人在营业厅里为一张网卡而烦恼。当Craig Newmark创建免费分类广告网站时&#xff0c;报社的网络管理员最关心的还是重启电子邮件服务器。当数字化转型成为一道必答题&#xff0c;谁能率先给出解题之法&#xff1f; 阅读本篇文章&…

Input子系统

文章目录前言Input子系统简介Input子系统代码实现框架Linux Input子系统支持的数据类型input核心层设备驱动层input_allocate_device 与 函数input_set_capabilityinput_register_device 函数input_unregister_device 与 input_free_device 函数事件处理层input_attach_handler…

A. Divide and Conquer

An array bb is good if the sum of elements of bb is even. You are given an array aa consisting of nn positive integers. In one operation, you can select an index ii and change ai:⌊ai2⌋ai:⌊ai2⌋. †† Find the minimum number of operations (possibly 00)…

ArcGIS 切片问题小结

1. 如果发布的切片缓存服务没有自动启动怎么办&#xff1f; 在进行切片时偶然情况下可能会遇到&#xff0c;你在切片时已经设置了server自动进行切片处理&#xff0c;但是在服务发布后&#xff0c;服务发布成功&#xff0c;但是服务没有成功启动&#xff0c;导致服务器没有自动…

免费数据恢复方法有哪些?分享这几种简单又实用的恢复方法(2023年最新)

很多时候&#xff0c;我们使用电脑总是容易误删一些数据。比如使用电脑&#xff0c;误删了办公资料&#xff1b;使用SD卡&#xff0c;出现照片没有办法打开的情况&#xff1b;使用移动硬盘&#xff0c;出现文档误格式化等问题。 不必要的数据被删除那就没问题&#xff0c;如果…

Java反序列化—Fastjson基础

0x01 前言 最近摆烂了很久&#xff0c;来学习一下fastjson 0x02 Fastjson 简介 Fastjson 是 Alibaba 开发的 Java 语言编写的高性能 JSON 库&#xff0c;用于将数据在 JSON 和 Java Object 之间互相转换。 提供两个主要接口来分别实现序列化和反序列化操作。 JSON.toJSONStr…

socket应用之从电脑发送图片到手机(1)之通信过程建立

本人曾经做了一个基于MPVd的C#开发的播放器&#xff0c;用于自娱自乐&#xff0c;后来又用websocket 写了个简单的远程控制器。由于websocket 要依赖于浏览器&#xff0c;因此有诸多不便&#xff0c;后来又用flutter写了一个&#xff0c;方便多了。 下面介绍具体实现。 1、通信…

RabbitMQ 消息持久化

RabbitMQ 消息持久化 持久化是为提高rabbitmq消息的可靠性&#xff0c;防止在异常情况(重启&#xff0c;关闭&#xff0c;宕机)下数据的丢失。设置完队列和消息的持久化&#xff0c;并不能完全保证消息不会丢失。尽管它告诉 RabbitMQ 将消息保存到磁盘&#xff0c;但当 Rabbit…

mapbox-gl添加threejs飞线

文章目录前言飞线实现1 初始化地图并加载three图层2 绘制飞线几何体将几何体正确定位在mapbox上正确操作BufferGeometry几何体3 tween实现动画全部代码总结待改进之处参考前言 mapbox-gl是一个基于webgl开发的三维地图渲染引擎&#xff0c;但是很多三维特效只用mapbox并不容易…