Spring实现对象注入的三种方法详解
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)使用构造方法注入,无法解决循环依赖的问题。
到此这篇关于Spring实现对象注入的三种方法详解的文章就介绍到这了,更多相关Spring对象注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java高性能实体类转换工具MapStruct的使用教程详解
MapStruct 是一个代码生成器,它基于约定优于配置的方法,极大地简化了 Java bean 类型之间的映射实现,本文主要介绍了MapStruct的具体使用以及如何进行实体类转换,感兴趣的可以了解下2024-03-03
spring cloud之eureka高可用集群和服务分区解析
这篇文章主要介绍了spring cloud之eureka高可用集群和服务分区解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-03-03


最新评论