Spring4--课程笔记4

基于XML的DI(依赖注入):

  Bean 实例在调用无参构造器创建了空值对象后,就要对 Bean 对象的属性进行初始化。初始化是由容器自动完成的,称为注入。根据注入方式的不同,常用的有两类:设值注入、构造注入。还有另外一种,实现特定接口注入。由于这种方式采用侵入式编程,污染了代码,所以几乎不用。

  注入分类:

    (1) 设值注入:

      设值注入是指,通过 setXXX() 方法传入被调用者的实例。这种注入方式简单、直观,因而在 Spring 的依赖注入中大量使用。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="
 5         http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd">
 7
 8     <bean id="mySchool" class="com.tongji.di01.School">
 9         <property name="name" value="清华大学"/>
10     </bean>
11     <bean id="student" class="com.tongji.di01.Student">
12         <property name="name" value="张三"/>
13         <property name="age" value="23"/>
14         <property name="school" ref="mySchool"/>
15     </bean>
16 </beans>

    (2) 构造注入:

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

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="
 5         http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd">
 7
 8     <bean id="mySchool" class="com.tongji.di02.School">
 9         <property name="name" value="清华大学"/>
10     </bean>
11     <bean id="student" class="com.tongji.di02.Student">
12         <constructor-arg name="name" value="李四"/>
13         <constructor-arg name="age" value="24"/>
14         <constructor-arg name="school" ref="mySchool"/>
15
16         <!--<constructor-arg index="0" value="李四"/>
17         <constructor-arg index="1" value="24"/>
18         <constructor-arg index="2" ref="mySchool"/>
19         -->
20
21         <!--<constructor-arg value="李四"/>
22         <constructor-arg value="24"/>
23         <constructor-arg ref="mySchool"/>
24         -->
25
26     </bean>
27 </beans>

  

  命名空间注入:

    对于设值注入与构造注入,在配置文件中,除了使用<property/>或<constructor-arg/>标签外,还可使用命名空间注入的方式,让注入的值以<bean/>标签属性的方式出现。根据注入实现方式的不同,分为 p 命名空间注入与 c 命名空间注入。
       p 命名空间注入:采用设值注入方式,故需要有相应的 setXXX()
       c 命名空间注入:采用构造注入方式,故需要有相应的构造器

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:p="http://www.springframework.org/schema/p"
 5     xsi:schemaLocation="
 6         http://www.springframework.org/schema/beans
 7         http://www.springframework.org/schema/beans/spring-beans.xsd">
 8
 9     <bean id="mySchool" class="com.tongji.di03.School" p:name="北京大学"/>
10
11     <bean id="student" class="com.tongji.di03.Student" p:name="王五" p:age="25" p:school-ref="mySchool"/>
12
13 </beans> 
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:c="http://www.springframework.org/schema/c"
 5     xsi:schemaLocation="
 6         http://www.springframework.org/schema/beans
 7         http://www.springframework.org/schema/beans/spring-beans.xsd">
 8
 9     <bean id="mySchool" class="com.tongji.di04.School">
10         <property name="name" value="清华大学"/>
11     </bean>
12     <bean id="student" class="com.tongji.di04.Student" c:name="赵六" c:age="26" c:school-ref="mySchool"/>
13
14 </beans>

    注意添加的约束:xmlns:p="http://www.springframework.org/schema/p" 和 xmlns:c="http://www.springframework.org/schema/c"

 

  集合属性的注入:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="
 5         http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd">
 7
 8     <bean id="mySchool1" class="com.tongji.di05.School">
 9         <property name="name" value="清华大学"/>
