依赖注入相关知识点

di(Dependency Injection):依赖注入

di:只需要在程序中提供要使用的对象名称就可以,至于对象如何在容器中创建,赋值,查找都由容器内部实现。
di的实现有两种:
1、在spring的配置文件中使用标签和属性完成叫做基于XML的di实现
2、使用spring中的注解,完成属性赋值,叫做基于注解的di实现
di的语法分类:
1、set注入(设值注入):spring调用类的set方法,在set方法中实现属性的赋值
80%左右使用的set注入
2、构造注入,spring调用类的有参构造方法创建对象,在构造方法中完成赋值。

一、基于XML的DI

(一)set注入(设值注入)(只要有set方法就可以)
(1)属性为简单类型的set注入
Spring配置文件:
在src/main/resource目录下:spring的配置文件大家公认名字是applicationContext.xml

实体类Student中:要有set方法
Spring配置文件:
在src/main/resource目录下:spring的配置文件大家公认名字是applicationContext.xml
<bean id=" " class=" ">
	<property name="属性名字" value="此属性的值"/>
	<property name="属性名字" value="此属性的值"/>
	<property name="属性名字" value="此属性的值"/>
	..............
</bean>
比如:
<bean id="myStudent " class="com.bjpowernode.ba01.Student ">
	<property name="name" value="李四"/>
	<property name="age" value="22"/>
</bean>
就是说创建了一个Student类型的对象,这个对象的名字叫做myStudent,这个对象的name属性值为李四,age属性值为22

注意:set注入,即使Student类中没有age属性,只要有setAge方法就可以使用
不论类是不是我们创建,比如java.util.Date日期类不是我们创建的,只要有set***方法就可以使用set注入
(2)属性为引用类型的set注入

实体类Student中,有三个属性和对应set方法,String name;int age;School school(引用类型)
spring配置文件中:
<bean id=" "  class=" ">
<property name="属性名字"   ref="bean的id(对象的名称)"/>
</bean>
<bean id=" ">
	<property name="   " value="   "/>
</bean>
比如:
<bean id="myStudent " class="com.bjpowernode.ba01.Student ">
	<property name="name" value="李四"/>
	<property name="age" value="22"/>
	<property name="school" ref="mySchool "/>
</bean>
声明school对象
<bean id="mySchool " class="com.bjpowernode.ba01.School ">
	<property name="name" value="北京大学"/>
	<property name="address" value="北京市海淀区"/>
</bean>

(二)构造注入:调用有参构造方法,在创建对象的同时初始化
(1)属性为简单类型和引用类型的构造注入
在spring配置文件中使用标签——见spring课堂笔记(Page13)
(2)引用类型属性自动注入
byname方式自动注入:java类中引用类型的属性名和spring容器中(配置文件)的id名称一样且数据类型是一致的
byname方式自动注入就是引用类型的属性名和标签的id名称一样且数据类型一样就可以了,其他什么都不需要写

语法:
<bean id=" "  class="  "  autowire="byName">
简单类型属性赋值
引用类型的不用写,自动注入了
</bean>
比如:
<bean id="myStudent "  class=" com.bjpowernode.ba01.Student "  autowire="byName">
<property name="name"  value="李四" />
<property name="age"  value="26" />
</bean>
声明school对象:注意id的名字要和student类中的属性名一致
<bean id="school "  class=" com.bjpowernode.ba02.School"  >
<property name="name"  value="清华大学" />
<property name="address"  value="北京市海淀区" />
</bean>
此时就会创建一个叫做myStudent的Student类型的对象,属性name的值为李四,属性为age的值为26,属性为school的值为清华大学,北京市海淀区

byType(按类型注入):java类中引用类型的数据类型和spring容器中(配置文件)的class属性是同源关系的,这样的bean能够赋值给引用类型
同源就是一类的意思:
1、java类中引用类型的数据类型和bean的class的值是一样
2、java类中引用类型的数据类型和bean的class的值是是父子类关系的
3、java类中引用类型的数据类型和bean的class的值是接口和实现类关系的
byType方式自动注入就是引用类型的数据类型和spring容器中(配置文件)的class属性是同源关系就可以了,其他什么都不需要写

语法:
<bean id=" "  class=" "  autowire="byType">
简单类型属性赋值
引用类型属性赋值不用写
</bean>
比如:
<bean id=" myStudent"  class=" com.bjpowernode.ba05.Student"  autowire="byType">
<property name="name" value="张飒"/>
<property name="age" value="26"/>
引用类型不用写
</bean>
声明School对象
<bean id=" mySchool"  class=" com.bjpowernode.ba02.School"  >
<property name="name" value="人民大学"/>
<property name="address" value="北京市海淀区"/>
<bean>
此时就会创建一个叫做myStudent的Student类型的对象,属性name的值为张飒,属性为age的值为26,属性为school的值为人民大学,北京市海淀区

