一文读懂Spring中@Bean注解的核心作用

 更新时间:2024年01月05日 08:46:50   作者:手插口袋谁也不爱♡  
快速了解Spring框架中的@Bean注解?本文将带你一键掌握其核心作用!只需一篇短文,揭示@Bean注解如何在Spring中定义bean实例,以及管理和装配Bean的奥秘,阅读指南,让Spring开发更加得心应手!

存储Bean对象

将对象存储在 Spring 中,有两种注解类型可以实现:

类注解:@Controller@Service@Repository@Component@Configuration 方法注解:@Bean @Controller(控制器存储)

如下使用@Controller存储Bean代码:

@Controller
        public class UserController {
        public void SayHi(String name){
        System.out.println("你好"+name);
    }
}

使用获取上下文的方法获取上面存储的对象

public class Test {
    public static void main(String[] args) {
        //获取spring上下文
     ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
    //获取指定的Bean对象名称+类型进行获取
      UserController userController =  (UserController) applicationContext.getBean("userController");
      userController.SayHi("zcx");
    }
}

效果为

@Service(服务存储)

如下使用@Service存储Bean代码:

@Service
public class UserService {
    public void SayHi(String name){
        System.out.println("你好"+name);
    }
}

输出结果跟@Controller一样

@Repository(仓库存储)

如下使用@Repository存储Bean代码:

@Repository
public class UserRepository {
    public void SayHi(String name){
        System.out.println("你好"+name);
    }
}

@Component(组件存储)

如下使用@Component存储Bean代码:

@Component
public class UserComponent {
    public void SayHi(String name){
        System.out.println("你好"+name);
    }
}

@Configuration(配置存储)

如下使用@Configuration存储Bean代码:

@Configuration
public class UserConfiguration {
    public void SayHi(String name){
        System.out.println("你好"+name);
    }
}

需要这么多类注解是让程序员看到类注解之后,就能直接了解当前类的⽤途,比如:

@Controller:表示的是业务逻辑层 @Servie:表示的是服务层 @Repository:表示的是持久层 @Configuration:表示的是配置层

Bean

⽅法注解是放到某个⽅法上的要配合类注解使⽤,如以下代码的实现:

@Controller
public class Users {
    @Bean
    public User user1(){
        User user = new User();
        return user;
    }
}
public class Test {
    public static void main(String[] args) {
        //获取spring上下文
     ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
    //获取指定的Bean对象名称+类型进行获取
    User user =  (User) applicationContext.getBean("user1");
      user.sayHi("zcx");
    }
}

user类

@Component
public class User {

    public void sayHi(String name){

        System.out.println(name+"你好");
    }

}

结果

重命名Bean

可通过设置 name 属性给 Bean 对象进⾏重命名操作

@Bean(name = {"u1", "us1"})
public User user1() {
User user = new User();
return user;
}

或者

@Bean(name = {"u1", "us1"})
public User user1() {
User user = new User();
return user;
}

获取Bean对象

获取Bean对象就是把对象取出来放入某个类中,也叫对象注入或者对象装配。

对象注入有三种实现方法:

属性注⼊ 构造⽅法注⼊ Setter 注⼊

下⾯我们按照实际开发中的模式,将 Service 类注⼊到 Controller 类中

属性注入

属性注⼊是使⽤ @Autowired 实现的,实现代码如下:

@Service
public class UserService {

    public User user1(){
        User user = new User();
        return user;
    }
}
@Controller
public class UserController {
    @Autowired
    private UserService userService;
    public User getUser(){
 return userService.user1();
    }
}
public class Test {
    public static void main(String[] args) {
        //获取spring上下文
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
        //获取指定的Bean对象名称+类型进行获取
        UserController userController = applicationContext.getBean(UserController.class);
      userController.getUser().sayHi("zcx");
    }
}

构造方法注入

构造⽅法注⼊是在类的构造⽅法中实现注⼊,实现代码如下:

@Controller
public class UserController {
    private UserService userService;
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
    public User getUser(){
 return userService.user1();
    }
}

