目录
1.3.2 举例2:java.io.File对象的有参构造方法注入
1.5.2 在总的Spring配置文件中使用标签导入其他分配置文件-1
1.5.2 在总的Spring配置文件中使用标签导入其他分配置文件-2
3.1.2 方式2:使用分隔符指定 base-package 的值
3.1.3 方式3:base-package 是指定到父包名
3.2 定义 java Bean 的注解@Component (掌握)
3.2.1 同时需要在 spring.xml 文件中配置组件扫描器, 该组件扫描器会扫描被注解的类,同时创建对象
3.3 Spring 还提供了另外3个创建对象的注解: @Repository/@Service/@Controller /@Component
3.5 引用类型属性注入-1: @Autowired是byType自动注入的(掌握)
3.6 引用类型属性注入-2: @Autowired与@Qualifier组合使用是byName自动注入的(掌握)
3.8 使用注解自动创建javaBean与 在XML文件中配置javaBean 的对比
3.8.1 使用注解自动创建javaBean的方式:bean对象的属性不经常改变的用xml方式
3.8.2 使用XML方式自动创建javaBean的方式:bean对象的属性经常改变的用xml方式
1、基于 XML 的 DI
1.1 注入分类:setter方法注入+构造方法注入
(1)bean 实例,Spring容器先通过调用无参构造器创建对象后,然后才对 bean 对象的属性进行初始化。
(2)初始化,是由Spring容器自动完成的,称为注入。
(3)根据注入方式的不同,常用的有两类:setter方法 注入、构造方法注入。
1.2 注入分类:setter方法注入(掌握)
set方法注入也叫设值注入,是指通过 setter 方法传入被调用者的实例。这种注入方式简单、直观,因而在 Spring 的依赖注入中大量使用。
1.2.1 简单类型的setter方法注入
1.2.2 引用类型的setter方法注入
当指定 bean 的某属性值为另一 bean 的实例时,通过 ref 指定它们间的引用关系,ref 的值必须为某 bean 的 id 值。
注意:对于其它 Bean 对象的引用,使用<bean/>标签的 ref 属性。
1.3 注入分类:构造方法注入(理解)
构造方法注入,是指Spring容器在构造调用者实例的同时,完成被调用者的实例化。即:使用java对象的有参构造器设置依赖关系。
1.3.1 举例1:普通java对象的有参构造方法注入
<constructor-arg /> 标签中用于指定参数的属性有:
(1)name:指定参数名称。
(2)index:指明该参数对应着构造器的第几个参数,从 0 开始。不过,该属性不要也行,但要注意,若参数类型相同,或之间有包含关系,则需要保证赋值顺 序要与构造器中的参数顺序一致。
1.3.2 举例2:java.io.File对象的有参构造方法注入
使用构造注入创建一个系统类 File 对象。
1.4 引用类型属性自动注入
(1)对于引用类型属性的注入,也可不在配置文件中显示的注入,可以通过为 <bean/> 标签设置 autowire 属性值,为引用类型属性进行隐式自动注入(默认是不自动注入引用类型属性)。
(2)根据自动注入判断标准的不同,可以分为两种:autowire = byName:根据bean的名称自动注入。autowire = byType:根据bean的类型自动注入。
1.4.1 引用类型属性:byName方式自动注入
当配置文件中被调用者 bean 的 id 值与代码中调用者 bean 类的引用类型的属性名相同时,可使用 byName 方式,让容器自动将被调用者 bean 注入给调用者 bean。
容器是通过调用者的 bean 类的属性名与配置文件的被调用者 bean 的 id 进行比较而实现自动注入的。
1.4.2 引用类型属性:byType方式自动注入
使用 byType 方式自动注入,要求:配置文件中被调用者 bean 的 class 属性指定的类,要与代码中调用者 bean 类的某引用类型属性类型同源:即 要么相同,要么有 is-a 关系(子类或是实现类)。
注:但这样的同源的被调用 bean 只能有一个,多于一个,容器就不知该匹配哪一个了。
1.5 为应用指定多个 Spring 配置文件
在实际应用里,随着应用规模的增加,系统中 Bean 数量也大量增加,导致配置文件变得非常庞大、臃肿。为了避免这种情况的产生,提高配置文件的可读性与可维护性,可以将 Spring 配置文件分解成多个配置文件。包含关系的配置文件:多个配置文件中有一个总文件,总配置文件将各其它子文件通过 <import /> 引入。
在 Java 代码中只需要使用总配置文件对Spring容器进行初始化即可。
举例:
1.5.1 代码结构
1.5.2 在总的Spring配置文件中使用<import/>标签导入其他分配置文件-1
1.5.2 在总的Spring配置文件中使用<import/>标签导入其他分配置文件-2
注意:也可使用通配符 * 来标识匹配任意字符。但是,此时要求父配置文件名不能满足 * 所能匹配的格式,否则将出现循环递归包含。
就本例而言,父配置文件不能匹配 spring- *.xml 的格式,也即 不能起名为 spring-total.xml。
1.5.3 测试
2、Spring总结,见博客最后
3、基于注解的 DI
对于 DI 使用注解,将不再需要在 Spring 配置文件中声明 bean 实例。 Spring 中使用注解,需要在原有 Spring 运行环境基础上再做一些改变。
需要在 Spring 配置文件中配置组件扫描器 <context:component-scan base-package=" "/>,用于在指定的基本包中扫描注解。
3.0 spring.xml 配置文件示范
3.1 当项目中有多个包时, 指定多个扫描包的三种方式
3.1.1 方式1:使用多个 <context:component-scan base-package=" " /> 指定不同的包路径
3.1.2 方式2:使用分隔符指定 base-package 的值
分隔符可以使用逗号(,)、分号( ; )、还可以使用 空格,不建议使用空格。
3.1.3 方式3:base-package 是指定到父包名
base-package 的值表是基本包,容器启动会扫描包及其子包中的注解,当然也会扫描到子包下级的子包。所以 base-package 可以指定一个父包就可以。
但不建议使用顶级的父包,扫描的路径比较多,导致容器启动时间变慢。指定到目标包和合适的,也就是注解所在包全路径。例如注解的类在 com.bjpowernode.beans 包中。
3.2 定义 java Bean 的注解@Component (掌握)
需要在类上使用注解 @Component,该注解的 value 属性用于指定该 bean 的 id 值。
3.2.1 同时需要在 spring.xml 文件中配置组件扫描器, 该组件扫描器会扫描被注解的类,同时创建对象
3.2.2 测试注解
3.3 Spring 还提供了另外3个创建对象的注解: @Repository/@Service/@Controller /@Component
另外,Spring 还提供了 3 个创建对象的注解:
(1)@Repository :用于对 DAO 实现类进行注解。
(2)@Service:用于对 Service 实现类进行注解。
(3)@Controller:用于对 Controller 实现类进行注解。
这三个注解与 @Component 都可以创建对象,但这三个注解还有其他的含义:
@Service 创建业务层对象,业务层对象可以加入事务功能, @Controller 注解创建的对象可以作为处理器接收用户的请求。
@Repository,@Service,@Controller 是对@Component 注解的细化,标注不同层的对象,即持久层对象,业务层对象,控制层对象。
@Component 不指定 value 属性,bean 的 id 是类名的首字母小写。
3.4 简单类型属性注入 @Value (掌握)
需要在属性上使用注解 @Value,该注解的 value 属性用于指定要注的值。使用该注解完成属性注入时,类中无需 setter。当然,若属性有 setter, 则也可将其加到 setter 上。
举例:
3.5 引用类型属性注入-1: @Autowired是byType自动注入的(掌握)
需要在引用属性上使用注解 @Autowired,该注解默认使用 按类型自动装配 Bean 的方式。使用该注解完成属性注入时,类中无需 setter。当然,若属性有 setter, 则也可将其加到 setter 上。
举例:
3.6 引用类型属性注入-2: @Autowired与@Qualifier组合使用是byName自动注入的(掌握)
需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier 的 value 属性用于指定要匹配的 Bean 的 id 值。类中无需 set 方法,也可加到 set 方法上。
举例:
@Autowired 还有一个属性 required,默认值为 true,表示当匹配失败后,会终止程序运行。若将其值设置为 false,则匹配失败,将被忽略,未匹配的属性值为 null。
3.7 JDK注解 @Resource 自动注入 (掌握)
Spring 提供了对 jdk 中@Resource 注解的支持。@Resource 注解既可以按名称byName匹配 Bean,也可以按类型byType匹配 Bean,
默认是按名称byName注入,按名称不能注入 bean,则会按照类型byType的方式进行 Bean 的匹配注入。
使用该注解,要求 JDK 必须是 6 及以上版本。@Resource 可在属性上,也可在 set 方法上。
3.7.1 byType 注入引用类型属性
@Resource 注解若不带任何参数,默认采用按名称byName的方式注入,按名称不能注入 bean,则会按照类型byType的方式进行 Bean 的匹配注入。
举例:
3.8 使用注解自动创建javaBean与 在XML文件中配置javaBean 的对比
3.8.1 使用注解自动创建javaBean的方式:bean对象的属性不经常改变的用xml方式
优点是:方便;直观;高效(代码少,没有配置文件的书写那么复杂)。
弊端:以硬编码的方式写入到 Java 代码中,具有代码侵入性,修改是需要重新编译代码的。
3.8.2 使用XML方式自动创建javaBean的方式:bean对象的属性经常改变的用xml方式
优点是:配置和代码是分离的;在 xml 中做修改,无需编译代码,只需重启服务器即可将新的配置加载。
缺点是:编写麻烦,效率低,大型项目过于复杂。
4、Spring总结-IOC