注意:如果Student类中有两个School类型的属性,那么此时这两个属性的值都会被赋值为人民大学,北京市海淀区

二、基于注解的DI

使用注解的步骤:
1.加入maven的依赖 spring-context ,在你加入spring-context的同时会间接加入spring-aop的依赖。使用注解必须使用spring-aop依赖。

 <!--spring依赖-->
    <!--SSM整合的时候不需要加spring依赖,加上springmvc的依赖后就有spring了
    我没加的时候无法写组件扫描器,所以我加了-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>

2.在类中加入spring的注解(多个不同功能的注解)

@Component("myStudent")
public class Student{
...........
}
就相当于创建了一个叫做myStudent的Student类型的对象,这个对象在spring容器中

@Repository——放在dao的实现类上面,表示创建dao对象
@Service——放在service的实现类上面,表示创建service对象
@Controller——放在控制器(处理器)controller类上面,创建控制器对象,接收用户提交的参数,显示请求处理的结果
没有指定明确功能的类可以使用@Component
均可以使用value属性指定对象名称@Component(value=“myStudent”),value可以省略。如不指定由spring提供默认名称:类名的首字母小写
3.在spring的配置文件中,加入一个组件扫描器的标签,说明注解在你的项目中的位置

<!--组件扫描器,声明service的注解@service所在的包名位置-->
    <context:component-scan base-package="com.bjpowernode.service"/>
    <!--在这个包下完成service对象的创建工作-->

注意注意:
spring配置文件:声明service、dao、工具类等对象,service注解的组件扫描器也在spring配置文件中:

<!--组件扫描器,声明service的注解@service所在的包名位置-->
    <context:component-scan base-package="com.bjpowernode.service"/>
    <!--在这个包下完成service对象的创建工作-->

springmvc配置文件:声明controller和其他web相关的对象,controller注解的组件扫描器写在springmvc配置文件中:

<!--组件扫描器,声明Controller的注解@controller所在的包名位置-->
    <context:component-scan base-package="com.bjpowernode.controller"/>

(1)属性为简单类型的注入

语法:1、在属性定义的上面加上@Value,无需set方法,推荐使用
		   2、在set方法的上面加@Value
比如:
@Component("myStudent")
public class Student{
@Value(''李四')
private String name;
private Integer age;
@Value("30")
public void setAge(Integer age){
System.out.println("setAge:" +age);
this.age=age;
    }
}
此时就会生成一个名为myStudent的Student类型的对象,属性name值为李四,属性为age值为30

(2)属性为引用类型的注入
引用类型使用@Autowired:spring框架提供的注解,实现引用类型的赋值
spring中通过注解给引用类型赋值,使用的是自动注入原理,支持byName、byType
@Autowired:默认使用的是byType自动注入

语法:1、在属性定义的上面@Autowired,无需set方法,推荐使用
			2、在set方法的上面@Autowired
比如:
@Autowired
private School school
再使用注解创建一个school对象
在spring配置文件中加组件扫描器时,如果两个加注解的类不在同一个包中,可以加多个组件扫描器,指定不同的包

@Autowired:默认使用的是byType自动注入。
如果要使用byName方式,需要做的是:
1.在属性上面加入@Autowired
2.在属性上面加入@Qualifier(value=“bean的id”) :表示使用指定名称的bean完成赋值。value=“bean的id”,value可以省略。
注意注意:bean的id就是school对象的名称,可以在spring的配置文件中使用标签和属性完成school对象的创建和赋值也可以使用spring中的注解,完成对象创建和属性赋值
JDK注解@Resource自动注入,@resource注解是jdk中的,不是spring中的

语法:1、在属性定义的上面@Resource,无需set方法,推荐使用
			2、在set方法的上面@Resource
比如:
@Resource
private School school;
然后使用注解的方式创建一个school类型的对象

@Resource默认使用的是byName,先使用byName自动注入,如果byName赋值失败,再使用byType
如果想要让@resource只使用byname方式,需要增加一个属性name

语法:
@Resource(name="mySchool")
private School school
再创建一个叫做mySchool的School类型的对象

注解和xml配置文件的比较:
如果经常改动就是用xml配置文件,但是xml代码量大
如果不经常改动就使用注解,而且注解可以直观地看到属性的值,但是注解和代码写在一起看起来比较乱
补充:
注解中可以使用${}来使用配置文件中的内容

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值