10     </bean>
11     <bean id="mySchool2" class="com.tongji.di05.School">
12         <property name="name" value="北京大学"/>
13     </bean>
14
15     <bean id="some" class="com.tongji.di05.Some">
16         <property name="names">
17             <array>
18                 <value>张三</value>
19                 <value>赵四</value>
20                 <value>王五</value>
21             </array>
22         </property>
23         <property name="schools">
24             <list>
25                 <ref bean="mySchool1"/>
26                 <ref bean="mySchool2"/>
27             </list>
28         </property>
29         <property name="mySets">
30             <set>
31                 <value>中国</value>
32                 <value>上海</value>
33                 <value>黄渡理工大学</value>
34             </set>
35         </property>
36         <property name="myMap">
37             <map>
38                 <entry key="QQ" value="7654321"/>
39                 <entry key="Email" value="[email protected]"/>
40             </map>
41         </property>
42         <property name="myProes">
43             <props>
44                 <prop key="address">上海曹安公路</prop>
45                 <prop key="phone">123456778</prop>
46             </props>
47         </property>
48     </bean>
49 </beans>

  对域属性的自动注入:

    对于域属性的注入,也可不在配置文件中显示的注入。可以通过为<bean/>标签设置autowire 属性值,为域属性进行隐式自动注入。根据自动注入判断标准的不同,可以分为两种:
       byName:根据名称自动注入
       byType:根据类型自动注入
    byName:当配置文件中被调用者 Bean 的 id 值与代码中调用者 Bean 类的属性名相同时,可使用byName 方式,让容器自动将被调用者 Bean 注入给调用者 Bean。容器是通过调用者的 Bean类的属性名与配置文件的被调用者 bean 的 id 进行比较而实现自动注入的。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="
 5         http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd">
 7
 8     <bean id="school" class="com.tongji.di06.School">
 9         <property name="name" value="清华大学"/>
10     </bean>
11
12     <!-- byName方式域属性自动注入,要求自动注入的bean的id与被注入的属性名相同 -->
13     <bean id="student" class="com.tongji.di06.Student" autowire="byName">
14         <property name="name" value="张三"/>
15         <property name="age" value="23"/>
16     </bean>
17 </beans>

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

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="
 5         http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd">
 7
 8     <bean id="mySchool" class="com.tongji.di07.School">
 9         <property name="name" value="清华大学"/>
10     </bean>
11
12     <!-- byType方式域属性自动注入,要求容器中与被注入属性类型具有is-a关系的Bean,只能有一个 -->
13     <bean id="student" class="com.tongji.di07.Student" autowire="byType">
14         <property name="name" value="张三"/>
15         <property name="age" value="23"/>
16     </bean>
17 </beans>

  

  使用SPEL表达式注入:(需要进一步学习SPEL表达式)

    SPEL,Spring Expression Language,即 Spring EL 表达式语言。即,在 Spring 配置文件中为 Bean 的属性注入值时,可直接使用 SPEL 表达式计算的结果。SPEL 表达式以#开头,后跟一对大括号。用法:  <bean  id=“abc”   value=“#{…}”/>。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="
 5         http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd">
 7
 8     <bean id="person" class="com.tongji.di08.Person">
 9         <property name="pname" value="李四"/>
10         <property name="page" value="#{T(java.lang.Math).random() * 80}"/>
11     </bean>
12
13     <bean id="student" class="com.tongji.di08.Student">
14         <property name="name" value="#{person.pname}"/>
15         <property name="age" value="#{person.computeAge()}"/>
16     </bean>
17 </beans>

  

  使用内部 Bean 注入 :
    若不希望代码直接访问某个 bean,即,在代码中通过 getBean 方法获取该 Bean 实例, 则可将该 Bean 的定义放入调用者 bean 定义的内部

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="
 5         http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd">
 7
 8     <!--
 9     <bean id="mySchool" class="com.tongji.di09.School">
10         <property name="name" value="清华大学"/>
11     </bean>
12      -->
13
14     <bean id="student" class="com.tongji.di09.Student">
15         <property name="name" value="张三"/>
16         <property name="age" value="23"/>
17         <property name="school">
18             <bean class="com.tongji.di09.School">
19                 <property name="name" value="清华大学"/>
20             </bean>
21         </property>
22     </bean>
23 </beans>

  使用同类抽象 Bean 注入:
    当若干 Bean 实例同属于一个类,且这些实例的属性值又有相同值时,可以使用抽象Bean,以简化配置文件。
    抽象 Bean 是用于让其它 bean 继承的。这个 bean 在 Bean 类中是不能通过 getBean 方法获取的。设置 abstract 属性为 true 来指明该 bean 为抽象 bean,默认值为 false。不过,该 bean 不为抽象 bean 时,也可被继承。只不过,在应用中,用于被继承的 bean 一般为抽象 bean。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="
 5         http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd">
 7
 8     <!-- 同类抽象Bean -->
 9     <bean id="baseStudent" class="com.tongji.di10.Student" abstract="true">
