【Spring框架全系列】方法注解@Bean的使用

这篇具有很好参考价值的文章主要介绍了【Spring框架全系列】方法注解@Bean的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

📬📬哈喽,大家好,我是小浪。上篇博客我们介绍了五大类注解的使用方法,以及如何解决Spring使用五大类注解生成bean-Name的问题;那么,谈到如何更简单的读取和存储对象,这里我们还需要介绍另外一个"方法注解@Bean"的使用,快来一起学习叭!🛳🛳

📲目录

一、如何使用方法注解

二、同一类型的对象注入多次的问题

1、精准的描述bean的名称(将注入的名称写对)

2、使用@Resource设置name的方式来重命名注入的对象;

3、使用@AutoWired+@Qualifier来筛选bean对象;

对象注入的三种方法

1、属性注入

2、构造方法注入

3、Setter方法注入

属性注入和构造方法注入以及 Setter 注入的区别是什么?

@Resource VS @Autowired?


一、如何使用方法注解

🌃1、前面介绍过,类注解是写到类上面的,那么方法注解是写到对应的方法上的;

    @Bean(name = "user1") 
    public User getUser1() {
        User user = new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }

2、方法注解的话是不能够单独使用的,如果我们只给一个方法注解@Bean的话,看是否能运行;

 ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
 User user = context.getBean(User.class);//只使用类属性
 System.out.println(user);

运行结果:

【Spring框架全系列】方法注解@Bean的使用

如何解决?我们只需要在方法注解的类中添加一个类注解即可;

【Spring框架全系列】方法注解@Bean的使用

再次运行:

【Spring框架全系列】方法注解@Bean的使用

注意Bean 的命名规则,当没有设置 name 属性时,那么 bean 默认的名称就是方法名,当设置了 name 属性之后,只能通过重命名的 name 属性对应的值来获取,也就是说重命名之后,再使用方法名就获取不到 bean 对象;

比如已经给bean重命名了,我们在启动类App中通过方法名来获取Bean对象;

【Spring框架全系列】方法注解@Bean的使用

看运行结果:

【Spring框架全系列】方法注解@Bean的使用

二、同一类型的对象注入多次的问题

1、在UserBeans类中写两个对象注解;

@Component
public class UserBeans {
    @Bean(name = "user1") // 【注意事项:只使用一个 @Bean 是无法将对象存储到容器中的】
    public User getUser1() {
        User user = new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }

    @Bean(name = "user2") // 【注意事项:只使用一个 @Bean 是无法将对象存储到容器中的】
    public User getUser2() {
        User user = new User();
        user.setId(2);
        user.setName("李四");
        return user;
    }

2、通过启动类来获取对象;

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
User user = context.getBean(User.class);//只使用类属性
System.out.println(user);

运行结果:

【Spring框架全系列】方法注解@Bean的使用

翻译过来的意思就是:没有可用的“com.User”类型的合格bean:应为单个匹配bean,但找到2:user1,user2;

那么,如何解决呢?这里我们提供了三种解决方案;

1、精准的描述bean的名称(将注入的名称写对)

比如我们在启动类中使用id+class的形式来取对象;

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
User user = context.getBean("user1",User.class);//只使用类属性
System.out.println(user);

运行结果:没有问题;

【Spring框架全系列】方法注解@Bean的使用

2、使用@Resource设置name的方式来重命名注入的对象;

1、这里我们通过UserController类来进行演示;注意我们添加的注解@Resource,下面新写了一个对象user1;

package com;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class UserController {
    @Resource
    private User user1;
    public void sayHi(){
        System.out.println("User"+user1);
    }
}

启动类App中代码:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController userController = context.getBean(UserController.class);
userController.sayHi();

运行结果:

【Spring框架全系列】方法注解@Bean的使用

3、使用@AutoWired+@Qualifier来筛选bean对象;

UserController代码:

package com;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class UserController {
    @Autowired
    @Qualifier(value = "user2")
    private User user2;
    public void sayHi(){
        System.out.println("User"+user2);
    }
}

运行结果:

【Spring框架全系列】方法注解@Bean的使用

对象注入的三种方法

1、属性注入

属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。
package com;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
/**
 * 根据属性实现 bean 对象的注入
 */
@Controller
public class UserController2 {
    // 对象注入方式1:属性注入
    @Autowired
    private UserService userService;
    public void sayHi() {
        userService.sayHi();
    }

}

启动类App:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController2 userController2 = context.getBean(UserController2.class);
userController2.sayHi();

运行结果:

【Spring框架全系列】方法注解@Bean的使用

2、构造方法注入

package com;

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

/**
 * 使用构造方法实现 bean 注入
 */
@Controller
public class UserController3 {

