Java Spring如何知道bean注入@bean和方法调用
我正在尝试Spring框架的一些东西,我想知道Spring在使用java配置时如何通过方法调用注入单例依赖项 例如:Java Spring如何知道bean注入@bean和方法调用,java,spring,dependency-injection,Java,Spring,Dependency Injection,我正在尝试Spring框架的一些东西,我想知道Spring在使用java配置时如何通过方法调用注入单例依赖项 例如: @配置 公共类应用程序配置{ @豆子 公共BlogRepository BlogRepository(){ 返回新的BlogRepositoryImpl(); } @豆子 @范围(“原型”) 公共BlogService BlogService(){ 返回新的BlogServiceImpl(blogRepository()); } @豆子 公共AuthorService Autho
@配置
公共类应用程序配置{
@豆子
公共BlogRepository BlogRepository(){
返回新的BlogRepositoryImpl();
}
@豆子
@范围(“原型”)
公共BlogService BlogService(){
返回新的BlogServiceImpl(blogRepository());
}
@豆子
公共AuthorService AuthorService(){
返回新的AuthorServiceImpl(blogRepository());
}
}
我知道这个类也是一个bean,它是由Spring代理的,但是,既然我从类中调用了
BlogRepository()
,所以代理不能处理调用,Spring怎么能总是获得现有的BlogRepository
单例呢?为什么你认为代理不能处理调用
Spring可以生成类似于此子类的代理:
class AppConfigurationProxy extends AppConfiguration {
private BlogRepository blogRepository;
@Override
public BlogRepository blogRepository() {
if (blogRepository == null)
blogRepository = super.blogRepository();
return blogRepository;
}
// same for the other two @Bean methods
}
现在,无论AppConfiguration
中的一个方法调用它自己的blogRepository()
方法多少次,它都会得到相同的对象
更新:证明上述方法有效 简单Bean接口
公共接口blog存储库{
}
公共接口博客服务{
}
公共接口AuthorService{
}
简单Bean类
它们没有任何实际的逻辑,只有一个显示对象“身份”的toString()
实现,类似于类对象中的默认toString()
实现
公共类BlogRepositoryImpl实现BlogRepository{
@凌驾
公共字符串toString(){
返回“BlogRepositoryImpl@”+整数.toHexString(hashCode());
}
}
公共类BlogServiceImpl实现BlogService{
私人博客库;
公共BlogServiceImpl(BlogRepository BlogRepository){
this.blogRepository=blogRepository;
}
@凌驾
公共字符串toString(){
返回“BlogServiceImpl@”+Integer.toHexString(hashCode())+”[blogRepository=“+this.blogRepository+”];
}
}
公共类AuthorServiceImpl实现AuthorService{
私人博客库;
公共AuthorServiceImpl(BlogRepository BlogRepository){
this.blogRepository=blogRepository;
}
@凌驾
公共字符串toString(){
返回“AuthorServiceImpl@”+Integer.tohextString(hashCode())+“[blogRepository=“+this.blogRepository+”]”;
}
}
配置类
如问题中所定义
公共类AppConfiguration{
公共BlogRepository BlogRepository(){
返回新的BlogRepositoryImpl();
}
公共BlogService BlogService(){
返回新的BlogServiceImpl(blogRepository());
}
公共AuthorService AuthorService(){
返回新的AuthorServiceImpl(blogRepository());
}
}
代理类作为字符串可以实现它
与答案顶部相同,只是完成了所有的方法
公共类AppConfigurationProxy扩展了AppConfiguration{
私人博客库;
私人博客服务;
私人AuthorService AuthorService;
@凌驾
公共BlogRepository BlogRepository(){
if(this.blogprepository==null)
this.blogRepository=super.blogRepository();
返回此.blog存储库;
}
@凌驾
公共BlogService BlogService(){
if(this.blogService==null)
this.blogService=super.blogService();
返回此.blogService;
}
@凌驾
公共AuthorService AuthorService(){
if(this.authorService==null)
this.authorService=super.authorService();
返回此.authorService;
}
}
试验
公共类测试{
公共静态void main(字符串[]args){
//显示不带代理的结果
AppConfiguration config=新的AppConfiguration();
System.out.println(config.blogRepository());
System.out.println(config.blogService());
System.out.println(config.authorService());
//显示在使用代理时如何仅对一个BlogRepository进行装箱
config=新的AppConfigurationProxy();
System.out.println(config.blogRepository());
System.out.println(config.blogService());
System.out.println(config.authorService());
}
}
输出
BlogRepositoryImpl@1e81f4dc
BlogServiceImpl@7960847b[博客存储库=BlogRepositoryImpl@6a6824be]
AuthorServiceImpl@2c13da15[博客存储库=BlogRepositoryImpl@77556fd]
BlogRepositoryImpl@9e89d68
BlogServiceImpl@3b192d32[博客存储库=BlogRepositoryImpl@9e89d68]
AuthorServiceImpl@16f65612[博客存储库=BlogRepositoryImpl@9e89d68]
可以看出,第一部分没有使用代理,最后是3个不同的BlogRepositoryImpl
实例
使用代理时,仅创建并共享一个BlogRepositoryImpl
实例,即使blogService()
直接调用blogRepository()
。为什么您认为代理无法处理该调用
Spring可以生成类似于此子类的代理:
class AppConfigurationProxy extends AppConfiguration {
private BlogRepository blogRepository;
@Override
public BlogRepository blogRepository() {
if (blogRepository == null)
blogRepository = super.blogRepository();
return blogRepository;
}
// same for the other two @Bean methods
}
现在,无论AppConfiguration
中的一个方法调用它自己的blogRepository()
方法多少次,它都会得到相同的对象
更新:证明上述方法有效
简单Bean接口
公共接口blog存储库{
}
公共接口博客服务{
}
公共接口AuthorService{
}
简单Bean类
它们没有任何实际的逻辑,只有一个显示对象“身份”的toString()
实现,类似于类Objec中的默认toString()
实现