首先理解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");
}
}