提出问题:
在Spring 容器中,抽象类可以加上@Compoment注解后,实现调用内部的方法吗?
类设计与测试
抽象类加注解,无子类实现
接口
public interface RechargeFacade { /** * 测试接口 */ void recharge();}
实现
@Servicepublic abstract class RechargeFacadeImpl implements RechargeFacade { @Override public void recharge() { System.out.println("asdasd1"); }}
测试
@SpringBootApplication@ComponentScan(basePackages = {"xxxx"})public class AppFinanceApplication { @Resource private RechargeFacade rechargeFacade; public static void main(String[] args) { SpringApplication.run(AppFinanceApplication.class, args).getBean(RechargeFacade.class); } @PostConstruct void init(){ System.out.println("asdasd======="); rechargeFacade.recharge(); }}
结果
Description:A component required a bean of type 'cn.lskiot.finance.compose.facade.RechargeFacade' that could not be found.
抽象类加一个子类继承
抽象类子类未加注解
public class asd extends RechargeFacadeImpl {}
结果
A component required a bean of type 'cn.lskiot.finance.compose.facade.RechargeFacade' that could not be found.
抽象类子类加注解
@Servicepublic class asd extends RechargeFacadeImpl {}
结果
问题引入
首先明确一个问题:抽象类不能生成实例对象,spring无法注入。
原因:
spring的原理是启动服务器时读取配置文件,取得类名后利用反射机制在spring上下文中生成一个单例的对象,由spring注入属性并维护此对象的状态,抽象类在反射生成对象时就已经失败了,后面的不会进行。