首先理解spring的注解注入dao接口的目的是什么,是為了接口不用進行實例化就可以被任何一個類去調用
我昨天下午就是發現,不同的類,一模一樣的注解,為什么前面的類可以使用注解調用mapper的sql查詢,但是
第二個類死活無法執行注解進行sql查詢,寫一段代碼,大家可能更清楚一些。
如果有兩個類A和B
public class A {
@Autowired
private IBankDao bankDao;
public void getdata(){
String str = null;
//下面這一行調用接口是執行的
str = bankDao.getdate("03003","15000000");
}
}
public class B {
@Autowired
private IBankDao bankDao;
public void getdata(){
String str = null;
//下面這一行調用接口是執行的
str = bankDao.getdate("03003","15000000");
}
}
那么A類和B類都是可以調用Dao層執行mapper里面的sql語句的,但是我遇到的問題是B類嵌入A類當中
代碼如下
public class A {
@Autowired
private IBankDao bankDao;
public void getdata(){
String str = null;
//下面這一行調用接口是執行的
str = bankDao.getdate("03003","15000000");
B b = new B();
//使用New之后,B類的注解就不起作用了
b.getdata();
}
}
此時B中的Dao層失效了,我還嘗試了不使用New方法,直接使用B類調用自己的方法,但是B類要調用自己的方法,
那么方法必須是靜態的。代碼如下
public class A {
@Autowired
private IBankDao bankDao;
public void getdata(){
String str = null;
//下面這一行調用接口是執行的
str = bankDao.getdate("03003","15000000");
//使用B類調用方法注解還是不起作用
B.getdata();
}
}
public class B {
@Autowired
private static IBankDao bankDao;//連這個都必須變成靜態了,因為上面的A類中使用B類調用自己的方法,B的getdate()方法變成靜態了,
那么private IBankDao bankDao 也必須變成靜態的了 ,所以就不起作用了。
public static void getdata(){
String str = null;
//下面這一行調用接口是執行的
str = bankDao.getdate("03003","15000000");
}
}
看重點,大家可能已經明白了,就是有注解的類,不能new,也不能有靜態方法調用dao層,正確的是下面的代碼,A類和B類都可以調用dao層
public class A {
@Resource(name = "b")
private B b;
@Autowired
private IBankDao bankDao;
public void getdata(){
String str = null;
str = bankDao.getdate("03003","15000000");
b.getdata();
}
}
@Service
public class B {
@Autowired
private IBankDao bankDao;
public void getdata(){
String str = null;
str = bankDao.getdate("03003","15000000");
}
}