Spring IOC 和 DI 详解(面试常考)

什么是Spring IOC 和 DI 呢?


IOC呢,其实就是Spring提供的一种机制,他是一个容器,可以用来存储对象。从而实现控制反转。而DI是依赖的注入,可以把对象从Spring中注入进来,通过@Autowired注解。

控制反转:以ioc为例子,我们在写java项目的时候,创建对象需要自己手动new()一个出来,这是的控制权在你自己手里,而通过注解的方式,使对象交给Spring管理,此时呢这种就是控制反转。

那有什么好处呢?

在写项目的时候,我们可以避免大量创建对象的操作,直接用注解的方式交给Spring管理,再通过注解将对象取出。使项目管理更加的方便。


IOC的五大注解


(1)@Controller


@Controller注解呢,故名思意,其实就是字面的含义,他主要是用来将,Controller层的对象交给Spring管理。

如代码:

复制代码
@RequestMapping("/book")
@RestController
public class BookController {

    @RequestMapping("/getListByPage")
    public Result<PageResult<BookInfo>> getListByPage(RequestPage requestPage , HttpSession session){
        log.info("requestPage接收到的参数 : {} ," , requestPage);
        //参数校验,用户是否登入.
        UserInfo userInfo = (UserInfo)session.getAttribute(Constants.USER_SESSION_KEY);
        if(userInfo == null){
            return Result.nologin();
        }
        PageResult<BookInfo> result = bookService.getLsitByPage(requestPage);
        return Result.success(result);
    }
}

如上图所表示的,这里我们是使用了,@RestController这样一个注解,其实这个注解包括了@Controller注解,这里我们就可以把controller层的对象交给Spring管理。


(2)@Service

这里的@Service注解也是,在service层使用的注。

如代码:

复制代码
@Service
public class BookService {
    @Autowired
    private BookMapper bookMapper;

    public Integer addBook(BookInfo bookInfo) {
        return bookMapper.intsertBook(bookInfo);
    }
}

这里呢,我们直接使用@Service注解直接将对象交给Spring管理。


(3)@Repository,@Component,@Configuration

上面三个注解,用法都和前面两个一样。

1)@Repository用于仓库存储。

2)@Component用于组件存储。

3)@Configuration用于配置存储。

这里呢@Component 是⼀个元注解,也就是说可以注解其他类注解,如 @Controller ,@Service @Repository 等。这些注解被称为 @Component 的衍生注解。


DI


关于依赖注入,Spring也给我们提供了三种方式:

1. 属性注入。

2. 构造方法注入。

3. Setter方法注入。


(1)属性注入

如代码:

复制代码
public class BookController {

    @Autowired
    private BookService bookService;
}

直接在类的属性上加上@Autowired即可,此时我们就可以拿到service层的bookService对象。


(2)构造方法注入

如代码:

java 复制代码
public class UserController2 {
 //注⼊⽅法2: 构造⽅法 
 private UserService userService;

 @Autowired
 public UserController2(UserService userService) {
     this.userService = userService;
 }
}

直接在构造方法上加上@Autowired即可。


(3)Set方法注入

如代码:

java 复制代码
public class UserController3 {
 //注⼊⽅法3: Setter⽅法注⼊ 
 private UserService userService;

 @Autowired
 public void setUserService(UserService userService) {
     this.userService = userService;
 }
}

直接在set方法上加上@Autowired即可。


一定要注意,只有将对象交给Spring管理,才可以对对象进行依赖注入。

相关推荐
寻星探路15 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧18 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法18 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty72519 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎19 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄19 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿19 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds19 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹19 小时前
【Java基础】多态 | 打卡day2
java·开发语言
Re.不晚19 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言