在spring容器内拼凑bean叫做装配。装配bean的时候,需要告诉容器哪些bean以及容器如何使用依赖注入将它们配合在一起。

上下文定义文件的根元素是<beans>,<beans>中有很多<bean>

id不能重复,class要写全。

scope

prototype,singleton,request,session,global-session,

默认为singleton

使用原型bean会对性能产生影响。

特别强调一点,尽量使用scope=singleton,不要使用原型prototype,因为这样对我们的性能影响比较大。

实例化和销毁init-method destroy-method

有时候没有用init-method destroy-method,却使用了注解。如:

  1. @PostConstruct
  2. public void init(){
  3. System.out.println("我自己的init方法");
  4. }

可以注入任何东西,从基本类型到集合类,甚至可以是应用系统的bean。

②如何给集合类型注入值

java主要有几种集合:map set list / 数组

Collection col = new ArrayList()

col只能使用Collection本身有的方法,但是却可以调用被ArrayList实现了的方法。

set使用方法和list一样。

注入list和set。

list中可以注入许多相同的bean

set也可以,但是后面的会把前面的覆盖。

Department类

Employee类

数组的使用:

Depart类

  1. package com.hsp.collection;
  2.  
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.Set;
  6.  
  7. public class Department {
  8.  
  9. private String name;
  10. private String[] empName;
  11. private List<Employee> empList;
  12. private Set<Employee> empsets;
  13. private Map<String,Employee> empMaps;
  14. public Map<String, Employee> getEmpMaps() {
  15. return empMaps;
  16. }
  17. public void setEmpMaps(Map<String, Employee> empMaps) {
  18. this.empMaps = empMaps;
  19. }
  20. public Set<Employee> getEmpsets() {
  21. return empsets;
  22. }
  23. public void setEmpsets(Set<Employee> empsets) {
  24. this.empsets = empsets;
  25. }
  26. public List<Employee> getEmpList() {
  27. return empList;
  28. }
  29. public void setEmpList(List<Employee> empList) {
  30. this.empList = empList;
  31. }
  32. public String[] getEmpName() {
  33. return empName;
  34. }
  35. public void setEmpName(String[] empName) {
  36. this.empName = empName;
  37. }
  38. public String getName() {
  39. return name;
  40. }
  41. public void setName(String name) {
  42. this.name = name;
  43. }
  44. }

//Employee类

  1. package com.hsp.collection;
  2.  
  3. public class Employee {
  4.  
  5. private String name;
  6. private int id;
  7.  
  8. public int getId() {
  9. return id;
  10. }
  11.  
  12. public void setId(int id) {
  13. this.id = id;
  14. }
  15.  
  16. public String getName() {
  17. return name;
  18. }
  19.  
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. }

beans.xml配置文件

  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:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xmlns:mvc="http://www.springframework.org/schema/mvc"
  8.  
  9. xsi:schemaLocation="http://www.springframework.org/schema/beans
  10. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  11. http://www.springframework.org/schema/context
  12. http://www.springframework.org/schema/context/spring-context-3.2.xsd
  13. http://www.springframework.org/schema/aop
  14. http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
  15. http://www.springframework.org/schema/tx
  16. http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
  17. http://www.springframework.org/schema/mvc
  18. http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
  19. ">
  20.  
  21. <bean id="department" class="com.hsp.collection.Department">
  22. <property name="name" value="财务部">
  23. </property>
  24. <property name="empName"><!-- 数组 -->
  25. <list>
  26. <value>小明</value>
  27. <value>大明</value>
  28. <value>大大明</value>
  29. </list>
  30. </property>
  31. <!-- 给list注入值 -->
  32. <property name="empList">
  33. <list>
  34. <ref bean="emp1"/>
  35. <ref bean="emp2"/>
  36. <ref bean="emp1"/>
  37. <ref bean="emp2"/>
  38. <ref bean="emp1"/>
  39. <ref bean="emp2"/>
  40. </list>
  41. </property>
  42. <!-- 给set注入值 -->
  43. <property name="empsets">
  44. <set>
  45. <ref bean="emp1"/>
  46. <ref bean="emp2"/>
  47. <ref bean="emp1"/>
  48. <ref bean="emp2"/>
  49. <ref bean="emp1"/>
  50. <ref bean="emp2"/>
  51. </set>
  52. </property>
  53. <!-- 给map注入值 -->
  54. <property name="empMaps">
  55. <map>
  56. <entry key="1" value-ref="emp1" />
  57. <entry key="2" value-ref="emp2" />
  58. </map>
  59. </property>
  1. <!-- 给属性集合配置 -->
  2. <property name="pp">
  3. <props>
  4. <prop key="pp1">abcd</prop>
  5. <prop key="pp2">1234</prop>
  6. </props>
  7. </property>
  1. </bean>
  2. <bean id="emp1" class="com.hsp.collection.Employee">
  3. <property name="name" value="北京"/>
  4. <property name="id" value="1"/>
  5. </bean>
  6. <bean id="emp2" class="com.hsp.collection.Employee">
  7. <property name="name" value="天津"/>
  8. <property name="id" value="2"/>
  9. </bean>
  10. </beans>

