Spring 入门 DI依赖注入(2)
(1)Spring中依赖注入如何理解?
所谓依赖注入简单来说就是给对象赋值,只不过这个过程是交给Spring容器来完成。
Spring容器就好比一个超级智能电饭锅,就像我们用这个智能电饭锅做菜,只要告诉电饭锅今晚这个饭需要什么配料,智能电饭锅就会自动帮我们添加配料,我们只需要启动电饭锅即可。
(2)依赖(Dependency injection)注入的好处?
可以解耦,完全面向接口编程,由Spring容器来注入实现类实例,不需要在代码中出现实现类的组件。
(3)常用注解简单介绍
注解: * 用来标识的 * 注解是用来标注类里的东西 * 注解不能单独存在,只能依附于类中的结构 * jdk中经常用的几种注解: @Target ElementType TYPE 类和接口 FIELD METHOD … 用于说明这个注解所标注的注解用在哪些地方 @Documented 是否出现在帮助文档 @Retention 作用范围 SOURCE 源代码 CLASS 源代码和class文件 RUNTIME 源代码、class文件、运行时 * 自定义注解 * 一个自定义注解必须有 @Target 说明这个注解标注在哪个部位 @Retention 说明注解的作用范围 * @interface 说明是一个注解类 * 注解类中可以有属性 String value(); * 注解解析器 用来解析标注在类上的注解
工作原理: 当spring容器启动的时候, ApplicationContext context = new ClassPathXmlApplicationContext("cn/itcast/spring0401/di/ annotation/applicationContext.xml"); spring容器会创建纳入spring容器管理的bean.分别为person和student; spring容器会解析配置文件,会解析到<context:annotation-config> </context:annotation-config>,会在纳入spring的bean范围内查找属性上是否存在 @Resource(name="student") * 如果存在: * 继续解析@Resource有没有name属性 * 如果没有name属性 就会在所属的属性上,把属性的名称解析出来。会让属性的名称和spring中的bean中的id 进行匹配,如果匹配成功,则把spring容器中相应的对象赋值给该属性 如果匹配不成功,则按照类型进行匹配 * @Resource有name属性 就会解析name属性的值,把这个值和spring容器中的bean的id进行匹配 * 如果匹配成功,则把spring容器中的相应的对象赋值给该属性 * 如果匹配不成功,则直接报错 * 如果不存在: 不做任何事情 xml和注解的写法: xml:书写比较麻烦,但是效率比较高 注解:书写比较简单,但是效率比较低 注解的写法只适合引用
<context:annotation-config></context:annotation-config> <bean id="person" name="code"> 原理: * 类扫描的注解解析器包含了依赖注入的注解解析器 * 原理: 当启动spring容器的时候, ApplicationContext context = new ClassPathXmlApplicationContext("cn/itcast/spring0401/ scan/applicationContext.xml"); spring容器会加载配置文件,并且解析配置文件,就会解析到 * 类扫描的注解解析器,会在base-package包及子包中扫描所有的类 * 检查类上是否有@Compontent注解 * 如果有 * @Compontent是否有value属性 * 没有value属性 则会把这个注解所在的类的类名的第一个字母变成小写,其余的不变当做bean的id * 如果有value属性 则value属性的值就是bean的id * 如果没有 * 类扫描注解解析完以后,所有的在base-package包及子包下的带有@Compontent注解的类就被纳入spring管理了 * 在纳入spring管理的类中扫描各个属性,看属性是否有@Resource,再根据这个注解的规则进行操作。 * 扫描的次数: * 根据base-package包及子包进行扫描 * 扫描纳入spring管理的所有的bean的属性 * 属性的name的值和bean中的id进行匹配
<context:component-scan base-package="cn.itcast.spring0401.scan"></context:component-scan>