目录
- 1.属性注入
- 问题:同类型的Bean存储到容器多个,获取时报错的问题;
- 1.将属性的名字和Bean的名字对应上。
- 2.使用@AutoWired+@Qualifier来筛选bean对象;
- 属性注入优缺点
- 2.Setter注入
- Setter注入优缺点
- 3.构造方法注入(Spring 4.x之后推荐注入方式)
- 构造方法注入优缺点
1.属性注入
属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。
package com.java.demo.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserRepository {
public int add() {
System.out.println("Do UserRepository add method.");
return 1;
}
}
package com.java.demo.service;
import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;
@Service
public class UserService {
// 1. 属性注入
@Autowired // DI(依赖注入)
private UserRepository userRepository;
public int add() {
System.out.println("Do UserService add method.");
// 传统写法
// UserRepository userRepository = new UserRepository();
// return userRepository.add();
// Spring V1.0
// ApplicationContext context =
// new ClassPathXmlApplicationContext("spring-config.xml");
// UserRepository userRepository = context.getBean("userRepository",UserRepository.class);
//
// return userRepository.add();
// Spring V2.0
return userRepository.add();
}
}
依赖注入 VS 依赖查找
-依赖查找依赖 Bean
-@Autowired 依赖注入流程:首先先根据getType(从容器中)获取对象,如果只获取一个,那么直接将此对象注入到当前属性上;如果获取到多个对象,才会使用getName(根据名称)进行匹配。
问题:同类型的Bean存储到容器多个,获取时报错的问题;
解决方案:
1.将属性的名字和Bean的名字对应上。
2.使用@AutoWired+@Qualifier来筛选bean对象;
属性注入优缺点
优点:使用简单。
缺点:
a)无法注入一个不可变的变量(final修饰的变量)
b)只适用于IoC容器。
c)更容易违背单一设计原则,因为使用起来比较简单。
2.Setter注入
package com.java.demo.service;
import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService3 {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void sayHi() {
System.out.println("Do UserService3 sayHi.");
userRepository.add();
}
}
Setter注入优缺点
优点:通常Setter只set一个属性,所以Setter注入更符合单一设计原则
缺点:
a)无法注入一个final修饰的变量;
b)Setter注入的对象可以被修改。Setter本生就是一个方法,既然是一个方法就有可能被多次调用和修改。
3.构造方法注入(Spring 4.x之后推荐注入方式)
package com.java.demo.service;
import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService4 {
private UserRepository userRepository;
@Autowired
public UserService4(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void sayHi() {
System.out.println("Do UserService4 sayHi.");
userRepository.add();
}
}
如果当前类中存在一个构造方法时,@Autowired可以省略。
构造方法注入优缺点
优点:
a)可以注入一个final修饰的变量。
b)注入的对象不会修改,因为构造方法只会加载一次。
c)构造方法注入可以保证注入对象完全初始化。
d)构造方法注入通用性更好。
缺点:
a)写法比属性注入复杂。
b)使用构造方法注入,无法解决循环依赖的问题。