按照类型进行匹配
@Autowired
按照ID进行匹配
(spring中注解)@Autowired + @Qualifier(“student”) == (j2ee中注解)@Resource(name = “student”)
注解DI流程
* 1、启动spring容器
* 2、把spring配置文件中的bean实例化(person,student)
* 3、当spring容器解析配置文件
* <context:annotation-config></context:annotation-config>
* spring容器会在纳入spring管理的bean的范围内查找哪些类的属性上是否加有@Resource注解
* 4、如果在属性上找到@Resource注解
* 如果@Resource的注解的name属性的值为""
* 则把@Resource所在的属性的名称和spring容器中的id作匹配
* 如果匹配成功,则赋值(将bean中的创建类的对象赋值给@Resource所在的属性,完成依赖注入)
* 如果匹配不成功,则会按照类型进行匹配
* 如果匹配成功,则赋值,匹配不成功,报错
* 如果@Resource的注解的name属性的值不为""
* 则解析@Resource注解name属性的值,把值和spring容器中的ID进行匹配
* 如果匹配成功,则赋值
* 如果匹配不成功,则报错
*
* 说明:
* 注解代码越来越简单,效率越来越低
* 注解只能应用于引用类型
类扫描(好处:配置文件中行数变少了)
<!--
component
把一个类放入到spring容器中,该类也称为component
base-package 在指定的包及子包中扫描
-->
<context:component-scan
base-package="com.itheima11.spring.scan.annotation"></context:component-scan>
/**
* @Component("ss")
* ==
* <bean id="ss" class="..Student">
*
* @Component
* ==
* <bean id="student" class="..Student">
*
*/
@Component("student")
public class Student {
public void say(){
System.out.println("student");
}
}
类扫描流程
/**
* 1、启动spring容器
* 2、当spring容器解析到
* <context:component-scan
base-package="com.itheima11.spring.scan.annotation">
</context:component-scan>
会去base-package指定的包及子包中扫描所有的类
3、看哪些类上面是否加有@Component注解
如果该类上面有@Component注解
检查该注解的value属性是否为""
如果为"",则会把该注解所在的类的类名以这样的方式
@Component
public class Person{
}
==
<bean id="person" class="..Person">
如果不为"",则以这样的形式:
@Component("aa")
public class Person{
}
==
<bean id="aa" class="..Person">
4、扫描spring容器中所有的bean,进行@Resource规则
*/
更多典型化注解
@Controller @Service @ Repository 与@Component用法一样、
spring容器中xml的继承(parent)
<bean id=”student” class=”..Person” parent=”person”></bean>