JAVA入门[3]—Spring依赖注入

Posted 陈敬(Cathy)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA入门[3]—Spring依赖注入相关的知识,希望对你有一定的参考价值。

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。

 1 package bean;
 2 
 3 public class Category {
 4 private int cateId;
 5 private String cateName;
 6 public int getCateId(){
 7 return this.cateId;
 8     }
 9 public void setCateId(int id){
10 this.cateId=id;
11     }
12 public String getCateName(){
13 return this.cateName;
14     }
15 public void setCateName(String cateName) {
16 this.cateName = cateName;
17 
18     }
19 
20     @Override
21 
22     public String toString() {
23 
24         return " 商品类型 id="+this.cateId+",name="+this.cateName;
25 
26     }
27 
28 }
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();
    }

}
View Code

 

②.配置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依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

《Java从入门到放弃》入门篇:spring中IOC的注入姿势

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

spring入门——3种注入方式

Spring 从入门到精通系列 05——Spring 依赖注入的三种方式

Spring之IOC/DI(反转控制/依赖注入)_入门Demo

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段