    private UserService userService;

    // 构造方法注入(官广推荐写法)
    @Autowired
    public UserController3(UserService userService) {
//        userService = new UserService(); // 传统的写法
        this.userService = userService;
    }
    
    public void sayHi() {
        userService.sayHi();
    }

}

注:如果当前类只存在一个构造方法,那么@Autowired注解可以省略;

启动类App:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController3 userController3 = context.getBean(UserController3.class);
userController3.sayHi();

运行结果:

【Spring框架全系列】方法注解@Bean的使用

3、Setter方法注入

package com;

import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

/**
 * 使用 Setter 实现 bean 注入
 */
@Controller
public class UserController4 {

    private UserService userService;

    @Resource
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void sayHi() {
        userService.sayHi();
    }

}

启动类App:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController4 userController4 = context.getBean(UserController4.class);
userController4.sayHi();

运行结果:

【Spring框架全系列】方法注解@Bean的使用

属性注入和构造方法注入以及 Setter 注入的区别是什么?

🚈1、属性注入:特点写法简单。但是通用性不好,它只能运行在 IoC 容器下,如果是非 IOC 容器就会出现问题。
🚅2、Setter 注入:早期 Spring 版本推荐的写法,Setter 注入通用性没有构造方法注入通用。
🚄3、构造方法注入: 通用性更好、它能确保在使用注入对象之前,此注入对象一定初始化过了。当构造方法注入参数过多时,此时开发者就要检查自己所写的代码是否符合单一设计原则的规范了,此注入方式也是 spring后期版本中推荐的注入方式。

注意:@Resource注解只支持属性注入和Setter注入,不支持构造方法注入;

【Spring框架全系列】方法注解@Bean的使用

@Resource VS @Autowired?

🎑出身不同: @Resource 来着与 JDK (Java 亲儿子) ,@Autowired 是 Spring 框架提供的。

🏚2、用法不同: @Autowired 支持属性注入、构造方法注入和 Setter 注入,而 @Resource 不支持构造方法注入。

🏫3、支持的参数不同: @Resource 支持更多的参数设置,比如 name、type 设置;@Autowired 只支持required 参数设置。

【Spring框架全系列】方法注解@Bean的使用

💡💡OK,今天的学习内容就到这里啦,至此,Spring更简单的读取和存储对象就已经更新完毕了,下篇博客我们会继续更新"bean的作用域和生命周期",欢迎阅读,感谢订阅!!文章来源地址https://www.toymoban.com/news/detail-439851.html

到了这里,关于【Spring框架全系列】方法注解@Bean的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring框架全系列】如何创建一个SpringBoot项目

    🌇哈喽,大家好,我是小浪。前几篇博客我们已经介绍了什么是Spring,以及如何创建一个Spring项目,OK,那么单单掌握Spring是完全不够的,Spring的家族体系十分强大,我们还需要深入学习,以便于我们后续达到能独立做项目的水平。今天我们来学习SpringBoot。🏜 📲目录 一、

    2024年02月03日
    浏览(50)
  • 【Spring框架全系列】Spring更简单的读取和存储对象

    📬📬哈喽,大家好,我是小浪。上篇博客我们介绍了如何创建一个spring项目,并且如何的存、取对象,介绍了相关方法,那么本篇博客将接着上篇博客的内容介绍如何更加简单的读取和存储对象。 🌃在 Spring 中想要更简单的存储和读取对象的核⼼是使⽤注解,也就是我们接

