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对象注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
MP(MyBatis-Plus)实现乐观锁更新功能的示例代码
这篇文章主要介绍了MP(MyBatis-Plus)实现乐观锁更新功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-01-01springboot vue测试平台开发调通前后端环境实现登录
这篇文章主要介绍了springboot vue测试平台开发调通前后端环境实现登录详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-05-05IntelliJ IDEA 详细图解最常用的配置(适合刚刚用的新人)
这篇文章主要介绍了IntelliJ IDEA 详细图解最常用的配置,本篇教程非常适合刚刚用的新人,本文图文并茂给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-08-08SpringBoot登录、退出、获取用户信息的session处理方案
这篇文章主要介绍了SpringBoot登录、退出、获取用户信息的session处理,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-08-08
最新评论