spring四种依赖注入方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理。spring提出了依赖注入的思想,即依赖不由程序员控制,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转.
平常的java开发中,程序员在某个类中需要依赖其它类的方法,通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理。
spring提出了依赖注入的思想,即依赖不由程序员控制,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。
spring有4种依赖注入方式:
- Set方法注入
- 构造器注入
- 静态工厂的方法注入
- 实例工厂的方法注入
按照实现方式分为两类:
- 注解(如@Autowired)
- 配置文件(如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方法、构造方法注入)
更多推荐
所有评论(0)