java注入接口和接口实现类

开源中国首席脑科主任 发布于 2015/08/05 11:17
阅读 7K+
收藏 0

在控制器Controller里面我们经常看到的是注入接口 如

@Autowide

private UserService userService;

但是如果这样

@Autowide

private UserServiceImpl userService;

这样合理么?

加载中
1
LucEsape
LucEsape
public interface BaseService{
	public void foo();
} 

public class BaseServiceImp implements BaseService {
	public void foo(){
		
	}
} 

// ex 1, 不暴露 BaseService
public class UserService {
	public void say();
}

public class UserServiceImp implements BaseService, UserService{
	
	@Resources
	private BaseService baseService;	// 注入 BaseServiceImp
	
	public void say(){
		
	}
	
	public void foo(){
		baseService.foo();
	}
}

// ex 2,暴露 BaseService
public class UserService extends BaseService{
	public void say();
}

public class UserServiceImp implements UserService{
	
	@Resources
	private BaseService baseService;	// 注入 BaseServiceImp
	
	public void say(){
		
	}
	
	public void foo(){
		baseService.foo();
	}
}

// ex 3,我个人不喜欢这种方式,除非没有选择。
public class UserServiceImp extends BaseServiceImp implements UserService{
		
	public void say(){
		
	}
}



开源中国首席脑科主任
开源中国首席脑科主任
大神看下我下面的评论 我是那么写的 给点意见
0
kuye
kuye
实现注入,接口注入,可以使用就行
开源中国首席脑科主任
开源中国首席脑科主任
用肯定能用的 就是想问这样合理么 如果到后期遇到某种什么情况 会不会有漏洞或者什么
0
kuye
kuye
如果你考虑以后会有其他数据库的实现方式,那么这种直接注入就不行,就要改成接口注入。接口只是规范你的实现,实现可以是很多种,接口实现解耦。
0
Sky__
Sky__
这里有个问题,如果XService 实现了 UserService 接口, 还有一个YService也实现了UserService, 那么,你注入了哪个实现?
开源中国首席脑科主任
开源中国首席脑科主任
主要我想有个BaseService
0
开源中国首席二弟子
开源中国首席二弟子

你是否想要做个继承关系呢?父类做 baseService。


0
LucEsape
LucEsape
当然用接口!为什么你要用BaseService?
LucEsape
LucEsape
回复 @首席撸出翔 : service 里面 可以引用service啊,这是合理的。
开源中国首席脑科主任
开源中国首席脑科主任
因为有许多方法我想公用,省去一些简单的CRUD的操作的一些接口 方法
0
开源中国首席脑科主任
开源中国首席脑科主任

我写一个BaseService接口,里面放入了一些基本的CRUD方法,然后xxService接口继承BaseService接口,xxService的实现类xxServiceImpl继承BaseServiceImpl接口实现xxService这样行么

0
loyal
loyal

没有什么合理不合理,如果你当时就是要用实现的一些其他方法未在接口中申明的方法,可以这么干.

不一定什么都要面向接口coding

0
开源中国首席脑科主任
开源中国首席脑科主任
大神我是这么写的
public interface BaseService<T> {
public void aa();
}


public class BaseServiceImpl<T> implements BaseService<T> {
public void aa(){
//code
}
}


public interface UserService extends BaseService<User>{}


public class UserServiceImpl  extends BaseServiceImpl<User> implements UserService{
//这里继承BaseServiceImpl
}  


然后userService就能直接调用BaseService的方法了
我就是想在baseService里面放一些基本的CRUD操作的方法
LucEsape
LucEsape
回复 @首席撸出翔 : 对
开源中国首席脑科主任
开源中国首席脑科主任
回复 @隔壁老鱼 : 我这个的做法 相当于在你写的demo里面 不用谢foo()方法,应为base里面方法有许多
LucEsape
LucEsape
参考 ex2
返回顶部
顶部