18 @Autowired 实现根据类型实现自动装配

BookServlet

1
2
3
4
5
6
7
8
9
10
@Controller
public class BookServlet {
@Autowired
private BookService bookService;
public void saveBook(){

System.out.println("调用Servlet...");
bookService.saveBook();
}
}

BookService

1
2
3
4
5
6
7
8
9
10
@Service
public class BookService {
@Autowired
private BookDao bookDao;
public void saveBook(){
System.out.println("调用service....");
bookDao.saveBook();
}
}

BookDao

1
2
3
4
5
6
7
8
9
@Repository()
//@Scope("prototype")
public class BookDao
{
public void saveBook(){
System.out.println("调用DAO,保存了一本图书");
}
}

XML

1
<context:component-scan base-package="com.runsstudio" use-default-filters="true"></context:component-scan>

调用Servlet…
调用service….
调用DAO,保存了一本图书

只需要@Autoware 然后就再也不需要new啦!

Autoware原理:

@Autowired 首先看属性的类型,比如说

1
2
@Autowired
private BookDao bookDao;
  1. 首先找到对应组件。对应的java代码是ioc.getBean(BookService);

  2. 如果没找到,抛出No such bean exception

  3. 如果找到多个(比如说有继承关系的子类),继续找,顺序是:

    1. 成员变量名作为id继续匹配

      1. 匹配上?装配
      2. 没有匹配?报错:原因是按照变量名作为ID继续匹配的 可以使用@Qualifier(“”)指定一个新名字作为ID避免成员变量名作为id继续匹配,找不到时候的报错!
-------------文章已结束~感谢您的阅读-------------
穷且益坚,不堕青云之志。