一、构造方法注入

定义:通过构造函数来完成依赖关系的设定

优缺点:

在构造对象的同时,完成依赖关系的建立

如果关联的对象很多,那和不得不在构造方法上加入过多的参数

基中有index:如果指定索引从0开始,type用来指定类型

实体类:

  1. package com.pb.entity;
  2. /**
  3. * 班级类
  4. * @author Administrator
  5. *
  6. */
  7. public class Grade {
  8. private int id; //班级编号
  9. private String name; //班级名称
  10.  
  11. public Grade() {
  12. super();
  13. // TODO Auto-generated constructor stub
  14. }
  15.  
  16. public Grade(int id, String name) {
  17. super();
  18. this.id = id;
  19. this.name = name;
  20. }
  21.  
  22. public int getId() {
  23. return id;
  24. }
  25. public void setId(int id) {
  26. this.id = id;
  27. }
  28. public String getName() {
  29. return name;
  30. }
  31. public void setName(String name) {
  32. this.name = name;
  33. }
  34.  
  35. }
  1. package com.pb.entity;
  2. /**
  3. * 学生类
  4. * @author Administrator
  5. *
  6. */
  7. public class Student {
  8. private String name; //学生名称
  9. private Integer age; //学生年龄
  10. private Grade grade; //所属班级
  11.  
  12. public Student() {
  13. super();
  14. }
  15.  
  16. public Student(String name, Integer age, Grade grade) {
  17. super();
  18. this.name = name;
  19. this.age = age;
  20. this.grade = grade;
  21. }
  22.  
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. public Integer getAge() {
  30. return age;
  31. }
  32. public void setAge(Integer age) {
  33. this.age = age;
  34. }
  35. public Grade getGrade() {
  36. return grade;
  37. }
  38. public void setGrade(Grade grade) {
  39. this.grade = grade;
  40. }
  41.  
  42. }

使用构造方法注入

applicationContext.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" xmlns:p="http://www.springframework.org/schema/p"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
  5. <!--班级类 -->
  6. <bean id="grade" class="com.pb.entity.Grade">
  7. <!-- 使用构造方法注入 -->
  8. <constructor-arg>
  9. <value>1001</value>
  10. </constructor-arg>
  11. <constructor-arg>
  12. <value>计算应用一班</value>
  13. </constructor-arg>
  14.  
  15. </bean>
  16. <!--学生类 -->
  17. <bean id="student" class="com.pb.entity.Student">
  18. <!-- 使用构造方法注入 -->
  19. <constructor-arg>
  20. <value>张三</value>
  21. </constructor-arg>
  22. <constructor-arg>
  23. <value>23</value>
  24. </constructor-arg>
  25. <!-- 使用ref注入班级bean -->
  26. <constructor-arg ref="grade">
  27. </constructor-arg>
  28. </bean>
  29.  
  30. </beans>

测试类:

  1. package com.pb.demo;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. import com.pb.entity.Student;
  7.  
  8. public class Demo1 {
  9.  
  10. public static void main(String[] args) {
  11. ApplicationContext context = new ClassPathXmlApplicationContext(
  12. "applicationContext.xml");
  13. Student stu = context.getBean("student", Student.class);
  14. System.out.println("学生姓名:" + stu.getName() + "学生年龄:" + stu.getAge()
  15. + "学生班级编号: " + stu.getGrade().getId() + "学生班级名称: "
  16. + stu.getGrade().getName());
  17.  
  18. }
  19.  
  20. }

二、属性注入

其它不变只更改配置文件

applicationContext.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" xmlns:p="http://www.springframework.org/schema/p"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
  5. <!--班级类 -->
  6. <bean id="grade" class="com.pb.entity.Grade">
  7. <property name="id">
  8. <value>1001</value>
  9. </property>
  10. <property name="name" value="计算机应用一班"></property>
  11. </bean>
  12. <!-- 学生类 -->
  13. <bean id="student" class="com.pb.entity.Student">
  14. <property name="name" value="张三" />
  15. <property name="age" value="18"/>
  16. <property name="grade" ref="grade"/>
  17. </bean>
  18. </beans>

三、注入NULL和空字符串值

<value></value>表示空字符串

<null></null>表示为null值

  1. <bean id="student" class="com.pb.entity.Student">
  2. <!-- 姓名注入空字符串 <value></value>表示空字符串 -->
  3. <property name="name"><value></value></property>
  4. <!--年龄注入为NULL值 -->
  5. <property name="age"><null></null></property>
  6. <property name="grade" ref="grade"/>
  7. </bean>

四、使用p 命名空间注入bean

官方推荐的注入方式

需要在XML上加入

  1. xmlns:p="http://www.springframework.org/schema/p"
  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" xmlns:p="http://www.springframework.org/schema/p"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
  5. <!--班级类 使用p命名空间注入 -->
  6. <bean id="grade" class="com.pb.entity.Grade" p:id="1001" p:name="外语一班">
  7.  
  8. </bean>
  9. <!-- 学生类 使用p命名空间注入 -->
  10. <bean id="student" class="com.pb.entity.Student" p:name="张三"
  11. p:age="23" p:grade-ref="grade">
  12.  
  13. </bean>
  14. </beans>

效果一目了然

五、自动装配

需要使用autowire属性来配置

可以在每个bean中使用autowire来配置

也可以在<beans>中使用autowire全局配置表示这个beans下的都使用自动装配,

缺点:不清晰,有问题比较难以查找

autowire:

no(默认值):不进行自动装配,必须显示指定依赖对象

byName: 根据属性名自动装配。自动查找与属性名相同的id,如果找到,则自动注入,否则什么都不做