③内部bean

  1. <bean id="foo" class="...Foo">
    <property name="emp">
      <!-- 第一方法引用 -->
      <ref bean='neibu'/>
  2. <bean id="neibu"><!-- 该bean只能在emp里面使用 -->
  3.  
  4. </bean>
  5. </property>
    </bean>

④继承配置

<property name="name" value="顺平"/>

name的值是类的属性名

public class Student

public class Graduate extends Student

在beans.xml文件中体现配置

  1. <!-- 配置一个学生对象 -->
  2. <bean id="student" class="com.hsp.inherit.Student">
  3. <property name="name" value="顺平"/>
  4. <property name="age" value="30"/>
  5. </bean>
  6. <!-- 配置graduate对象 -->
  7. <bean id="graduate" parent="student" class="com.hsp.inherit.Graduate">
  8. <!-- 如果自己配置属性name,age,则会替换从父对象继承的数据 -->
  9. <property name="name" value="小明"/>
  10. <property name="degree" value="学士"/>
  11. </bean>

就如同java里的子类继承父类一样,子类新增的东西会把父类的同名对象覆盖。

若bean的属性是集合类型,按如下处理

设置为null

<property name="name">

<null/>

</property>

思考:目前我们都是通过set方式给bean注入值,spring还提供了其他的方式注入值,比如通过构造函数注入值!

通过构造函数注入值

beans.xml关键代码

  1. <bean id="employee" class="com.hsp.constructor.Employee">
  2. <!-- 通过构造函数来注入值 -->
  3. <constructor-arg index="0" type="java.lang.String" value="大明"/>
  4. <!-- <constructor-arg index="1" type="int" value="123"/> -->
  5.  
  6. </bean>

set注入的确定是无法清晰表达哪些属性是必须的,哪些是可选的,构造注入的优势是通过构造强制依赖关系,不可能实例化不完全的或无法使用bean。

Spring IoC容器可以自动装配相互协作bean之间的关联关系。

自动装配有5种方式

自动装配bean的属性值

自动装配的原理:

autowire=byName:根据属性名自动装配。

比如正好发现有一个bean的id名叫做dog,

原理图:

(1)byName的用法,去匹配bean的id值与类属性名相同的bean

  1. <!-- 配置一个master对象 -->
  2. <bean id="master" class="com.hsp.autowire.Master" autowire="byName">
  3. <property name="name">
  4. <value>顺平</value>
  5. </property>
  6. </bean>
  7. <!-- 配置dog对象 -->
  8. <bean id="dog" class="com.hsp.autowire.Dog">
  9. <property name="name" value="小黄"/>
  10. <property name="age" value="3"/>
  11. </bean>

(2)byType

在没有匹配到的情况下才会去使用byType。寻找和属性类型相同的bean。

  1. <!-- 配置一个master对象 -->
  2. <bean id="master" class="com.hsp.autowire.Master" autowire="byType">
  3. <property name="name">
  4. <value>顺平</value>
  5. </property>
  6. </bean>
  7. <!-- 配置dog对象 -->
  8. <bean id="dog11" class="com.hsp.autowire.Dog">
  9. <property name="name" value="小黄"/>
  10. <property name="age" value="3"/>
  11. </bean>

(3)constructor:查找和bean的构造参数一致的或多个bean

使用了constructor,就去寻找是否有一个构造函数把dog接收到了,如果找到了就好。

  1. <bean id="master" class="com.hsp.autowire.Master" autowire="constructor">
  2. <property name="name">
  3. <value>顺平</value>
  4. </property>
  5. </bean>
  6. <!-- 配置dog对象 -->
  7. <bean id="dog11" class="com.hsp.autowire.Dog">
  8. <property name="name" value="小黄"/>
  9. <property name="age" value="3"/>
  10. </bean>

