Bean与@Bean注解

news2024/11/18 20:46:55

文章目录

  • 一、背景与IoC
  • 二、注解@Bean
    • 1、@Bean注解用法
    • 2、@Bean注解源码
    • 3、@Bean注解演示

一、背景与IoC

之前的代码书写现状—耦合度偏高。如下图,业务层需要数据层实现类对象BookDaoImpl,于是自己new了一个,此时,当数据层类名改为BookDaoImpl2,业务层代码也得跟着修改。

在这里插入图片描述

基于上面的问题,我们考虑使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象

在这里插入图片描述

这就是Ioc,Inversion of Control,即控制反转,这种思想的核心在于把对象的创建控制权由程序转移到外部 ,以达到解耦的目的。

  • Spring技术对Ioc思想进行了实现落地==>提供一个Ioc容器,来充当Ioc思想中的"外部"
  • Ioc容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在Ioc容器中统称Bean
  • 在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入(DI,Dependency Injection)

在这里插入图片描述

小结:

在这里插入图片描述

核心:

Ioc容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在Ioc容器中统称`Bean

二、注解@Bean

1、@Bean注解用法

Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。

@Bean放在方法上,告诉被注解的方法,你去产生一个Bean,然后交给Spring容器管理。

//简单例子
class Test{

	@Bean
	public AccountObj accountObj(){
		return new AccountObj();
	}
}

以数据源Bean的创建为例:

在这里插入图片描述

2、@Bean注解源码

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {

  @AliasFor("name")
  String[] value() default {};

  @AliasFor("value")
  String[] name() default {};

  Autowire autowire() default Autowire.NO;

  String initMethod() default "";

  String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;

}
# AliasFor可以定义一个注解中的两个属性互为别名
# 复习:
# Retention这个元注解用来标注“被标注的注解”最终保存在哪里

@Retention(RetentionPolicy.SOURCE) 表示该注解只能保留在Java源文件中

@Retention(RetentionPolicy.CLASS) 表示该注解只能保留在class文件中

@Retention(RetentionPolicy.RUNTIME) 表示该注解只能保留在class文件中,且可以被反射机制所读取

  • @Bean注解可以用在方法上,也可用在注解类型上
  • @Retention(RetentionPolicy.RUNTIME) 即该注解可以被反射机制所读取
  • value:name属性的别名,String数组类型,即可多个。不使用注解的其他属性时,value就是默认属性
  • name:bean的名称,同样是String数组,如果不写则默认Bean的名称为所注解的方法的名称
  • value和name如果都要使用,则值要一致
  • autowire:自动装配,取值是Autowire类型的枚举,默认不开启
/ 枚举确定自动装配状态:即,bean是否应该使用setter注入由Spring容器自动注入其依赖项。
// 这是Spring DI的核心概念
public enum Autowire {

  // 常量,表示根本没有自动装配。
  NO(AutowireCapableBeanFactory.AUTOWIRE_NO),
  // 常量,通过名称进行自动装配
  BY_NAME(AutowireCapableBeanFactory.AUTOWIRE_BY_NAME),
  // 常量,通过类型进行自动装配
  BY_TYPE(AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE);

  private final int value;
  Autowire(int value) {
    this.value = value;
  }
  public int value() {
    return this.value;
  }
  public boolean isAutowire() {
    return (this == BY_NAME || this == BY_TYPE);
  }
}
  • initMethod:即初始化方法,在bean实例化时调用
# 下面这种方式也能实现初始化,但Spring不推荐
//InitializationBean接口允许bean在合适的时机通过设置注解的初始化属性从而调用初始化方法
//InitializationBean 接口有一个定义好的初始化方法
void afterPropertiesSet() throws Exception;
# 不推荐使用InitializationBean接口
public class InitBean implements InitializingBean {

    public void afterPropertiesSet() {}
}
# Spring推荐使用@PostConstruct注解或者指定初始化方法来完成初始化
  • destroyMethod: 调用bean示例在关闭上下文的时候执行,例如JDBC的close()方法,或者SqlSession的close()方法
//DisposableBean 接口的实现允许在bean销毁的时候进行回调调用,DisposableBean 接口之后一个单个的方法

# Spring不推荐
void destroy() throws Exception;
# Spring 推荐使用@PreDestory注解或者为@Bean注解提供 destroyMethod 属性。

3、@Bean注解演示

定义类:

public class MyBean {

    public MyBean(){
        System.out.println("MyBean Initializing");
    }

    public void init(){
        System.out.println("Bean 初始化方法被调用");
    }

    public void destroy(){
        System.out.println("Bean 销毁方法被调用");
    }
}

定义配置类:

@Configuration
public class AppConfig {

    @Bean(initMethod = "init", destroyMethod = "destroy")
    public MyBean myBean(){
        return new MyBean();
    }

}

写测试类,查看初始化和销毁方法的调用时机:

public class SpringBeanApplicationTests {

    public static void main(String[] args) {

      
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        context.getBean("myBean");
        ((AnnotationConfigApplicationContext) context).destroy();
       //((AnnotationConfigApplicationContext) context).close();
    }
}

效果:

在这里插入图片描述

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

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

相关文章

隐藏菜单之菜单和搜索

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>菜单</title><style>/* css代码开始*/* {margin: 0;padding: 0;box-sizing: border-box;}b…

人工智能(pytorch)搭建模型15-手把手搭建MnasNet模型,并实现模型的训练与预测

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型15-手把手搭建MnasNet模型&#xff0c;并实现模型的训练与预测&#xff0c;本文将介绍MnasNet模型的原理&#xff0c;并使用PyTorch框架构建一个MnasNet模型用于图像分类任务&#xff0c;…

1、电商数仓(用户行为采集平台)数据仓库概念、用户行为日志、业务数据、模拟数据、用户行为数据采集模块、日志采集Flume

1、数据仓库概念 数据仓库&#xff08; Data Warehouse &#xff09;&#xff0c;是为企业制定决策&#xff0c;提供数据支持的。可以帮助企业&#xff0c;改进业务流程、提高产品质量等。 数据仓库的输入数据通常包括&#xff1a;业务数据、用户行为数据和爬虫数据等。 业务数…

Linux——使用第三方库链接的方式——动态式

回顾上文&#xff1a; (122条消息) Linux使用第三方库链接的使用方式——静态式_橙予清的zzz~的博客-CSDN博客https://blog.csdn.net/weixin_69283129/article/details/131414804?spm1001.2014.3001.5502 上篇文章中&#xff0c;我讲到了关于链接第三方库作为静态库的使…

股票技术分析方法综述

文章目录 K线均线MACDKDJ和RSIBOLL线趋势理论、支撑位和压力位形态理论量价关系理论道氏理论波浪理论江恩理论缠论自定义指标 K线 K线的组合形态是K线技术分析中的重要部分&#xff0c;包括早晨之星、黄昏之星、红三兵、黑三兵等。 早晨之星&#xff1a;由三根K线组成&#x…

OpenGL 抗锯齿

1.简介 你可以看到&#xff0c;我们只是绘制了一个简单的立方体&#xff0c;你就能注意到它存在锯齿边缘。 可能不是非常明显&#xff0c;但如果你离近仔细观察立方体的边缘&#xff0c;你就应该能够看到锯齿状的图案。如果放大的话&#xff0c;你会看到下面的图案&#xff1a…

家校互动、班级管理系统

最近做了一款使用若依开源框架搭建的一款家校互动、班级管理的平台&#xff0c;采用uniapp作为APP端&#xff0c;原生小程序作为小程序的家长端。

软件测试的概念与过程(软件测试的历史、概念、结构、过程)

软件测试的概念与过程----软件测试的历史 软件测试的历史软件的概念软件的结构软件测试的过程 软件测试的历史 1、早期的的软件开发过程中&#xff0c;将测试“调试”&#xff0c;目的是纠正软件已经知道的故障&#xff0c;常常有开发人员自己去完成这部分工作。 2、1957年&…

使用数据集工具

一.数据集工具介绍 HuggingFace通过API提供了统一的数据集处理工具&#xff0c;它提供的数据集如下所示&#xff1a; 该界面左侧可以根据不同的任务类型、类库、语言、License等来筛选数据集&#xff0c;右侧为具体的数据集列表&#xff0c;其中有经典的glue、super_glue数据集…

Unity | HDRP高清渲染管线学习笔记:材质系统Lit着色器

目录 一、Lit着色器 1. Surface Options 2. Surface Inputs&#xff08;表面输入&#xff09; 3. Transparency Inputs 二、HDRP渲染优先级 我们可以把现实世界中的物体分成不透明物体和透明物体&#xff08;其中包括透明或者半透明&#xff09;。在实时渲染时&#xff0c…

Debian二次开发网关支持Docker+RS485+网口

随着物联网技术的不断发展&#xff0c;瑞芯微边缘计算网关作为一种集成多种接口和功能的智能网关&#xff0c;逐渐成为了物联网领域中的热门产品。本文将详细介绍瑞芯微边缘计算网关的特点和优势&#xff0c;并探讨其在实际应用中的广泛应用。 瑞芯微Linux系统边缘计算网关是一…

【Java】 Java 私有接口方法的使用

本文仅供学习参考&#xff01; 相关教程地址&#xff1a; https://www.baeldung.com/java-interface-private-methods https://www.geeksforgeeks.org/private-methods-java-9-interfaces/ https://www.runoob.com/java/java9-private-interface-methods.html 接口是定义一组方…

java之路—— SpringMVC的常用注解解析以及作用、应用

创作不易&#xff0c;真的希望能给个免费的小 文章目录 1、Controller2、RequestMapping3.GetMapping、PostMapping、PutMapping、DeleteMapping4. RequestParam5.PathVariable6.RequestHeader7.CookieValue8.RequestBody9.ResponseBody10.SessionAttribute11.ControllerAdvice…

二层、三层交换机是什么?有什么区别?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将讲解二层交换机和三层交换机是什么&#xff0c;以及他们的区别。 目录 一、二层交换机是什么&#xff1f; 二、二层交换机的主…

本地生活多城市合伙人系统开发

本地生活多城市合伙人项目是一种基于本地生活服务的创业项目&#xff0c;旨在为各个城市的居民提供方便、实惠、高品质的生活服务。该项目通过招募多个城市的合伙人&#xff0c;建立完整的本地生活服务平台和供应链体系&#xff0c;覆盖不同类型的本地生活服务&#xff0c;如餐…

Nginx的Rewrite(地址重定向)

目录 前言 一、Rewrite 跳转场景 二、Rewrite 跳转实现 三、Rewrite实际场景 3.1Nginx跳转需求的实现方式 3.2rewrite放在 server{}&#xff0c;if{}&#xff0c;location{}段中 3.3对域名或参数字符串 四、Rewrite正则表达式 五、Rewrite语法格式 5.1rewrite语法格式…

互联网常见架构接口压测性能分析及调优手段建议

目录 互联网常见架构接口压测性能分析及调优手段建议 1 接口名称: 获取列表 1.1 压测现象:单台tps700多&#xff0c;应用cpu高负载 1.1.1 问题分析: 1.1.2 改进措施: 1.1.3 改进效果: 1.2 压测现象&#xff1a;数据库资源利用率高 1.2.1 问题分析: 1.2.2 改进措施: 1.2.3 改…

SciencePub学术 | 计算机科学类重点SCIEEI征稿中

SciencePub学术 刊源推荐:计算机科学类重点SCIE&EI征稿中&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 计算机科学类重点SCIE&EI 【期刊简介】IF&#xff1a;3.0-3.5&#xff0c;JCR 2区&#xff0c;中科院4区&#xff1b; 【检…

使用R绘制气泡图、带有显著性标记的热力图、渐变曲线图

大家好&#xff0c;我是带我去滑雪&#xff01; 一幅精美的科研绘图会有诸多益处&#xff0c;精美的图像可以更好地传达研究结果和数据分析的重要信息。通过使用清晰、直观和易于理解的图像&#xff0c;可以更好地向读者展示研究的发现&#xff0c;有助于读者理解和解释数据。还…

JAVA开发(记一次504 gateway timeout错误排查过程)

一、问题与背景&#xff1a; 最近在发布一个web项目&#xff0c;在测试环境都是可以的&#xff0c;发布到生产环境通过IP访问也是可以的&#xff0c;但是通过域名访问就出现504 gateway timeout。通过postman去测试接口也是一样。ip和端口都可以通&#xff0c;域名却不行&…