byType:根据属性的类型自动装配,Spring自动查找与属性类型相同的Bean,如果刚好找到唯一的那个,则自动注入,如果找到多个与属性类型相同的Bean,则抛出异常,如果没有找到就什么都不做。

constructor:和byType类似,不过它针对构造方法,如果找到一个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" xmlns:p="http://www.springframework.org/schema/p"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
  5. <!--班级类 使用p命名空间注入 -->
  6. <bean id="grade" class="com.pb.entity.Grade" p:id="1001" p:name="外语一班" >
  7.  
  8. </bean>
  9. <!-- 学生类 使用p命名空间注入 -->
  10. <bean id="student" class="com.pb.entity.Student" p:name="张三"
  11. p:age="23" autowire="byName">
  12.  
  13. </bean>
  14. </beans>

自动装配使得配置文件可以非常简洁,但同时也造成组件之间的依赖关系不明确,容易引发一些潜在的错误,谨慎使用

Spring(四)Bean注入方试的更多相关文章

  1. spring的bean注入扫瞄方法和mybatis的dao bean注入扫描方法

    spring的bean注入扫面方法:@ComponentScan(basePackages = "com.pingan.property.icore.pap.*")mybatis的 ...

  2. 在Spring的Bean注入中,即使你私有化构造函数,默认他还是会去调用你的私有构造函数去实例化

    在Spring的Bean注入中,即使你私有化构造函数,默认他还是会去调用你的私有构造函数去实例化. 如果我们想保证实例的单一性,就要在定义<bean>时加上factory-method=” ...

  3. spring框架bean注入

    今天学习了spring框架,刚刚入门简单的了解了spring并学习了bean的注入IOC:IOC(Inversion of Control,控制反转)不是什么技术,而是一种设计思想.它的目的是指导我们 ...

  4. 学习 Spring (四) Bean 的生命周期

    Spring入门篇 学习笔记 定义 --> 初始化 --> 使用 --> 销毁 初始化 实现 org.springframework.beans.factory.Initializi ...

  5. spring+cxf 开发webService(主要是记录遇到spring bean注入不进来的解决方法)

    这里不介绍原理,只是记录自己spring+cxf的开发过程和遇到的问题 场景:第三方公司需要调用我们的业务系统,以xml报文的形式传递数据,之后我们解析报文存储到我们数据库生成业务单据: WebSer ...

  6. Spring中bean的四种注入方式

    一.前言   最近在复习Spring的相关内容,这篇博客就来记录一下Spring为bean的属性注入值的四种方式.这篇博客主要讲解在xml文件中,如何为bean的属性注入值,最后也会简单提一下使用注解 ...

  7. spring的依赖注入的四种方式,数组与集合注入;引用注入;内部bean注入

    三种注入方式 第一种: 基于构造函数 hi.java (bean) package test_one; public class hi { private String name; public hi ...

  8. Spring之Bean的注入

    Bean的配置中介绍的是Bean声明问题,在哪声明怎么声明的问题.Bean的注入是怎么实例化,怎么注入的问题.Bean注入的方式有两种,一种是在XML中配置,另一种则是使用注解的方式注入. 一.XML ...

  9. spring中bean配置和bean注入

    1 bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean ...

随机推荐

  1. MyBatis知多少(2)

    MyBatis从目前最流行的关系数据库访问方法中吸收了大量的优秀特征和思想,并找出其中的协同增效作用.下图展示了MyBatis框架是如何吸收我们在多年使用不同方式进行数据库集成的 开发过程中所学到的知 ...

  2. Asphyre 更名pxl 终于全面支持跨平台了.Delphi饭们 激动了吧.

    Asphyre We are happy to announce the official release of our latest framework Pascal eXtended Librar ...

  3. 基于kubernetes构建Docker集群管理详解-转

    http://blog.liuts.com/post/247/ 一.前言        Kubernetes 是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度 ...

  4. iOS- 微信支付 (服务器调起支付 )以及回调不成功的原因 不看后悔

    写的不错,给留个言哈... 一. 支付准备工作 1. 微信相关准备工作 (1) 向微信官方开通支付功能. 这个不是前端的工作. (2) 导入官方下载的微信支付SDK包. 我用的是微信开放平台下载的SD ...

  5. Direct3D11学习:(五)演示程序框架

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 在此系列最开始的文章Direct3D11学习:(一)开发环境配置中,我们运行了一个例子BoxDemo,看过这个例 ...

  6. sql server 查找包含字符串的对象

    sql server 查找包含字符串的对象 SELECT sm.object_id, OBJECT_NAME(sm.object_id) AS object_name, o.type, o.type_ ...

  7. Dancing Link --- 模板题 HUST 1017 - Exact cover

    1017 - Exact cover Problem's Link:   http://acm.hust.edu.cn/problem/show/1017 Mean: 给定一个由0-1组成的矩阵,是否 ...

  8. [CLR via C#]11. 事件

    一. 设计要公开事件的类型 如果类型定义了事件成员,那么类型(或类型实例)就可以通知其他对象发生了一些特定的事情. 例如,Button类提供了一个名为Click的事件.应用程序中的一个或多个对象可能想 ...

  9. .net开发微信公众平台

    一.说明:公众平台信息接口为开发者提供了一种新的消息处理方式,只有申请成为开发者后,你才能使用公众平台的开发功能,在这里你需要填写一个URL和一个Token,这两项信息也需要你拥有自己的服务器(外网服 ...

  10. VS用法总结

    工欲善其事,必先利其器,关于VS的“即时窗口”的使用: 打开“即时窗口”的快捷键是:Ctrl + Alt + I. 要在“即时窗口”中打印查看打印输出结果,必须按如下步骤设置:[工具]→[选项]→[调 ...