10         <property name="school" value="清华大学"/>
11         <property name="department" value="计算机学院"/>
12     </bean>
13
14     <bean id="student1" parent="baseStudent">
15         <property name="name" value="张三"/>
16         <property name="age" value="23"/>
17     </bean>
18     <bean id="student2" parent="baseStudent">
19         <property name="name" value="李四"/>
20         <property name="age" value="24"/>
21     </bean>
22     <bean id="student3" parent="baseStudent">
23         <property name="name" value="王五"/>
24         <property name="age" value="25"/>
25     </bean>
26 </beans>

  使用异类抽象 Bean 注入:

    当若干不同的类对象具有相同的属性,且其值也相同时,可使用异类抽象 Bean。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="
 5         http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd">
 7
 8     <!-- 异类抽象Bean -->
 9     <bean id="Person" abstract="true">
10         <property name="school" value="清华大学"/>
11         <property name="department" value="计算机学院"/>
12     </bean>
13
14     <bean id="student" class="com.tongji.di11.Student" parent="Person">
15         <property name="name" value="张三"/>
16         <property name="age" value="23"/>
17     </bean>
18
19     <bean id="teacher" class="com.tongji.di11.Teacher" parent="Person">
20         <property name="name" value="李四"/>
21         <property name="workAge" value="24"/>
22     </bean>
23 </beans>

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

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

    (1) 以配置文件数组方式实现:将所有配置文件的路径定义为一个 String 数组,并将其作为容器初始化参数出现。其将与可变参的容器构造器匹配。

 1 package com.tongji.di12;
 2
 3 import org.junit.Test;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6
 7 public class MyTest {
 8
 9     @Test
10     public void test01() {
11         //创建容器
12         String resource1 = "com/tongji/di12/spring-base.xml";
13         String resource2 = "com/tongji/di12/spring-beans.xml";
14
15         String[] resources = {resource1, resource2};
16         @SuppressWarnings("resource")
17         ApplicationContext ac = new ClassPathXmlApplicationContext(resources);
18
19         Student student = (Student) ac.getBean("student");
20         System.out.println(student);
21
22         Teacher teacher = (Teacher) ac.getBean("teacher");
23         System.out.println(teacher);
24     }
25
26 }

    第12、13行的配置文件为并列关系,不分主次。

    (2) 以父子配置文件方式实现 :
      各配置文件中有一个总文件,总配置文件将各其它子文件通过<import/>引入。在 Java代码中只需要使用总配置文件对容器进行初始化即可。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="
 5         http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd">
 7
 8     <import resource="classpath:com/tongji/di13/spring-base.xml"/>  <!-- 注意classpath -->
 9     <import resource="classpath:com/tongji/di13/spring-beans.xml"/>  <!-- 也可使用通配符*。但,此时要求父配置文件名不能满足*所能匹配的格式,否则将出现循环递归包含 -->
10
11 </beans>
 1 package com.tongji.di13;
 2
 3 import org.junit.Test;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6
 7 public class MyTest {
 8
 9     @Test
10     public void test01() {
11         //创建容器
12         String resource = "com/tongji/di13/applicationContext.xml";
13
14         @SuppressWarnings("resource")
15         ApplicationContext ac = new ClassPathXmlApplicationContext(resource);
16
17         Student student = (Student) ac.getBean("student");
18         System.out.println(student);
19
20         Teacher teacher = (Teacher) ac.getBean("teacher");
21         System.out.println(teacher);
22     }
23
24 }
时间: 2024-10-07 09:50:00

Spring4--课程笔记4的相关文章

《nodejs+gulp+webpack基础实战篇》课程笔记(四)-- 实战演练

一.用gulp 构建前端页面(1)---静态构建 npm install gulp-template --save-dev 通过这个插件,我们可以像写后台模板(譬如PHP)一样写前端页面.我们首先学习一下写法. 现在我们创建一个新任务:创建一个裸的index.html文件,然后在body里面写上 ,我的年龄是:<%= age %> 下载好gulp-template,我们引用并配置 var gulp_tpl = require("gulp-template"); gp.tas

Linux操作系统及应用课程笔记 索引