    2024年02月05日
    浏览(42)
  • KEIL5 MDK中下载STM32全系列芯片包的简易方法(免费)

    本文介绍了两种免费方法 本例中使用的STM32型号为STM32F407VET6。 打开Keil uVision5,点击下图所示的Pack Installer图标。 根据芯片型号开头字母可以查询到对应芯片。 例如STM32F4系列的芯片包名称为STM32F4xx_DFP,版本为2.14.0。 在网址中输入“https://www.keil.com/pack/Keil.”+对应的芯片包名

    2024年02月05日
    浏览(63)
  • 一起学SF框架系列5.8-spring-Beans-Bean注解解析3-解析配置component-scan

    本文主要讲述Spring是如何解析“context:component-scan”元素,扫描加载目录下的BeanDefinition。 1、解析的元素如下: 注:该元素解析过程中,会自动处理“context:annotation-config/”元素要解析的内容。 2、只扫描加载目录下的BeanDefinition,不对注解进行解析。在AbstractApplicationContext.

    2024年02月16日
    浏览(39)
  • FreeRTOS 全系列笔记——基于V10.4

    基于crotex-m处理器新建FreeRTOS工程 为什么使用嵌入式实时操作系统(RTOS) FreeRTOS——创建任务 FreeRTOS的任务调度和管理 FreeRTOS-内核链表数据结构 FreeRTOS-内核对时间的测量 FreeRTOS-内核中的钩子(Hook)函数 FreeRTOS-软件定时器的使用 FreeRTOS-软件定时器的实现原理 FreeRTOS-延后执行机制

    2024年02月04日
    浏览(39)
  • 小米红米全系列官方原厂预装系统

    小米红米全系列官方原厂预装系统恢复镜像 1.全系列为原厂预装恢复镜像系统,专机专用 2.自带原机所有驱动,主题,Logo,Office等,再次恢复原厂 链接: https://pan.baidu.com/s/1snKOsH3OMl3GZLqeAf-GLA?pwd=8888 3.支持型号如下: Xiaomi Book 12.4 二合一 Xiaomi Book Air 13 Redmi G (Pro) 游戏本 2022 锐

    2024年02月11日
    浏览(50)
  • Radware负载均衡-全系列产品证书更新(二)

    简单介绍一下关于Radware APSolute Vision平台的证书更新。 更新证书有两种方式,一种为自签发,另外一种为导入第三方证书,且更新证书仅能通过命令行的形式更新证书。两种方式都会导致APSolute Vision平台设备的重启(老版本,最新版本只会导致当前访问vision会话中断),请注

    2024年01月16日
    浏览(53)
  • 云安全系列4:解析云安全工具集

    随着组织越来越多地将数据和应用转移到云端,云安全在确保工作负载安全方面变得至关重要。Gartener 就表示:“云优先战略现在已十分普遍,甚至在不愿承担风险的企业机构中也是如此。但由于缺乏确保安全云计算部署所必需的技能和工具,因此执行仍然受到阻碍。” 在了

    2024年02月02日
    浏览(45)
  • 【云安全系列】Seccomp—云安全syscall防护利器

    Seccomp(全称 “Secure computing”),早在 2.6.12 版本(2005年3月8日)就引入到内核中,是通过只允许内核支持部分 syscall(系统调用),或者拒绝内核认为可能有危险的 syscall 集合的方式,来限制一个进程所支持的 syscall调用。最初,Seccomp 只允许使用read、 write、 _exit、sigreturn

    2024年02月08日
    浏览(43)
  • Oracle全系列版本官网下载保姆及教程

    下面以下载Oracle12cR2为例说明下载的整个过程。 基本步骤如下: 先注册一个Oracle账号并登录; 进入到客户下载页面搜索要下载的数据库版本; 得到Oracle下载器(Oracle_SSN_DML_xxxxx.exe),注意:每下载一次都会得到一个Oracle的下载器; 运行下载器进行下载 官网地址:https://www.or

    2024年01月17日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包