在service的接口中添加注解还是在实现类impl?
答:@Service注解是标注在实现类上的,因为@Service是把spring容器中的bean进行实例化,也就是等同于new操作,只有实现类是可以进行new实例化的,而接口则不能,所以是加在实现类上的。
Mybatis 接口编程中dao 层接口没有产生bean的注解, 为什么能被实例化为bean?
答:https://blog.csdn.net/java280580332/article/details/72123890
自己理解:实际上不是接口实例化,而是接口的实现类被实例化,框架底层会创建dao层接口的实现类,并且声明该类为一个bean,注入Ioc容器中。类似于service层有实现类,并用@Service修饰,就会将该实现类注入到ioc容器中。后面controller层用 @Autowired调用的时候,会直接从ioc容器中获取。
Controller获取实例的过程:
使用@Autowired,程序在spring的容器中查找类型时TestService的bean,刚好找到有且只有一个此类型的bean,即TestServiceImpl,所以就把testServiceImpl自动装配到了Controller的实例TestService中。
@Autowired作用:
自动装配。创建应用对象之间协作关系的行为称为装配。也就是说当一个类A的属性中声明了另一个类B的对象,A实例化时,需要为A的属性B进行实例化。这就是装配。
1.网上理解:自动转配会自动将对象属性实例化,实例化对象是它的实现类。
2.自己理解:@Autowired会从ioc容器中找到bean(实例化对象),并且将bean地址赋值给一个变量。
在A类中声明属性B时加上注解@Autowired,A实例化时spring会自动从容器中调动B的实例。为了让spring能从容器中调用B的实例,需在B的类声明上能产生Bean的注解。如果B是一个接口(无法实例化对象),则会调用B的实现类创建一个对象供A类使用。
能产生Bean的注解有:
@Component;@Repository;@Controller;@Service;@Configration前五种只能对类使用。
@Bean (特殊,可对方法注解。@Bean注解需在上方五个注解的类中才生效,例如下:)
@component作用:
定义一个bean,并实例化,并放到ioc容器中,相当于配置文件中的<bean id="" class=""/>。
以上参考:
https://blog.csdn.net/java280580332/article/details/72123890
https://www.cnblogs.com/JuncaiF/p/11153254.html