第0部分  软件的安装与配置 Linux下软件的安装与配置 第1部分*   绪论 第2部分*  Linux的安装过程 第3部分   系统Shell和常用命令 Shell文件相关常用命令及参数总结 Linux下常用命令 第4部分  VI编辑器 Linux下vi编辑器的使用 <<学习vi和vim编辑器>>1 <<学习vi和vim编辑器>>2 第5部分  Shell脚本 Shell入门之脚本管理 Shell入门之测试操作 Shell入门之条件循环 Shell入门之

Andrew Ng机器学习课程笔记(五)之应用机器学习的建议

Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.html 前言 学习了Andrew Ng课程,开始写了一些笔记,现在写完第5章了,先把这5章的内容放在博客中,后面的内容会陆续更新! 这篇博客主要记录了Andrew Ng课程第五章应用机器学习的建议,主要介绍了在测试新数据出现较大误差该怎么处理,这期间讲到了数据集的分类,偏差,方差,学习曲线等概念,帮

JAVA课程笔记_1

一 课程内容 set path查看路径信息:当编译一个程序或命令时,先从当前目录查找,如果没有,按path中的路径按顺序查找,先找到后就不查找后面的路径了. 可以将目录加入环境变量,set path="复制的路径" 可以在.java程序中编写多个类,当编译时,每个类生成各自的字节码文件. 由于多个类的字节码文件不利于管理,使用bin目录下的jar命令可以将多个字节码文件打包成jar包发布给其他程序员使用. 使用方法:先在命令提示符下输入jar,会出现使用方法和实例.Jar打包两个cla

Django开发BBS---51网络课程笔记(目录)

这是51cto中bbs课程中的一个项目,这里写一下每节的目录: Django开发BBS---51网络课程笔记(1) 这部分主要介绍了数据库的搭建及站点管理 http://4440271.blog.51cto.com/4430271/1663863 Bootstrap开发 这不分主要讲前端的设计 http://4440271.blog.51cto.com/4430271/1663934 Django开发BBS---51网络课程笔记(2) 这部分主要讲view与前端的衔接部分 http://4440

跟我学《JavaScript高程3》第三讲,课程笔记

跟我学<JavaScript高程3> 第三讲:第4章 课程制作:bling,兴哥,5年Java,3年前端 课程知识:JavaScript.Html.Css 课程目标:前端体系课程,逐步深入,找到一份前端工作    课程大纲:本书目录结构 适合人群:前端初学者,可以0基础,但要认真,踏实 课程回顾 1.数据类型:5种基本类型,1中复杂类型. 2.操作符:需要注意运算优先级,算关逻条赋逗. 3.语句:if-else.for.for-in.while 4.函数:函数定义,目前的两种方法 补充:变量在

【课程笔记】需求挖掘与分析

*…* 产品定位与分析有三部分内容:需求分析.用户调研.市场分析. 下面是前两部分内容的课程笔记,整理成思维导图.

(转)妙味课堂—JavaScrip中级课程笔记

DOM基础概念.操作 DOM的概念及节点类型 childNodes children nodeType attributes 子节点和兄弟节点的操作 firstChild firstElementChild lastChild.lastElementChild nextSibling.previousSibling 父节点 parentNode offsetParent 元素位置宽高 offsetLeft.offsetTop offsetWidth.offsetHeight getPos() 操

Android网络项目课程笔记-----Volley框架

Volley 问题原因: Android4.x版本和2.x对AsyncTask的机制不同 2.x之中,同时执行5个,4.x同时只有一个 解决思路: 1) 使用Thread + Handler 注意: 使用线程池 2) 定制AsyncTask线程池 3) 开源框架Volley 1. 检查网络 2. 退出 3. 总结 有待改进 做的比较好的 商业级项目: 1) 稳定性   不要轻易FC    运行时异常 2) 用户体验:流畅(性能)/美观 3) 可扩展性 4) 可读性 5) 异常流程:提示 + 指导

Android网络项目课程笔记-----计划

目标:好用 充分:1) 角色完整 产品经理   灵魂 美工  交互设计师 开发   架构师 开发者 测试 小部分用户 2) 运营推广 基础:能用 必须: 1) API   框架 2) 模块(一个功能集合) * 3) 业务流程 4) bug 具备解决大部分中等难度bug的能力 5) 自学新技术的能力 6) 阅读代码 不合格:1) 做不了,有难度.需要很长时间 2) 只是做了,对过程负责.对结果不负责 3) 只是掌握了某个功能的基本实现方法,一旦出了bug, 解决效率很低 4) 没做过,没把握 合格