本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.在 Spring 的 IOC 容器里配置 Bean

  1)在 xml 文件中通过 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="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5.  
  6. <!-- 配置bean -->
  7.  
  8. <!--配置bean
  9. class: bean 的全类名,通过反射的方式在IOC 容器中创建bean ,所以要求Bean 中必须有无参数的构造器
  10. id:标示容器中的bean,id唯一
  11. -->
  12.  
  13. <bean id="helloWord" class="com.jason.spring.beans.HelloWord">
  14. <property name="name" value="Spring"></property>
  15.  
  16. </bean>
  17.  
  18. </beans>

  

2.Spring 容器

  

  1)在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用.

  2)Spring 提供了两种类型的 IOC 容器实现.

    ① BeanFactory: IOC 容器的基本实现.

    ② ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口

    ③ BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身ApplicationContext 面向使用 Spring 框架的开发者几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory

    ④无论使用何种方式, 配置文件时相同的.

  3)ApplicationContext 接口

    ①  ApplicationContext 的主要实现类:

      > ClassPathXmlApplicationContext:从 类路径下加载配置文件

      > FileSystemXmlApplicationContext: 从文件系统中加载配置文件

    ②  ConfigurableApplicationContext 扩展于 ApplicationContext,新增加两个主要方法:refresh() 和 close(), 让 ApplicationContext 具有启动、刷新和关闭上下文的能力

     ③  ApplicationContext 在初始化上下文时就实例化所有单例的 Bean。

     ④  WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作

3.从 IOC 容器中获取 Bean(ApplicationContext API)

   

  1)getBean(String) :通过bean中的id 获取容器中的一个实例  推荐

  2)getBean(Class<T>):通过实例的类型从容器中获取一个实例

4.依赖注入的方式(属性注入方式)

  1)属性注入

    ① 属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象

    ② 属性注入使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值

    ③ 属性注入是实际应用中最常用的注入方式

  1. <bean id="helloWord" class="com.jason.spring.beans.HelloWord">
  2. <property name="name" value="Spring"></property>
  3. </bean>

  2)构造器注入

    ① 通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。

    ② 构造器注入在 <constructor-arg> 元素里声明属性, <constructor-arg> 中没有 name 属性

    

  1. <!-- 通过构造方法来配置bean 的属性 -->
  2. <bean id="car" class="com.jason.spring.beans.Car">
  3. <constructor-arg value="Audi" index="0"></constructor-arg>
  4. <constructor-arg value="xian" index="1"></constructor-arg>
  5. <constructor-arg value="50" index="2" type="int"></constructor-arg>
  6. </bean>
  7.  
  8. <!-- 使用构造器注入属性值可以指定参数的位置和参数的类型! 以区分重载的构造器 -->
  9. <bean id="car2" class="com.jason.spring.beans.Car">
  10. <constructor-arg value="Audi" type="java.lang.String"></constructor-arg>
  11. <constructor-arg value="xian" type="java.lang.String"></constructor-arg>
  12. <constructor-arg value="50" type="double"></constructor-arg>
  13. </bean>

  

  3)工厂方法注入(很少使用,不推荐)

