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();
* 注解解析器
用来解析标注在类上的注解


(4)Spring依赖注入方式?
1.xml 配置 2.通过注解

(5)依赖注入注解解析器

工作原理:
当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" class="cn.itcast.spring0401.di.annotation.Person"></bean>
<bean id="s" class="cn.itcast.spring0401.di.annotation.Student"></bean>


(6).类扫描的注解解析器
   		原理:
* 类扫描的注解解析器包含了依赖注入的注解解析器
* 原理:
当启动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>

(5)spring 继承关系
问题:在spring中,如果对一个类的父类注入了初始值,其子类能否直接继承这个值呢?
Spring默认其子类不能继承父类的注入值,需要加入parent属性,明确类之间的继承关系
Person类:

public class Person {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public void say() {
System.out.println(this.name);
}

}


Student类:

public class Student extends Person {



}


未在子类加入parent明确继承关系前,xml配置:

<bean id="person" class="cn.com.hsbc.domin.Person">
<property name="name">
<value>aaa</value>
</property>
</bean>
<bean id="student" class="cn.com.hsbc.domin.Student" ></bean>

测试类:

public class ExtendsTest {
@Test
public void tsetExtends() {
ApplicationContext ac = new ClassPathXmlApplicationContext(
"classpath:spring/application-config.xml");
Student stu = (Student) ac.getBean("student");
System.out.println(stu);
stu.say();

}

}

测试结果:
此时name输出null,说明student并没有用到父类注入的值
[img]http://dl2.iteye.com/upload/attachment/0093/6189/a6be907c-37e4-3107-b274-e82a71bc9cf8.png[/img]

加入parent属性,明确继承关系后,XML配置如下:

<bean id="person" class="cn.com.hsbc.domin.Person">
<property name="name">
<value>aaa</value>
</property>
</bean>
<bean id="student" class="cn.com.hsbc.domin.Student" parent="person"></bean>

输出结果:

[img]http://dl2.iteye.com/upload/attachment/0093/6191/b25f963a-9e7a-3e31-a3ba-c1d20528027d.png[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值