Spring 方法注解@Bean及配置类扫描路径

 更新时间:2024年12月23日 11:53:35   作者:三三是该溜子  
这篇文章主要介绍了Spring 方法注解@Bean及配置类扫描路径,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧

引入

类注解是添加到某个类上的,但是存在两个问题

1. 使⽤外部包⾥的类,没办法添加类注解

2. ⼀个类,需要多个对象,⽐如多个数据源

这种场景,我们就需要使⽤⽅法注解 @Bean

一:@Bean方法注解

1:方法注解要搭配类注解使用

@Component
public class BeanConfig {
    @Bean
    public User user() {
        User user = new User();
        user.setName("zhangsan");
        user.setAge(18);
        return user;
    }
}
@SpringBootApplication
public class SpringIocDemoApplication {
    public static void main(String[] args) {
        // 获取Spring上下⽂对象
        ApplicationContext context = SpringApplication.run(SpringIocDemoApplication.class, args);
        // 从Spring上下⽂中获取对象
        User user = context.getBean(User.class);
        // 使⽤对象
        System.out.println(user);
    }
}

2:执行结果

如果不搭配类注解使用,Spring会报错没有找到这样一个Bean对象

二:如何定义多个对象

我们试想一下,如果一个类中,有多个方法都被@Bean注解修饰了,那么Spring在调用的时候怎么区分,我们需要调用的是哪个方法呢,比如上面的举例,有user1方法,user2方法

1:代码示例及运行结果

main方法沿用上述的

@Component
public class BeanConfig {
    @Bean
    public User user1() {
        User user = new User();
        user.setName("zhangsan");
        user.setAge(18);
        return user;
    }
    @Bean
    public User user2() {
        User user = new User();
        user.setName("lisi");
        user.setAge(19);
        return user;
    }
}

 报错信息显⽰:期望只有⼀个匹配,结果发现了两个,user1,user2
从报错信息中,可以看出来,@Bean注解的bean,bean的名称就是它的⽅法名

2:根据名称获取bean对象

@SpringBootApplication
public class SpringIocDemoApplication {
    public static void main(String[] args) {
        // 获取Spring上下⽂对象
        ApplicationContext context = SpringApplication.run(SpringIocDemoApplication.class, args);
        // 根据bean名称, 从Spring上下⽂中获取对象
        User user1 = (User) context.getBean("user1");
        User user2 = (User) context.getBean("user2");
        System.out.println(user1);
        System.out.println(user2);
    }
}

3:重命名Bean

通过设置name属性给Bean对象进⾏重命名操作,扫描线程类SpringIocDemoApplication代码此处省略(可参考上面)

(1)代码示例

@Bean(name = {"u1","user1"})
public User user1(){
    User user = new User();
    user.setName("zhangsan");
    user.setAge(18);
    return user;
}   

(2)注意点

name={}可以省略,只有⼀个名称时,{}也可以省略

三:扫描路径

思考:如果对象很多,我们实际用到的对象很少,那么Spring全都扫描一遍是不是非常浪费资源,那么扫描线程类SpringIocDemoApplication的扫描范围是如何规定的呢?

1:移动扫描线程类

我们把扫描线程类放到controller包路径下,在运行代码试试

@SpringBootApplication
public class SpringIocDemoApplication {
    public static void main(String[] args) {
        // 获取Spring上下⽂对象
        ApplicationContext context = SpringApplication.run(SpringIocDemoApplication.class, args);
        // 从Spring上下⽂中获取对象
        User u1 = (User) context.getBean("u1");
        // 使⽤对象
        System.out.println(u1);
    }
}

 2:运行结果

解释:没有bean的名称为u1,因为扫描线程类此时处于controller包下,那么默认只扫描controller包路径下的类,所以没有被扫描到的类,当然就拿不到bean对象了。

3:配置扫描路径@ComponentScan({})

@ComponentScan({"com.example.demo"})

在扫描线程类上加上注解@ComponentScan({"com.example.demo"}),就可以了

(1)注意点

{}⾥可以配置多个包路径,但是实际应用并不做推荐

(2)默认扫描范围

思考:为什么前⾯没有配置@ComponentScan注解也可以呢?

@ComponentScan 注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication 中了,默认扫描的范围是SpringBoot启动类所在包及其⼦包

(3)推荐做法

把启动类放在我们希望扫描的包的路径下,这样我们定义的bean就都可以被扫描到

到此这篇关于Spring 方法注解@Bean及配置类扫描路径的文章就介绍到这了,更多相关Spring 注解@Bean内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 代码块与静态代码块加载顺序

    java 代码块与静态代码块加载顺序

    这篇文章主要介绍了java 代码块与静态代码块加载顺序的相关资料,需要的朋友可以参考下
    2017-07-07
  • Java数据类型和取值范围入门详解(代码示例)

    Java数据类型和取值范围入门详解(代码示例)

    本文深入介绍了Java编程语言中的基本数据类型,包括整数、浮点数、字符和布尔值,讨论了它们的取值范围,并提供了示例代码,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • SpringCloud项目中Feign组件添加请求头所遇到的坑及解决

    SpringCloud项目中Feign组件添加请求头所遇到的坑及解决

    这篇文章主要介绍了SpringCloud项目中Feign组件添加请求头所遇到的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java实现从字符串中找出数字字符串的方法小结

    Java实现从字符串中找出数字字符串的方法小结

    这篇文章主要介绍了Java实现从字符串中找出数字字符串的方法,结合实例形式总结分析了Java查找数字字符串的常用技巧,需要的朋友可以参考下
    2016-03-03
  • springboot集成Lucene的详细指南

    springboot集成Lucene的详细指南

    这篇文章主要为大家详细介绍了springboot集成Lucene的详细指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-05-05
  • SpringBoot中实现文件上传、下载、删除功能的步骤

    SpringBoot中实现文件上传、下载、删除功能的步骤

    本文将详细介绍如何在 Spring Boot 中实现文件上传、下载、删除功能,采用的技术框架包括:Spring Boot 2.4.2、Spring MVC、MyBatis 3.5.6、Druid 数据源、JUnit 5 等,文中有详细的操作步骤和示例代码供大家参考,需要的朋友可以参考下
    2024-01-01
  • 实例讲解MyBatis如何防止SQL注入

    实例讲解MyBatis如何防止SQL注入

    这篇文章通过实例代码介绍MyBatis如何防止SQL注入,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Spring JDBC参数处理与嵌入式数据库的实战指南

    Spring JDBC参数处理与嵌入式数据库的实战指南

    这篇文章介绍了Spring Framework中JDBC的支持,包括如何处理参数和数据值、处理BLOB和CLOB、为IN子句传递列表以及存储过程调用中的复杂类型,本文用通俗易懂的方式讲解Spring JDBC参数处理与嵌入式数据库的相关操作,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • Java使用synchronized修饰方法来同步线程的实例演示

    Java使用synchronized修饰方法来同步线程的实例演示

    synchronized下的方法控制多线程程序中的线程同步非常方便,这里就来看一下Java使用synchronized修饰方法来同步线程的实例演示,需要的朋友可以参考下
    2016-06-06
  • 教你在SpringBoot中管理多环境配置文件

    教你在SpringBoot中管理多环境配置文件

    在项目开发中,一般会分为开发环境,测试环境和生产环境.如果总是在一个文件中修修改改,难免会出现错误,尤其是在交接的过程中,一旦出现问题,轻则丢失绩效,重则需要删库跑路.本文则带大家详细了解怎么管理多环境配置文件,需要的朋友可以参考下
    2021-05-05

最新评论