其余代码写法跟属性注入一样

Setter注入

在设置 set ⽅法的时候需要加上 @Autowired 注解

@Controller
public class UserController {
    private UserService userService;
    @Autowired
    public void SetUserController(UserService userService) {
        this.userService = userService;
    }
    public User getUser(){
 return userService.user1();
    }
}

@Resource(注入关键字)

@Controller
public class UserController {
    @Resource
    private UserService userService;
    public User getUser(){
 return userService.user1();
    }
}

使用@Resource 可以解决同⼀类型多个 Bean 报错问题

可以如下设置方法名

@Resource(name = "user1")

@Autowired 和 @Resource 的区别

出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解 使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如name 设置,根据名称获取 Bean @Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注⼊和属性注⼊,不能⽤于构造函数注⼊

更多文章推荐:

1.Spring Boot 3.x 教程,太全了!

2.2,000+ 道 Java面试题及答案整理(2024最新版)

3.《Java开发手册(嵩山版)》最新发布!

到此这篇关于一文读懂Spring中@Bean注解的核心作用的文章就介绍到这了,更多相关Spring 中 @Bean 注解用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 数据库连接池 DBCP 的介绍

    Java 数据库连接池 DBCP 的介绍

    这篇文章主要给大家分享的是 Java 数据库连接池 DBCP 的介绍, 是 Apache 旗下 Commons 项目下的一个子项目,提供连接池功能DBCP,下面来看看文章的具体介绍内容吧,需要的朋友可以参考一下
    2021-11-11
  • springboot整合Mybatis、JPA、Redis的示例代码

    springboot整合Mybatis、JPA、Redis的示例代码

    这篇文章主要介绍了springboot整合Mybatis、JPA、Redis的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Spring AOP手动实现简单动态代理的代码

    Spring AOP手动实现简单动态代理的代码

    今天小编就为大家分享一篇关于Spring AOP手动实现简单动态代理的代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java中的static和final关键字的使用详解

    Java中的static和final关键字的使用详解

    这篇文章主要介绍了Java中的static和final关键字的使用详解,  当方法名前有static,即为static方法,可以方便我们无需创建对象也可以调用此方法,静态方法比较拉,只可以访问 静态的 属性/变量/方法,无法访问非静态的这些属性/变量/方法,需要的朋友可以参考下
    2024-01-01
  • 使用JavaMail发送邮件保证成功的方法

    使用JavaMail发送邮件保证成功的方法

    JavaMail是利用现有的邮件账户发送邮件的工具,使用过JavaMail的api发送邮件的人可能会有这样一个疑惑:我如何知道我调用该api发送的邮件是否成功呢?那么通过下面这篇文章大家一起来看看使用JavaMail保证邮件发送成功的方法,有需要的朋友们可以参考借鉴。
    2016-11-11
  • Spring中的Sentinel规则持久化解析

    Spring中的Sentinel规则持久化解析

    这篇文章主要介绍了Spring中的Sentinel规则持久化解析,具体内容包括,Sentinel规则推送三种模式介绍,原始模式,拉模式,推模式,并对基于Nacos配置中心控制台实现推送进行详尽介绍,需要的朋友可以参考下
    2023-09-09
  • Java 如何用二维数组创建空心菱形

    Java 如何用二维数组创建空心菱形

    这篇文章主要介绍了Java 如何用二维数组创建空心菱形,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • java字符串压缩解压示例

    java字符串压缩解压示例

    这篇文章主要介绍了java字符串压缩解压示例,先压缩,再加密,再压缩,数据越大,压缩比例越高,需要的朋友可以参考下
    2014-03-03
  • mybatis-plus3.0.1枚举返回为null解决办法

    mybatis-plus3.0.1枚举返回为null解决办法

    这篇文章主要介绍了mybatis-plus3.0.1枚举返回为null解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Springboot整合Netty自定义协议实现示例详解

    Springboot整合Netty自定义协议实现示例详解

    这篇文章主要为大家介绍了Springboot整合Netty自定义协议实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11

最新评论