一、IOC详解
IOC控制反转,就是将对象的控制权交给Spring的IOC容器,由IOC容器创建及管理对象。IOC容器创建的对象称为bean对象。
使用步骤
基于这些注解,我们就可以使用 @Service
注解声明Service层的bean。 使用 @Repository
注解声明Dao层的bean。 代码实现如下:
1.Service层
代码如下(示例):
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptDao deptDao= new DeptDaoImpl();
@Override
public List<Dept> queryDeptList() {
//代码逻辑
return deptList;
}
}
2.Dao层
代码如下(示例):
@Repository
public class DeptDaoImpl implements DeptDao {
@Override
public List<String> queryDeptList(){
//代码
}
}
注意1:声明bean的时候,可以通过注解的value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
注意2:使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller。
二、DI详解
如果在IOC容器中,存在多个相同类型的bean对象,会出现什么情况呢?
控制台报错!!!需要一个bean,但是找到两个!!!
那我们如何解决呢???
Spring提供了以下几种解决方案:
-
@Primary
-
@Qualifier
-
@Resource
方案一:使用@Primary注解
当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。
@Primary
@Service
public class DeptServiceImpl implements DeptService {
}
方案二:使用@Qualifier注解
指定当前要注入的bean对象。 在@Qualifier的value属性中,指定注入的bean的名称。 @Qualifier注解不能单独使用,必须配合@Autowired使用
@RestController
public class DeptController {
@Qualifier("deptServiceImpl")
@Autowired
private DeptService deptService;
方案三:使用@Resource注解
是按照bean的名称进行注入。通过name属性指定要注入的bean的名称。
@RestController
public class DeptController {
@Resource(name = "deptServiceImpl")
private DeptService deptService;
三、面试题
@Autowird 与 @Resource的区别
-
@Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解
-
@Autowired 默认是按照类型注入,而@Resource是按照名称注入
新手上路不喜勿喷,各路大佬给点建议【抱拳】