首页 专题 文章 代码 归档
基于@Autowired实现自动装配
2020.01.24 13:58 2020.01.25 18:54

1. 基于注解实现自动装配

之前我们基于xml时,要实现自动装配需要怎么做?加上AutoWired属性。

现在呢?我们使用@AutoWired注解即可。

2. @AutoWired

步骤1:我们首先新建3个类:BookController、BookService和BookDao

BookDao

package com.misiai.dao;


import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;

@Repository("Misiai")
@Scope(value = "prototype")
public class BookDao {

    public BookDao() {
        System.out.println("BookDao 的无参构造!");
    }

    public void save() {
        System.out.println("BookDao的save方法");
    }
}

BookController

package com.misiai.controller;

import com.misiai.service.BookService;
import org.springframework.stereotype.Controller;

@Controller
public class BookController {

    private BookService bookService;

    public void getBook() {

        bookService.save();
    }

}

BookService

package com.misiai.service;

import com.misiai.dao.BookDao;
import org.springframework.stereotype.Service;

@Service
public class BookService {

    private BookDao bookDao;
    public BookService() {
        System.out.println("BooKService无参构造!");
    }

    public void save() {
        System.out.println("BookService的save方法被调用 >>> 正在调用BookDao的save方法");
        bookDao.save();
    }

}

步骤2:

如果上面的代码完了,我们直接测试的话:

@Test
public void test02() {
    BookController bookController = ap.getBean("bookController", BookController.class);
    bookController.getBook();
}

结果:

截图-1579769599

毫无意外的会报空指针异常,因为全程我们都没有new一个对象,报错是必然的,那么怎么做?

给每一个需要new的变量加@AutoWired注解【前提是该变量的这个类型已经被spring管理了,即加到spring容器中了】

// ====>>>> BookService
@AutoWired
private BookDao bookDao;

// ====>>>> BookController
@AutoWired
private BookService bookService;

截图-1579769785

成功,全程我们没new一个对象,全交给容器管理!

Tips:

1、这就是spring的最最核心的地方,IOC(容器)和 DI (依赖注入)的配合使用! 我们学习spring,一定要明白IOC和AOP的作用,并合理使用它们!

2、注解方法和之前的基于xml配置的bean,并没有太大区别,所以之前遇到的问题,这里依然会有:bean的单、多实例问题;通过类型获取的bean,如果有同类型的多个实例在容器中,该如何办?这就是我们接下来该解决的!

本节阅读完毕! (分享
二维码图片 扫描关注我们哟