欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

不信你学不会Spring(3)——DI注入的使用

程序员文章站 2022-06-05 19:59:21
...

一、DI的分类

      创建对象的同时,需要对对象的属性进行初始化,这个过程称为注入。可以使用xml也可以使用注解实现注入,根据注入的方式不同,可以分为set注入和构造注入。

二、基于xml的注入

1.set注入

set注入在xml中的语法格式:

	<bean id = "自定义名1" class = “全类名1”>
		<!--简单类型为基本数据类型和string-->
		<property name = "简单类型字段名" value = “字段值”>

		<property name = "引用类型字段名" ref = “自定义名2”>
	</bean>
	
	<bean id = "自定义名2" class = “全类名2”>	
	</bean>

注意事项:
set注入,spring会根据<property>标签中的name属性,在类中找寻“set”+name方法,然后执行此方法。只要有此方法,没有对应属性或者set方法中不赋值也可以执行成功。

2.构造注入

构造注入在xml中的语法格式:

	<bean id = "工具人" class = “全类名”>	
	</bean>	
	
	<!--构造器注入第一种方式-->
	<bean id = "自定义名1" class = “全类名1”>
		<!--简单类型为基本数据类型和string-->
		<constructor-arg name = "构造器中形参名字" value = “字段值”>
		<constructor-arg name = "构造器中形参名字" ref = “工具人”>
	</bean>
	
	<!--构造器注入第二种方式-->
	<bean id = "自定义名2" class = “全类名1”>
		<!--简单类型为基本数据类型和string-->
		<constructor-arg index = "0" value = “字段值”>
		<constructor-arg index = "1" ref = “工具人”>
	</bean>
	
	<!--构造器注入第三种方式,按形参从左到右的位置注入-->
	<bean id = "自定义名3" class = “全类名1”>
		<!--简单类型为基本数据类型和string-->
		<constructor-arg  value = “字段值”>
		<constructor-arg  ref = “工具人”>
	</bean>

3.引用类型的自动注入

在bean标签中加入autowire属性,对于引用类型属性,无需再用<property>或<constructor>注入,可以实现自动注入。

	<bean id = "自定义名1" class = “全类名1” autowire = "byName">
		<property name = "简单类型字段名" value = “字段值”>
	</bean>
	
	<bean id = "引用类型的属性名" class = “全类名2”>	
	</bean>

autowire有两种方式:
(1)byName按名称注入,若配置文件中有<bean>的id名称和所需的引用类型的属性名一致,就把该bean对应的对象赋值给该引用类型属性。

(2)byType按类型注入,java类中引用类型属性的数据类型和spring容器中某个<bean>的class是同源关系(同类,父子类,接口与实现类),就能把这个bean赋值给引用类型的属性。

4.多配置文件

通过以下标签,可以将引入其他配置文件,使用其他配置文件中的bean

<import resourcr = "classpath:从resources开始的路径/xxxx.xml">

<!--引入properties,引入后在注解中可以使用${key}来替换为properties中对应的value-->
<context:property-placeholder location="class:xxx.properties">

三、基于注解注入

1.使用步骤

(1)首先需要有spring-aop依赖,应为之前加入了spring-context依赖,该依赖下就包含了spring-aop依赖。
(2)加入注解
(3)在配置文件中加入组件扫描器标签

2.组件扫描器

组件扫描器会自动扫描指定的包和其子包中的所有注解
<context:component-scan base-package="包名">

3.常用注解

(1)@Component(value = “等于bean标签的id”),放在类的上面,可以不设置value,value默认为类的首字母小写。和@Component类型的,有:@Repository(用在持久层类上面),@Service(用在业务层类上面),@Controller(用在控制器上面)。

(2)@Value(value = “”),直接放在属性上,无需set方法可以给简单类型赋值。如果放在set方法上,则是调用set方法给属性赋值。

(3)@Autowired,spring框架提供的注解,实现引用类型赋值,默认使用的是byType自动注入。可以放在属性上,也可以放在set方法上。
@Autowired注解配置@Qualifier(value = “”)一起使用可以实现byName注入。
@Autowired(required = false),required表示当自动注入失败,程序是否抛出异常,不屑默认为true。

(4)@Resource,是jdk自带的注解。默认是按名称注入,如果按名称不能注入,则会安装类型进行匹配注入。
@Resource(name = “”),这样写只会使用byName注入。


欢迎大家交流讨论,有错误请各位大佬指正