关于Springboot中@Component、@configuration、@Bean之间的那些关系~

Springboot最大的方便之处就是在于注解方便,楼主最近在进行Springboot基础知识的复习 ,当时在学习的时候没有注意到@Component、@configuration、@Bean之间的区别 ,认为这些注解不都是把类或者方法放到容器中吗 ,今天仔细研究,发现不是这么一回事儿~

@Component

首先对@Component做一个简单的介绍,下面是部分我的理解和网上的摘抄:

Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。

@configuration、@Bean

@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名。作用类似于xml配置文件中的bean。

@Configuration
public class MyConfig {

    @Bean
    public HelloService helloService02(){
        System.out.println("@bean给容器添加组件了!!!");
    return new HelloService();
    }
}

结果如下

2020-02-05 21:58:30.399  INFO 8700 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-02-05 21:58:30.400  INFO 8700 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.27]
2020-02-05 21:58:30.498  INFO 8700 --- [           main] o.a.c.c.C.[.[localhost].[/hello2]        : Initializing Spring embedded WebApplicationContext
2020-02-05 21:58:30.498  INFO 8700 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1012 ms
@bean给容器添加组件了!!!
2020-02-05 21:58:30.686  INFO 8700 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-02-05 21:58:30.879  INFO 8700 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8888 (http) with context path '/hello2'
2020-02-05 21:58:30.884  INFO 8700 --- [           main] c.d.s.Springboot02configApplication      : Started Springboot02configApplication in 1.923 seconds (JVM running for 3.493)

当@configuration换成@Component时

@Component

//@Configuration
public class MyConfig {

    @Bean
    public HelloService helloService02(){
        System.out.println("@bean给容器添加组件了!!!");
    return new HelloService();
    }
}


2020-02-05 22:18:40.647  INFO 14632 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.27]
2020-02-05 22:18:40.748  INFO 14632 --- [           main] o.a.c.c.C.[.[localhost].[/hello2]        : Initializing Spring embedded WebApplicationContext
2020-02-05 22:18:40.748  INFO 14632 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1037 ms
@bean给容器添加组件了!!!
2020-02-05 22:18:40.917  INFO 14632 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'

由此可见此时@Component的效果和@configuration的使用效果相同。但是我在查阅资料发现,@Component得到的对象不是同一个对象,而@Configuration得到的是同一个对象。

参考文章链接: https://www.cnblogs.com/feiyu127/p/7700090.html.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HERODING77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值