5.属性配置细节

  1)字面值:可用字符串表示的值可以通过 <value> 元素标签或 value 属性进行注入

  2)基本数据类型及其封装类、String 等类型都可以采取字面值注入的方式

  1. <constructor-arg type="double">
  2. <value>50</value>
  3. </constructor-arg>

 

  3)若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来

  1. <constructor-arg type="java.lang.String">
  2. <value><![CDATA[<XIAN>]]></value>
  3. </constructor-arg>

   4)引用其它 Bean

    ① 组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能. 要使 Bean 能够相互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用

    ② 在 Bean 的配置文件中, 可以通过 <ref> 元素或 ref  属性为 Bean 的属性或构造器参数指定对 Bean 的引用

    

  1. <!-- 引用其他bean-->
  2. <bean id="person" class="com.jason.spring.beans.Person">
  3. <property name="name" value="Jason"></property>
  4. <property name="age" value="24"></property>
  5. <property name="car" ref="car2"></property>
  6.  
  7. <!-- <property name="car">
  8. <ref bean="car2"/>
  9. </property> -->
  10. </bean>

         ③ 也可以在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部 Bean

      >当 Bean 实例仅仅给一个特定的属性使用时, 可以将其声明为内部 Bean. 内部 Bean 声明直接包含在 <property> 或 <constructor-arg> 元素里, 不需要设置任何 id 或 name 属性

      >内部 Bean 不能使用在任何其他地方

  1. <!-- 引用其他bean-->
  2. <bean id="person" class="com.jason.spring.beans.Person">
  3. <property name="name" value="Jason"></property>
  4. <property name="age" value="24"></property>
  5.  
  6. <!-- 内部bean, 不能被外部使用,只能在内部使用-->
  7. <property name="car">
  8. <bean class="com.jason.spring.beans.Car">
  9. <constructor-arg value="Ford"></constructor-arg>
  10. <constructor-arg value="changan"></constructor-arg>
  11. <constructor-arg value="20" type="double"></constructor-arg>
  12.  
  13. </bean>
  14. </property>
  15. </bean>

    

    ④ 可以使用专用的 <null/> 元素标签为 Bean 的字符串或其它对象类型的属性注入 null 值

  1. <bean id="person2" class="com.jason.spring.beans.Person">
  2. <constructor-arg value="jason"></constructor-arg>
  3. <constructor-arg value="25"></constructor-arg>
  4. <constructor-arg><null/></constructor-arg>
  5. </bean>

    ⑤ 和 Struts、Hiberante 等框架一样,Spring 支持级联属性的配置:为级联属性赋值, 注意:属性需要先初始化后才可以为级联属性赋值,否则有异常,

  1. <bean id="person2" class="com.jason.spring.beans.Person">
  2. <constructor-arg value="jason"></constructor-arg>
  3. <constructor-arg value="25"></constructor-arg>
  4. <constructor-arg ref="car"></constructor-arg>
  5. 5 <property name="car.brand" value="xxxxxx"></property>
  6. </bean>

    ⑥ 集合属性(list,map,properties)

    >在 Spring中可以通过一组内置的 xml 标签(例如: <list>, <set><map>) 来配置集合属性.

    >配置 java.util.List 类型的属性, 需要指定 <list> 标签, 在标签里包含一些元素. 这些标签可以通过 <value> 指定简单的常量值,

         通过 <ref> 指定对其他 Bean 的引用. 通过<bean> 指定内置 Bean 定义. 通过 <null/> 指定空元素. 甚至可以内嵌其他集合.

    >数组的定义和 List 一样, 都使用 <list>

    >配置 java.util.Set 需要使用 <set> 标签, 定义元素的方法与 List 一样.

  1. <!-- 测试如何配置集合属性 -->
  2.  
  3. <bean id="person3" class="com.jason.spring.collection.Person">
  4. <property name="name" value="Mike"></property>
  5. <property name="age" value="30"></property>
  6. <property name="cars">
  7. <list>
  8. <ref bean="car"/>
  9. <ref bean="car2"/>
  10. </list>
  11. </property>
  12. </bean>

  

  1. public class Person {
  2.  
  3. private String name;
  4. private int age;
  5.  
  6. private List<Car> cars;
  7.  
  8. ///
  9. }

   > Java.util.Map 通过 <map> 标签定义, <map> 标签里可以使用多个 <entry> 作为子标签. 每个条目包含一个键和一个值.

   > 必须在 <key> 标签里定义

   > 因为键和值的类型没有限制, 所以可以自由地为它们指定 <value>, <ref>, <bean> 或 <null> 元素.

   > 可以将 Map 的键和值作为 <entry> 的属性定义: 简单常量使用 key 和 value 来定义; Bean 引用通过 key-ref 和 value-ref 属性定义

  1. <bean id="person4" class="com.jason.spring.collection.Person2">
  2. <property name="name" value="jason"></property>
  3. <property name="age" value="50"></property>
  4. <property name="cars">
  5. <map>
  6. <entry key="AA" value-ref="car"></entry>
  7. <entry key="BB" value-ref="car2"></entry>
  8. </map>
  9. </property>
  10. </bean>
  1. public class Person2 {
  2.  
  3. private String name;
  4. private int age;
  5.  
  6. private Map<String, Car> cars;
  7.  
  8. ///
  9. }

    

   > 使用 <props> 定义 java.util.Properties, 该标签使用多个 <prop> 作为子标签. 每个 <prop> 标签必须定义 key 属性.

  1. <!-- 配置properties属性值 -->
  2. <bean id="dataSource" class="com.jason.spring.collection.DataSource">
  3. <property name="properties">
  4. <!-- 使用props 和 prop 子节点来为Properties 属性赋值 -->
  5. <props>
  6. <prop key="user">root</prop>
  7. <prop key="password">1234</prop>
  8. <prop key="jdbcUrl">jdbc:mysql:///test</prop>
  9. <prop key="driverClass">com.myql.jdbc.Driver</prop>
  10. </props>
  11. </property>
  12. </bean>
  1. package com.jason.spring.collection;
  2.  
  3. import java.util.Properties;
  4.  
  5. public class DataSource {
  6.  
  7. private Properties properties;
  8.  
  9. public Properties getProperties() {
  10. return properties;
  11. }
  12.  
  13. public void setProperties(Properties properties) {
  14. this.properties = properties;
  15. }
  16.  
  17. @Override
  18. public String toString() {
  19. return "DataSource [properties=" + properties + "]";
  20. }
  21.  
  22. }

  

  注意:当多个对象同时引用同一个集合的时候。如何让集合提高重用性?

  解决方法:使用 utility scheme 定义集合

  >  使用基本的集合标签定义集合时, 不能将集合作为独立的 Bean 定义, 导致其他 Bean 无法引用该集合, 所以无法在不同 Bean 之间共享集合.

  >  可以使用 util schema 里的集合标签定义独立的集合 Bean. 需要注意的是, 必须在 <beans> 根元素里添加 util schema 定义

  1. <!-- 配置单例的集合bean,以供多个bean 进行引用,需要导入util 命名空间 -->
  2. <util:list id="cars">
  3. <ref bean="car"/>
  4. <ref bean="car2"/>
  5. </util:list>
  6.  
  7. <bean id="person5" class="com.jason.spring.collection.Person">
  8. <property name="name" value="jason"></property>
  9. <property name="age" value="30"></property>
  10. <property name="cars" ref="cars"></property>
  11. </bean>

  ⑦ 通过p命名空间,简化为bean的属性的赋值过程

  1. <!-- 通过p 命名空间为bean 的属性赋值,首先导入p命名空间,简化配置方式 -->
  2. <bean id="person6" class="com.jason.spring.collection.Person" p:age="30" p:name="jason" p:cars-ref="cars"></bean>

