订阅
纠错
加入自媒体

解析Spring核心技术IoC、AOP

2021-06-15 09:51
动力节点
关注

B、引用类型

当指定bean 的某属性值为另一bean 的实例时,通过ref 指定它们间的引用关系。ref 的值必须为某bean 的 id 值。

对于其它Bean 对象的引用,使用<bean/>标签的ref 属性

测试方法:

(2) 构造注入(理解)

构造注入是指,在构造调用者实例的同时,完成被调用者的实例化。即, 使用构造器设置依赖关系。

举例 1:

<constructor-arg />标签中用于指定参数的属性有:

name:指定参数名称。

index:指明该参数对应着构造器的第几个参数,从 0 开始。不过,该属性不要也行,但要注意,若参数类型相同,或之间有包含关系,则需要保证赋值顺序要与构造器中的参数顺序一致。

举例 2:

使用构造注入创建一个系统类 File 对象

测试类:

       引用类型属性自动注入

对于引用类型属性的注入,也可不在配置文件中显示的注入。可以通过为<bean/>标签设置autowire 属性值,为引用类型属性进行隐式自动注入(默认是不自动注入引用类型属性)。根据自动注入判断标准的不同,可以分为两种:

byName:根据名称自动注入

byType: 根据类型自动注入

(1) byName 方式自动注入

当配置文件中被调用者bean 的id 值与代码中调用者bean 类的属性名相同时,可使用byName 方式,让容器自动将被调用者bean 注入给调用者bean。容器是通过调用者的bean 类的属性名与配置文件的被调用者bean 的id 进行比较而实现自动注入的。

举例:

(2)byType 方式自动注入

使用byType 方式自动注入,要求:配置文件中被调用者 bean 的class 属性指定的类,要与代码中调用者bean 类的某引用类型属性类型同源。即要么相同,要么有 is-a 关系(子类,或是实现类)。但这样的同源的被调用bean 只能有一个。多于一个,容器就不知该匹配哪一个了。

举例:

       为应用指定多个 Spring 配置文件

在实际应用里,随着应用规模的增加,系统中Bean 数量也大量增加,导致配置文件变得非常庞大、臃肿。为了避免这种情况的产生,提高配置文件的可读性与可维护性,可以将 Spring 配置文件分解成多个配置文件。

包含关系的配置文件:

多个配置文件中有一个总文件,总配置文件将各其它子文件通过<import/>引入。在Java 代码中只需要使用总配置文件对容器进行初始化即可。

举例:

代码:

Spring 配置文件:

也可使用通配符*。但,此时要求父配置文件名不能满足*所能匹配的格式,否则将出现循环递归包含。就本例而言,父配置文件不能匹配 spring-*.xml 的格式,即不能起名为spring-total.xml。

       基于注解的 DI

举例:di-annotation 项目

对于 DI 使用注解,将不再需要在 Spring 配置文件中声明bean 实例。Spring 中使用注解,需要在原有 Spring 运行环境基础上再做一些改变。

需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。

指定多个包的三种方式:

1) 使用多个context:component-scan 指定不同的包路径

2) 指定 base-package 的值使用分隔符

分隔符可以使用逗号(,)分号(;)还可以使用空格,不建议使用空格。

逗号分隔:

分号分隔:

3) base-package 是指定到父包名

base-package 的值表是基本包,容器启动会扫描包及其子包中的注解,当然也会扫描到子包下级的子包。所以base-package 可以指定一个父包就可以。

或者最顶级的父包

但不建议使用顶级的父包,扫描的路径比较多,导致容器启动时间变慢。指定到目标包和合适的。也就是注解所在包全路径。例如注解的类在com.bjpowernode.beans 包中

       定义Bean 的注解@Component(掌握)

需要在类上使用注解@Component,该注解的value 属性用于指定该bean 的 id 值。

举例:di01

另外,Spring 还提供了 3 个创建对象的注解:

@Repository 用于对DAO 实现类进行注解

@Service 用于对Service 实现类进行注解

@Controller 用于对Controller 实现类进行注解

这三个注解与@Component 都可以创建对象,但这三个注解还有其他的含义,@Service 创建业务层对象,业务层对象可以加入事务功能, @Controller 注解创建的对象可以作为处理器接收用户的请求。

@Repository,@Service,@Controller 是对@Component 注解的细化,标注不同层的对象。即持久层对象,业务层对象,控制层对象。

@Component 不指定value 属性,bean 的 id 是类名的首字母小写。

       简单类型属性注入@Value(掌握)

需要在属性上使用注解@Value,该注解的value 属性用于指定要注入的值。

使用该注解完成属性注入时,类中无需setter。当然,若属性有setter, 则也可将其加到setter 上。

举例:

       byType 自动注入@Autowired(掌握)

需要在引用属性上使用注解@Autowired,该注解默认使用按类型自动装配Bean 的方式。

使用该注解完成属性注入时,类中无需setter。当然若属性有setter,则也可将其加到setter上。

举例:

       byName 自动注入@Autowired 与@Qualifier(掌握)

需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier 的value 属性用于指定要匹配的Bean 的id 值。类中无需set 方法,也可加到set 方法上。

举例:

@Autowired 还有一个属性required,默认值为true,表示当匹配失败后,会终止程序运行。若将其值设置为false,则匹配失败,将被忽略,未匹配的属性值为null。

       JDK 注解@Resource 自动注入(掌握)

Spring 提供了对jdk 中@Resource 注解的支持。@Resource 注解既可以按名称匹配Bean,也可以按类型匹配Bean。默认是按名称注入。使用该注 解,要求JDK 必须是 6 及以上版本。@Resource 可在属性上,也可在set 方法上。

(1) byType 注入引用类型属性

@Resource 注解若不带任何参数,采用默认按名称的方式注入,按名称不能注入bean,则会按照类型进行Bean 的匹配注入。

举例:

(2) byName 注入引用类型属性

@Resource 注解指定其name 属性,则name 的值即为按照名称进行匹配的Bean 的 id。

举例:

       注解与 XML 的对比

注解优点是:

方便

直观

高效(代码少,没有配置文件的书写那么复杂)。

其弊端也显而易见:以硬编码的方式写入到Java 代码中,修改是需要重新编译代码的。

XML 方式优点是:

配置和代码是分离的

在xml 中做修改,无需编译代码,只需重启服务器即可将新的配置加载。xml 的缺点是:编写麻烦,效率低,大型项目过于复杂。

image.png

image.png

以上Spring全套视频|资料可私信/评论免费获取~~~

<上一页  1  2  3  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

人工智能 猎头职位 更多
扫码关注公众号
OFweek人工智能网
获取更多精彩内容
文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号