平常的java开发中,程序员在某个类中需要依赖其它类的方法,通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理。

spring提出了依赖注入的思想,即依赖不由程序员控制,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。

spring有4种依赖注入方式:

  1. Set方法注入
  2. 构造器注入
  3. 静态工厂的方法注入
  4. 实例工厂的方法注入

按照实现方式分为两类:

  1. 注解(如@Autowired)
  2. 配置文件(如xml)

以下对于4种依赖注入方式,分别使用两种实现方式来实现

1、Set方法注入

Set方法注入是最简单、最常用的注入方式。

1.1 注解注入:

package com.obob.dao;

public class UserDao {
	
	public void login() {
		System.out.println("login...");
	}
}

package com.obob.service;
import org.springframework.beans.factory.annotation.Autowired;
import com.obob.dao.UserDao;

public class UserService {
	
	//注解注入(autowire注解默认使用类型注入)
	@Autowired
	private UserDao userDao;
	
	public void login() {
		userDao.login();
	}
}

1.2 配置文件注入

UserDao定义不变,UserService去掉注解

package com.obob.service;
import org.springframework.beans.factory.annotation.Autowired;
import com.obob.dao.UserDao;

public class UserService {
	

	private UserDao userDao;
	
	public void login() {
		userDao.login();
	}
}

然后使用配置文件:

<bean name="userService" class="com.obob.service.UserService">
	<property name="userDao" ref="userDao" />
</bean>
<bean name="userDao" class="com.obob.dao.UserDao"></bean>

2、构造方法注入

构造方法注入是指带有参数的构造函数注入

2.1 注解注入:

package com.obob.service;

import org.springframework.beans.factory.annotation.Autowired;

import com.obob.dao.UserDao;

public class UserService {
	
	private UserDao userDao;
	
	//注解到构造方法处
	@Autowired
	public UserService(UserDao userDao) {
		this.userDao = userDao;
	}
	
	
	public void login() {
		userDao.login();
	}
}

2.2 配置文件注入

UserService

package com.obob.service;

import org.springframework.beans.factory.annotation.Autowired;

import com.obob.dao.UserDao;

public class UserService {
	
	private UserDao userDao;
	
	public UserService(UserDao userDao) {
		this.userDao = userDao;
	}
	
	
	public void login() {
		userDao.login();
	}
}

配置文件:

<bean name="userService" class="com.obob.service.UserService">
	<constructor-arg index="0" ref="userDao"></constructor-arg> 
</bean>
<bean name="userDao" class="com.obob.dao.UserDao"></bean>

3、静态工厂的方法注入

静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象。
为了使用Spring的依赖注入IOC,我们不直接通过"工程类.静态方法()"来获取对象,而是依然通过spring注入的形式获取:

此种方式无通过注解注入

3.1 配置文件注入

UserService

package com.obob.service;

import com.obob.dao.UserDao;

public class UserService {
	
	private UserDao userDao;
	
	public void login() {
		userDao.login();
	}
}

Factory

package com.obob;

import com.obob.dao.UserDao;

public class Factory {
	
	public static UserDao initUserDao() {
		return new UserDao();
	}
}

配置文件:

<bean name="userService" class="com.obob.service.UserService">
	<property name="staticUserDao" ref="staticUserDao" />
</bean>
<bean name="staticUserDao" class="com.obob.Factory" factory-method="initUserDao"></bean>

4、实例工厂的方法注入

实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法:

此种方式无通过注解注入

4.1 配置文件注入

UserService

package com.obob.service;

import com.obob.dao.UserDao;

public class UserService {
	
	private UserDao userDao;
	
	public void login() {
		userDao.login();
	}
}

Factory

package com.obob;

import com.obob.dao.UserDao;

public class Factory {
	
	public UserDao initUserDao() {
		return new UserDao();
	}
}

配置文件:

<bean name="userService" class="com.obob.service.UserService">
	<property name="staticUserDao" ref="staticUserDao" />
</bean>
<bean name="staticUserDao" factory-bean="factory" factory-method="initUserDao"></bean>
<bean name="factory" class="com.obob.Factory"></bean>

5、总结

这四种方式,最常用的是1和2(set方法、构造方法注入)

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