依赖注入和自动装配

参考:https://zhidao.baidu.com/question/1577675767538514300.html

          https://blog.csdn.net/u012843873/article/details/52399206

之前一直没有注意一个问题:spring中的Autowird为什么能将接口的实现类取代接口,自动装配给控制类

如下面这个例子,控制类自动注入的是Service,但是真正调用的确实ServiceImpl的方法,也就是说控制类真正注入的是ServiceImpl类,这是为什么呢,为什么会识别并注入ServiceImpl类??

接口类:CategoryService

public interface CategoryService {
     List<Category> list();
}

实现类:CateGorySericeImpl

@Service
public class CategoryServiceImpl  implements CategoryService{
    @Autowired
    CategoryMapper categoryMapper;
    public List<Category> list(){
        return categoryMapper.list();
    };
}

控制类

@Controller
@RequestMapping("")
public class CategoryController {
    @Autowired
    CategoryService categoryService;
 }

原来实现类实现了接口,那么实现类是接口类型,ServiceImpl和Service是同一种类型,Spring的注解Autowird真正注入的是接口的实现类ServiceImpl而不是接口Service。

问题又来了,如果我有多个实现类实现了这个接口,Spring会注入那个实现类呢???

先从原理说起,什么是依赖注入,什么是自动装配

依赖注入的本质就是装配,装配是依赖注入的具体行为

依赖注入有两种形式:构造器注入和setter注入。也就是我们在xml中写的一堆<bean></bean>,如果bean太多我们还这样写基本是要成为码农了,更何况我们还有把有关联的bean装配起来,一旦bean很多,就不好维护了。

为此Spring使用自动装配解决这个问题,开发人员不用关心具体装配哪个bean的引用,识别工作由Spring来完成,因此一般配有自动监测来和自动装配配合完成。自动装配其实就是将依赖注入“自动化”的一个简化配置的操作

xml的<bean>配置中通添加autowire属性实现四种形式的自动装配,byName, byType, constructor, autodetect。byName就是会将与属性的名字一样的bean进行装配。byType就同属性一样类型的bean进行装配。constructor就是通过构造器来将类型与参数相同的bean进行装配。autodetect是constructor与byType的组合,会先进行constructor,如果不成功,再进行byType。

Spring2.5之后提供了注解方式的自动装配。但是要使用这些注解,需要在配置文件中配置<context:annotation-config />。只有加上这一配置,才可以使用注解进行自动装配,默认情况下基于注解的装配是被禁用的。常用的自动装配注解有以下几种:@Autowired,@Resource,@Inject,@Qualifier,@Named。

@Autowired注解是byType类型的,因此会将接口的实现类取代接口,自动装配给控制类








猜你喜欢

转载自blog.csdn.net/qq_20367813/article/details/80940366