Spring支持属性注入和构造器注入,它支持XML和注解两种方式。本文介绍Spring控制反转容器加载包含beans的XML文件,实现依赖注入。

一、创建bean实例

暂且抛开对象依赖,我们先看下如何通过Spring容器创建bean实例。这里要用到Spring的控制反转容器ApplicationContext,它的getBean方法可以创建bean实例

1.在Maven项目的pom.xml添加spring依赖项。


<properties>
<spring.version>4.3.5.RELEASE</spring.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>

2.  新建java类Category。

 package bean;

 public class Category {
private int cateId;
private String cateName;
public int getCateId(){
return this.cateId;
}
public void setCateId(int id){
this.cateId=id;
}
public String getCateName(){
return this.cateName;
}
public void setCateName(String cateName) {
this.cateName = cateName; } @Override public String toString() { return " 商品类型 id="+this.cateId+",name="+this.cateName; } }

Category

3. 新建xml配置文件,路径为resources/spring-config.xml,用来配置bean对象。

<?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-3.0.xsd">
<bean id="category" class="bean.Category"></bean>
</beans>

可以为bean指定一个id或name作为标识。

4. 调用。

首先使用ClassPathXmlApplicationContext加载配置文件,然后通过ApplicationContext的getBean方法获取Category实例。

public class Main {
public static void main(String[] args){
//创建bean实例
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");
Category category=applicationContext.getBean(Category.class);

//设置属性
category.setCateId(1);
category.setCateName("书籍");
//显示结果
System.out.println(category.toString());
} }

运行结果为:

商品类型 id=1,name=书籍

二、向构造函数传参

1.为Category添加构造函数:

public Category(int cateId,String cateName){
this.cateId=cateId;
this.cateName=cateName; }

2.修改xml配置

向构造函数传参有两种配置方式。

①通过指定参数名name传递参数

<!--方式一:name-->
<bean id="category" class="bean.Category">
<constructor-arg name="cateId" value="99"/>
<constructor-arg name="cateName" value="其他"/> </bean>

②通过指定参数索引顺序index传递参数

<!--方式二:index-->
<bean id="category" class="bean.Category">
<constructor-arg index="0" value="99"/>
<constructor-arg index="1" value="其他"/>
</bean>

③修改main调用进行测试。

public class Main {
public static void main(String[] args){
//创建bean实例
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");
Category category=applicationContext.getBean(Category.class);
//输出默认值
System.out.println(category.toString());
//设置属性
category.setCateId(1);
category.setCateName("书籍");
System.out.println(category.toString());
//运行结果:
// 商品类型 id=99,name=其他
// 商品类型 id=1,name=书籍
}
}

三、依赖注入

依赖注入通常有以下两种方式:

  • 设置注入:IoC容器使用属性的setter方法来注入被依赖的实例。
  • 构造注入:IoC容器使用构造器来注入被依赖的实例。

1.设置注入

①新建类product,它依赖前面的Category类。

package bean;

public class Product {
private int productId;
private String productName;
private Category productCategory;
public int getProductId(){
return this.productId;
}
public void setProductId(int productId){
this.productId=productId;
}
public String getProductName(){
return this.productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public Category getProductCategory() {
return productCategory;
}
public void setProductCategory(Category productCategory) {
this.productCategory = productCategory;
} @Override
public String toString() {
return " 商品 id="+this.productId+";name="+this.productName+this.productCategory.toString();
} }

②.配置xml

在spring-config.xml中新增bean节点,对应的class属性为Product。product通过配置property元素来调用相应的setter方法以设置值,需要注意的是prodcuctCategory是通过ref来配置对category的引用。

<bean id="product" class="bean.Product">
<property name="productId" value="100"></property>
<property name="productName" value="一千零一夜"></property>
<property name="productCategory" ref="category"></property>
</bean>

③.main调用

Product product=applicationContext.getBean(Product.class);
System.out.println(product.toString());

2.、构造注入

①为product新增构造函数。

public Product(int productId,String productName,Category category){
this.productId=productId;
this.productName=productName;
this.productCategory=category;
}

②修改配置文件 spring-config.xml 中的product bean。

<bean id="product" class="bean.Product">
<constructor-arg index="0" value="101"/>
<constructor-arg index="1" value="童话镇"/>
<constructor-arg index="2" ref="category"/>
</bean>

③运行结果同设置注入一样

源码:点此下载

JAVA入门[3]—Spring依赖注入的更多相关文章

