@Bean是否要跟@Configuration配合使用

1. @Bean能不能单独在方法上注解?可以,但是并不会注入到Spring的IOC容器中,相当于有没有注解都一样
2. @Bean是否要跟@Configuration配合使用?这个问题的出发点应该是:一. @Bean单独使用时,能不能将方法返回的对象注入到SpringIOC容器中? 二. @Bean注解方法时,要求方法返回的bean是从SpringIOC容器获取的而不是新创建的,即保证单例;三 @Bean注解方法时,是不是一定要配合@Configuration注解才能保证获取的bean是从IOC容器获取的而不是新创建的,用@Component等其他注解行不行?

下面进行实验:

  • @Bean单独使用:
import java.util.Scanner;

public class User {
	@Bean
	public Scanner getScanner(){
		System.out.println("Create Scannner... ...");
		return new Scanner(System.in);
	}
}
@Controller
public class SampleController {

    @RequestMapping("/getUser")
    public void test(){
        System.out.println(new User().getScanner().hashCode());
    }
}

两次访问localhost:8080/getUser,两次分别得到的结果为:

/** 第 1 次 */
Create Scannner... ...
1188664067
/** 第 2 次 */
Create Scannner... ...
661369306

结论:@Bean单独注解方法时,每次调用方法都是执行方法内的逻辑并返回新创建的对象bean,而且SpringIOC并没有该bean的存在!!!

  • @Bean + @Configuration 使用时:
@Controller
@Configuration
public class SampleController {

	@Bean
    public User getUser(){
        System.out.println("Create User... ...");
        return new User();
    }

    @RequestMapping("/getUser")
    public void test(){
        System.out.println(getUser());
    }
    
}

在启动服务器过程中,观察到:
在这里插入图片描述
说明@Bean注解的方法返回的实例已经注入到SpringIOC容器中了,而不是在用户访问的时候才去调用方法产生bean ;
两次访问localhost:8080/getUser,两次分别得到的结果为:

/* 第 1 次*/ 
com.hxun.domain.User@45b189b
/* 第 2 次*/
com.hxun.domain.User@45b189b

结论:@Bean + @Configuration ,在调用@Bean注解的方法时返回的实例bean是从IOC容器获取的,已经注入的,且是单例的,而不是新创建的。

  • @Bean + @Component 使用时:
@Controller
@Component
public class SampleController {

	@Bean
    public User getUser(){
        System.out.println("Create User... ...");
        return new User();
    }

    @RequestMapping("/getUser")
    public void test(){
        System.out.println(getUser());
    }
    
}

在服务器启动过程中,同样观察到:
在这里插入图片描述
说明此时@Bean注解的方法返回的bean也已经注入到SpringIOC容器中了。
两次访问localhost:8080/getUser,两次分别得到的结果为:

/* 第 1 次 */
Create User... ...
com.hxun.domain.User@7a2a5b82
/* 第 2 次 */
Create User... ...
com.hxun.domain.User@1db5de40

结论:@Bean + @Component,虽然@Bean注解的方法返回的实例已经注入到SpringIOC容器中,但是每次调用@Bean注解的方法时,都会创建新的对象实例bean返回,并不会从IOC容器中获取。
 

    因此,要实现在@Bean注解方法时,要求从IOC容器中返回实例bean而不是每次都新创建一个对象,则@Bean要跟@Configuration配合使用
  
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值