是什么让您认为代理无法处理呼叫?
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 接口
public interface BlogRepository {
}
public interface BlogService {
}
public interface AuthorService {
}
简单的 Bean 类
它们没有任何实际逻辑,只是一个显示对象“身份”的toString() 实现,类似于Object 类中默认的toString() 实现。
public class BlogRepositoryImpl implements BlogRepository {
@Override
public String toString() {
return "BlogRepositoryImpl@" + Integer.toHexString(hashCode());
}
}
public class BlogServiceImpl implements BlogService {
private BlogRepository blogRepository;
public BlogServiceImpl(BlogRepository blogRepository) {
this.blogRepository = blogRepository;
}
@Override
public String toString() {
return "BlogServiceImpl@" + Integer.toHexString(hashCode()) + "[blogRepository=" + this.blogRepository + "]";
}
}
public class AuthorServiceImpl implements AuthorService {
private BlogRepository blogRepository;
public AuthorServiceImpl(BlogRepository blogRepository) {
this.blogRepository = blogRepository;
}
@Override
public String toString() {
return "AuthorServiceImpl@" + Integer.toHexString(hashCode()) + "[blogRepository=" + this.blogRepository + "]";
}
}
配置类
如问题中所定义。
public class AppConfiguration {
public BlogRepository blogRepository() {
return new BlogRepositoryImpl();
}
public BlogService blogService() {
return new BlogServiceImpl(blogRepository());
}
public AuthorService authorService() {
return new AuthorServiceImpl(blogRepository());
}
}
作为 String 的代理类可以实现它
与上面的答案相同,只是完成了所有方法。
public class AppConfigurationProxy extends AppConfiguration {
private BlogRepository blogRepository;
private BlogService blogService;
private AuthorService authorService;
@Override
public BlogRepository blogRepository() {
if (this.blogRepository == null)
this.blogRepository = super.blogRepository();
return this.blogRepository;
}
@Override
public BlogService blogService() {
if (this.blogService == null)
this.blogService = super.blogService();
return this.blogService;
}
@Override
public AuthorService authorService() {
if (this.authorService == null)
this.authorService = super.authorService();
return this.authorService;
}
}
测试
public class Test {
public static void main(String[] args) {
// Show result without proxy
AppConfiguration config = new AppConfiguration();
System.out.println(config.blogRepository());
System.out.println(config.blogService());
System.out.println(config.authorService());
// Show how only one BlogRepository is craeted when proxy is used
config = new AppConfigurationProxy();
System.out.println(config.blogRepository());
System.out.println(config.blogService());
System.out.println(config.authorService());
}
}
输出
BlogRepositoryImpl@1e81f4dc
BlogServiceImpl@7960847b[blogRepository=BlogRepositoryImpl@6a6824be]
AuthorServiceImpl@2c13da15[blogRepository=BlogRepositoryImpl@77556fd]
BlogRepositoryImpl@9e89d68
BlogServiceImpl@3b192d32[blogRepository=BlogRepositoryImpl@9e89d68]
AuthorServiceImpl@16f65612[blogRepository=BlogRepositoryImpl@9e89d68]
可以看出,第一部分没有使用代理,最终得到了 3 个不同的 BlogRepositoryImpl 实例。
使用代理,即使blogService()“直接”调用blogRepository(),也只会创建BlogRepositoryImpl 的一个实例并共享。