  1. JAVA入门[13]-Spring装配Bean

    一.概要 Sping装配bean主要有三种装配机制: 在XML中进行显式配置. 在Java中进行显式配置. 隐式的bean发现机制和自动装配. 原则: 建议尽可能地使用自动配置的机制,显式配置越少越好 ...

  2. Java Web系列:Spring依赖注入基础

    一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...

  3. java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪

    前言 前两天和一个同学吃饭的时候同学跟我说了一件事,说他公司有个做了两年的人向他提出要涨薪资,他就顺口问了一个问题关于spring依赖注入的,那个要求涨薪的同学居然被问懵了...事后回家想了想这一块确 ...

  4. java线程中如何使用spring依赖注入

    实现一个线程继承了Thread或实现Runnable接口,想在run方法中使用spring依赖注入(操作数据库),此时报错为空指针,就是说没有注入进来. 实验了几种方式,分别说一下优缺点. 1:写了工 ...

  5. Spring依赖注入(IOC)那些事

    小菜使用Spring有几个月了,但是对于它的内部原理,却是一头雾水,这次借着工作中遇到的一个小问题,来总结一下Spring. Spring依赖注入的思想,就是把对象交由Spring容器管理,使用者只需 ...

  6. Spring依赖注入三种方式详解

    在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...

  7. Spring依赖注入:注解注入总结

    更多11   spring   依赖注入   注解   java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...

  8. Spring 依赖注入,在Main方法中取得Spring控制的实例

    Spring依赖注入机制,在Main方法中通过读取配置文件,获取Spring注入的bean实例.这种应用在实训的时候,老师曾经说过这种方法,而且学Spring入门的时候都会先学会使用如何在普通的jav ...

  9. Spring依赖注入 --- 简单使用说明

    Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...

随机推荐

  1. day3--远程链接Linux

    互联网上的计算机,都会有一个唯一的32位的地址,IP地址 我们访问服务器,就必须通过这个IP地址 局域网里也有预留的IP地址,192/10/172开头.局域网的IP地址也是唯一的. NAT模式,电脑宿 ...

  2. eclipse构建maven+scala+spark工程

    前提条件 下载安装Scala IDE build of Eclipse SDK 构建工程 1.新建maven工程 2.配置项目信息 3.新建scala对应的Source Folder 4.添加scal ...

  3. Windows Forms DataGridView中合并单元格

    Windows Forms DataGridView 没有提供合并单元格的功能,要实现合并单元格的功能就要在CellPainting事件中使用Graphics.DrawLine和 Graphics.D ...

  4. 洛谷 P3384 【模板】树链剖分

    树链剖分 将一棵树的每个节点到它所有子节点中子树和(所包含的点的个数)最大的那个子节点的这条边标记为"重边". 将其他的边标记为"轻边". 若果一个非根节点的子 ...

  5. [转载] Java集合---HashMap源码剖析

    转载自http://www.cnblogs.com/ITtangtang/p/3948406.html 一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射 ...

  6. java 之 原型模式(大话设计模式)

    原型模式,在笔者理解看来就是克隆,当我们在创建第一个对象时,已经给对象赋值完毕,此时我们需要一个当前对象的副本,如果没有原型模式,我们会再次创建一个对象,然后后二次赋值,保证两个对象完全一致, 这样我 ...

  7. 微信小程序与Java后台通信

    一.写在前面 最近接触了小程序的开发,后端选择Java,因为小程序的代码运行在腾讯的服务器上,而我们自己编写的Java代码运行在我们自己部署的服务器上,所以一开始不是很明白小程序如何与后台进行通信的, ...

  8. C# 通过url地址获取页面内容

    using System.Net; using System.IO; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(" ...

  9. 浏览器拦截js打开新窗口

    最近做项目时,遇到的问题"想通过javascript在浏览器新标签页或新窗口打开一个新的页面,结果被浏览器大大无情给拦截了"业务需求:前端提交数据到后端,后端返回url,然后在新窗 ...

  10. JAVA提高十九:WeakHashMap&EnumMap&LinkedHashMap&LinkedHashSet深入分析

    因为最近工作太忙了,连续的晚上支撑和上班,因此没有精力来写下这篇博客,今天上午正好有一点空,因此来复习一下不太常用的集合体系大家族中的几个类:WeakHashMap&EnumMap&L ...