快捷搜索: 王者荣耀 脱发

@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配合使用

经验分享 程序员 微信小程序 职场和发展