1.问题来源
对接微信支付时需要自己写PayService接口,没有多想写接口的时候就在接口上加了@Service实现类,结果报错如下,提示该接口的实现类未注入到bean中,显然servie注解加错位置了。
2.详细说明
先来回顾一下刚开始学习spring的时候,利用xml方式将类托管给 spring的bean容器。
2.1 先建立一个类,如下Person类
package com.xu.pojo;
public class Person {
private String name;
private Dog dog;
private Cat cat;
void eat(){
System.out.println("吃");
}
}
2.2 编写application.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--id: bean标识符,相当于类名Person class: bean对象所对应的类的全限定名(包名 + 类名) -->
<bean id="person" class="com.xu.pojo.Person"/>
</beans>
此时Person类已经交给了bean容器管理。
2.3 从容器中获取类(类似于注解中的@Autowired)
public class Test {
public static void main(String[] args) {
// 因为我们是用XML装配的bean,需要通过工厂获得类。
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 从容器中获取bean
Person person = context.getBean("person", Person.class);
person.eat();
}
}
可以看出getBean会返回的是一个person类,这里的操作也就相当于
Pereson person = new Person();
显然,通过xml的详细步骤我们可以看出注入容器中的是一个类。
3.@Service
注解
因为@Service
是将一个类自动注入到spring容器中,通过xml方式我们可以看出getBean中拿到的是类,也就是类的实例化,接口是没有办法实例化的,只有实现类
是可以进行实例化的,而所以是加在实现类
上的。
4.@Autowired写接口名还是实现类的名字?
该注解类似于new,但是使用了多态中的向上转型,父类的对象指向了子类的引用,即创建了一个接口对象,但这个对象指向实现类。