但是只能有一个构造函数。

建议:能不用自动装配就不要用自动装配,set注入就可以了。

(4)autodotect:(3)和(2)之间选一个方式。不确定性的处理与(3)和(2)一致。

(5)default-autowire="byName" 是写在 xsi:schemaLocation="">中的

  1. xsi:schemaLocation="http://www.springframework.org/schema/beans
  2. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  3. http://www.springframework.org/schema/context
  4. http://www.springframework.org/schema/context/spring-context-3.2.xsd
  5. http://www.springframework.org/schema/aop
  6. http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
  7. http://www.springframework.org/schema/tx
  8. http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
  9. http://www.springframework.org/schema/mvc
  10. http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
  11. " default-autowire="no" >

当你在<beans>指定了default-autowire后,所有的bean的默认的autowire就是指定的装配方式。

default-autowire默认是no.

(6)no:这是默认值。

spring学习(4)的更多相关文章

  1. spring 学习之 bean 的注入方式 property和constructor-arg的使用方式

    spring 学习之 bean 的注入方式 property和constructor-arg的使用方式. bean的注入方式: property 注入是: 通过setxx方法注入. construct ...

  2. Spring学习之AOP总结帖

    AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对组件(比如类)进行开发,然后对组件进行组 ...

  3. Spring学习之第一个AOP程序

    IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对 ...

  4. MyEclipse Spring 学习总结三 SpringMVC

    MyEclipse Spring 学习总结三 SpringMVC 一.SpringMVC原理 1.Springmvc 框架介绍 1)Spring 框架停工了构建Web应用程序的全功能MVC模块.Spr ...

  5. Spring学习 Ioc篇(一 )

    一直以来忙于项目的开发,Spring虽然不用,一直想系统地学习一下,想看看它的源码,都没有时间,这段时间比较充裕,就索性先把Spring学习下,熟悉各个功能再去探究它内部的实现.就从Ioc篇开始学习. ...

  6. Spring学习(三)——Spring中的依赖注入的方式

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

  7. Spring学习(二)——Spring中的AOP的初步理解[转]

      [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...

  8. 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展

    <Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...

  9. Spring学习8-Spring事务管理

      http://blog.sina.com.cn/s/blog_7ffb8dd501014e0f.html   Spring学习8-Spring事务管理(注解式声明事务管理) 标签: spring注 ...

  10. Spring学习之Ioc控制反转(1)

    开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------- ...

随机推荐

  1. C#中Lock静态字段和实例字段

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. hdu 1010 Tempter of the Bone 奇偶剪枝

      如果所给的时间(步数) t 小于最短步数path,那么一定走不到. 若满足t>path.但是如果能在恰好 t 步的时候,走到出口处.那么(t-path)必须是二的倍数. 关于第二种方案的解释 ...

  3. 机器学习5—logistic回归学习笔记

    机器学习实战之logistic回归 test5.py #-*- coding:utf-8 import sys sys.path.append("logRegres.py") fr ...

  4. 【PHP】富文本HTML过滤器:HTMLPurifier使用教程(防止XSS)

    在编程开发时安全问题是及其重要的,对于用户提交的数据要进行过滤,XSS就是需要重视的一点,先说一下什么是XSS,简单来说就是用户提交数据(例如发 表评论,发表日志)时往Web页面里插入恶意javasc ...

  5. ngnix 参考配置

    #user nobody; worker_processes ; #error_log logs/error.log; #error_log logs/error.log notice; #error ...

  6. java高级之信号灯Semaphore

    1.Semaphore概念 Semaphore是Java1.5之后提供的一种同步工具,Semaphore可以维护访问自身线程个数,并提供了同步机制.使用Semaphore可以控制同时访问资源的线程个数 ...

  7. android requestLayout()重新请求布局

    在应用中有时会遇到,例如你listView 的设置的高度为warp_content 自适应,listView下方有个TextView但如果你删了一个listView的item 我们希望下面的TextV ...

  8. zookeeper应用场景之配置文件同步

    p=2628">http://www.firefoxbug.net/?p=2628

  9. TensorFlow CNN 測试CIFAR-10数据集

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50738311 1 CIFAR-10 数 ...

  10. hdu 5381 The sum of gcd 2015多校联合训练赛#8莫队算法

    The sum of gcd Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T ...