1、前言

上一篇讲到第一个Spring项目的创建、以及bean的注入、当然、注入的方式一共有三种、本文将展开细说。

1、set注入:本质是通过set方法赋值

1、创建老师类和课程类



1、Course

package com.feng.entity;

public class Course {
private String courseName;
private int courseHour;
private Teacher teacher; // 授课老师、依赖于Teacher类 public Course(String courseName, int courseHour, Teacher teacher) {
this.courseName = courseName;
this.courseHour = courseHour;
this.teacher = teacher;
}
public Course() {
} public String getCourseName() {
return courseName;
} public void setCourseName(String courseName) {
this.courseName = courseName;
} public int getCourseHour() {
return courseHour;
} public void setCourseHour(int courseHour) {
this.courseHour = courseHour;
} public Teacher getTeacher() {
return teacher;
} public void setTeacher(Teacher teacher) {
this.teacher = teacher;
} public void showInfo() {
System.out.println(this.courseName + "," + this.courseHour + "," + this.teacher.getName());
}
}

2、Teacher

package com.feng.entity;

public class Teacher {
private String name;
private int age; public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
public Teacher() {
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

2、配置applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="teacher" class="com.feng.entity.Teacher">
<property name="name" value="zs"></property>
<property name="age" value="23"></property>
</bean>
<bean id="course" class="com.feng.entity.Course">
<!-- 1、set注入:通过set方法赋值 -->
<!--本质就是调用setCourseName()方法
CourseName -> setCourseName()借助反射进行查找
-->
<property name="courseName" value="java"></property>
<property name="courseHour" value="200"></property>
<!-- 将teacher对象注入到course对象中 -->
<property name="teacher" ref="teacher"></property>
</bean>
</beans>

3、测试类测试

package com.feng.test;

import com.feng.entity.Course;
import com.feng.entity.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test {
public static void testDI() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Course course = (Course)context.getBean("course");
course.showInfo();
}
public static void main(String[] args) {
testDI();
}
}

4、运行结果

5、注

这里只需要获得course对象即可、因为course对象中包含Teacher。这里注意不用value用ref、因为这里指向的是一个对象。

<property name="teacher" ref="teacher"></property>

2、构造器注入: 本质是通过构造方法赋值

1、改变applicationContext.xml即可、其他的无需变动

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="teacher" class="com.feng.entity.Teacher">
<!--2、构造器注入:通过构造方法赋值-->
<constructor-arg value="24" name="age"></constructor-arg>
<constructor-arg value="ls" name="name"></constructor-arg>
</bean>
<bean id="course" class="com.feng.entity.Course">
<constructor-arg value="c" name="courseName"></constructor-arg>
<constructor-arg value="100" name="courseHour"></constructor-arg>
<constructor-arg ref="teacher" name="teacher"></constructor-arg>
</bean>
</bean>

2、运行结果

3、注

这里注意使用构造器注入、原来的实体类中必须要有构造器方法、标签中最好指定name,不然会按构造方法中的顺序去检索参数,如果类型值出错就容易导致程序报错运行不起来。


3、增加p命名空间

1、改变applicationContext.xml即可、其他的无需变动

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<!--使用p命名空间记得加这句话-->
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="teacher" class="com.feng.entity.Teacher" p:age="25" p:name="w5">
</bean>
<bean id="course" class="com.feng.entity.Course" p:courseHour="300" p:courseName="hadop" p:teacher-ref="teacher">
</bean>
</bean>

2、运行结果


2、总结

本文讲到了Spring框架中applicationContext.xml中bean依赖注入的三种方式、下一篇文章会围绕几种集合方式的注入进行讲解。

Spring学习(二)三种方式的依赖注入的更多相关文章

  1. spring配置datasource三种方式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp34 spring配置datasource三种方式 1.使用org.spri ...

  2. spring配置datasource三种方式及具体信息

    1.使用org.springframework.jdbc.datasource.DriverManagerDataSource说明:DriverManagerDataSource建立连接是只要有连接就 ...

  3. spring配置datasource三种方式 数据库连接池

    尊重原创(原文链接):http://blog.csdn.net/kunkun378263/article/details/8506355 1.使用org.springframework.jdbc.da ...

  4. spring实例化bean三种方式

    我看了这篇博文<https://www.cnblogs.com/zhanglei93/p/6221546.html>,以及自己实践总结了关于spring实例化bean对象的3种方式. 一. ...

  5. Spring笔记03(Spring创建对象的三种方式)

    1.创建对象的三种方式和bean的生命周期的验证: Animal接口代码: package cn.pb.dao; /** * 动物接口 */ public interface Animal { //吃 ...

  6. Spring创建对象的三种方式以及创建时间

    创建对象的三种方式: 1.采用默认的构造函数创建 2.采用静态工厂方法 1.写一个静态工厂方法类 public class HelloWorldFactory { public static Hell ...

  7. Scala学习2 ———— 三种方式完成HelloWorld程序

    三种方式完成HelloWorld程序 分别采用在REPL,命令行(scala脚本)和Eclipse下运行hello world. 一.Scala REPL. 按照第一篇在windows下安装好scal ...

  8. 创建 Spring容器的三种方式

    一.src路径下打包完在war包的classes层级下 1.Spring容器创建的三种方式 创建Bean容器之后创建对象: 其中第三种使用的是BeanFactory对象 2.spring通过配置文件用 ...

  9. Spring集成Memcached三种方式(一)

    转载:http://blog.csdn.net/u013725455/article/details/52102170 Memcached Client目前有3种: Memcached Client ...

随机推荐

  1. Qt5加载SVG格式的图片并更颜色

    QIcon MainWindow::qiconFromSvg(QString svg_path, QString color) { QPixmap img(svg_path); QPainter qp ...

  2. ES2020新特性链操作符 '?.'和'??'

    ES2020新特性,js中的可选链操作符?. 概述 回想一下,我们是如何访问可能含有空值(null或undefined)属性的嵌套对象,比如访问web api 返回结果的user详情,可以使用嵌套的三 ...

  3. excel--CLEAN()函数,解决为什么看着相同的字符串但是len()长度不同

    CLEAN()函数能够有效解决去除字符串中隐藏的字符(这些字符是TRIM()去除不掉的)

  4. 修复UE4编辑器,ClearLog操作导致的崩溃

    UE4 4.24.3版本,编辑器Output Log窗口中,右键--Clear Log操作很大概率会导致编辑器奔溃:解决办法: 相关文件: Engine\Source\Developer\Output ...

  5. CSS3实现字体描边

    CSS3实现字体描边的两种方法 -webkit-text-stroke: 1px #fff;:不建议,向内描边,字体颜色变细,效果不佳: 用box-shadow模拟描边,向外描边,保留字体粗细,赞! ...

  6. Hive相关知识点

    ---恢复内容开始--- 转载:Hive 性能优化 介绍 首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪些问题? 数据量大不是问题,数据倾斜是个问题. jobs数比较多的作业运行效率相 ...

  7. fastJson序列化

    在pojo实体中有map<String,Object>的属性,有个key是user它存储在数据库中是用户的id数组,而在aop里会对这个属性做用户详细信息查询并重新put给user.在做J ...

  8. Spring支持5种类型的增强

    Spring支持5种类型的增强:1.前置增强:org.springframework.aop.BeforeAdvice代表前置增强,因为Spring只支持方法级的增强,所以MethodBeforeAd ...

  9. lucene的索引查询

    package com.hope.lucene;import org.apache.lucene.document.Document;import org.apache.lucene.document ...

  10. 使用$.post方式来实现页面的局部刷新功能

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...