[原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间的更多相关文章

  1. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. [原创]java WEB学习笔记86:Hibernate学习之路-- -映射 n-n 关系,单向n-n,双向n-n

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. 学习笔记:CentOS7学习之二十:shell脚本的基础

    目录 学习笔记:CentOS7学习之二十:shell脚本的基础 20.1 shell 基本语法 20.1.1 什么是shell? 20.1.2 编程语言分类 20.1.3 什么是shell脚本 20. ...

  6. 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧

    目录 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧 25.1 Shell中的色彩处理 25.2 awk基本应用 25.2.1 概念 25.2.2实例演示 25.3 awk ...

  7. 学习笔记:CentOS7学习之二十四:expect-正则表达式-sed-cut的使用

    目录 学习笔记:CentOS7学习之二十四:expect-正则表达式-sed-cut的使用 24.1 expect实现无交互登录 24.1.1 安装和使用expect 24.2 正则表达式的使用 24 ...

  8. 学习笔记:CentOS7学习之二十三: 跳出循环-shift参数左移-函数的使用

    目录 学习笔记:CentOS7学习之二十三: 跳出循环-shift参数左移-函数的使用 23.1 跳出循环 23.1.1 break和continue 23.2 Shift参数左移指令 23.3 函数 ...

  9. 学习笔记:CentOS7学习之十九:Linux网络管理技术

    目录 学习笔记:CentOS7学习之十九:Linux网络管理技术 本文用于记录学习体会.心得,兼做笔记使用,方便以后复习总结.内容基本完全参考学神教育教材,图片大多取材自学神教育资料,在此非常感谢MK ...

  10. 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用

    目录 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用 16.1 LVM的工作原理 16.1.1 LVM常用术语 16.1.2 LVM优点 16.2 创建LVM的基本步骤 16.2 ...

随机推荐

  1. 【poj2828】Buy Tickets

    Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...

  2. [iOS-UI]给输入框添加清除按钮的代码

    UIButton *clearButton = [self.textField valueForKey:@"_clearButton"]; [clearButton setImag ...

  3. hbases索引技术:Lily HBase Indexer介绍

    Lily HBase Indexer 为hbase提供快速查询,他允许不写代码,快速容易的把hbase行索引到solr.Lily HBase Indexer drives HBase indexing ...

  4. 让Xcode的 stack trace信息可读

    让Xcode的 stack trace信息可读 昨天在写 iOS 代码的时候,调试的时候模拟器崩溃了.异常停在了如下整个 main 函数的入口处: int main(int argc, char *a ...

  5. Java读取Execl表格数据

    在前面提到用java代码新建一个Execl 表格并添加数据到表格中, 这次写了一个读取Execl表格数据并添加导数据库中的案列 给定对方一个Execl模板表格,如果导入的Execl表格和预订的表格不相 ...

  6. 行业集中度(Concentration Ratio)

    行业集中度是决定市场结构最基本.最重要的因素,集中体现了市场的竞争和垄断程度,经常使用的集中度计量指标有:行业集中率(CRn指数).赫尔芬达尔—赫希曼指数(Herfindahl-HirschmanIn ...

  7. zk回车事件

    private Textbox testTextB; testTextB.addEventListener(Events.ON_OK, new EventListener<Event>() ...

  8. ArcGIS AddIN之工具不可用

    AddIN做的工具,第一次打开时工具亮起(可用),第一次点击之后工具就灰掉(不可用) 原因:该工具没有找到响应函数 具体原因:之前做的好多工具,好多个项目,好多代码.现在统一放到一个项目中,一个工具条 ...

  9. js中if的另类实现

    偶然发现一篇有意思的博客<JS利用短路原理简写if语句>  利用&&短路来实现if的简写. 如 1==2&&a1=1,则后面的a1=1不会进行判断,1==1 ...

  10. 对struct和class使用大括号初始化的测试

    #include <iostream> using namespace std; struct struct1{ /* struct1(){ cout<<"this ...