Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring如何知道bean注入@bean和方法调用_Java_Spring_Dependency Injection - Fatal编程技术网

Java Spring如何知道bean注入@bean和方法调用

Java Spring如何知道bean注入@bean和方法调用,java,spring,dependency-injection,Java,Spring,Dependency Injection,我正在尝试Spring框架的一些东西,我想知道Spring在使用java配置时如何通过方法调用注入单例依赖项 例如: @配置 公共类应用程序配置{ @豆子 公共BlogRepository BlogRepository(){ 返回新的BlogRepositoryImpl(); } @豆子 @范围(“原型”) 公共BlogService BlogService(){ 返回新的BlogServiceImpl(blogRepository()); } @豆子 公共AuthorService Autho

我正在尝试Spring框架的一些东西,我想知道Spring在使用java配置时如何通过方法调用注入单例依赖项

例如:

@配置
公共类应用程序配置{
@豆子
公共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()
实现