Spring基础18——通过注解配置bean之间的关联关系
1.组件装配
<context:component-scan>元素还会自动注册AutowiredAnnotaionBeanPostProcessor实例,这是一个bean的后置处理器,该实例可以自动装配具有@Autuwired和@Resource、@Inject注解的属性(前提是在容器当中要自动装配的bean已经存在),其中@Autowired是最常用的。
2.@Autowired注解
@Autowired注解自动装配具有兼容类型的单个Bean属性,构造器,普通字段(即使是非public),一切具有参数的方法都可以应用@Autowired注解放在构造器上也是没有问题的。
1 private UserService userService; 2 @Autowired 3 public void setUserService(UserService userService) { 4 this.userService = userService; 5 }
@AutowiredIOC使用时应该注意以下几点:
1)使用@Autowired,Spring如果如果有这个bean直接拿,如果没有则会报错,注意@Autowired是按照类型注入的。
2)默认情况下,所有使用autowired注解的属性都需要被设置,当spring找不到配置的bean装配属性时,会抛出异常,某一属性允许不被设置,可以设置
3)@Autowired注解的required属性为false
4)默认情况下,当IOC容器里存在多个类型兼容的bean(同一类型或子类)时,通过类型自动装配将无法工作,此时可以在@Qualifiter注解里提供Bean的名称,如果是在方法中使用可以加在方法参数前面,Spring允许对方法的入参标注@Qualifiter已指定注入bean的名称。
5)@Autowired注解也可以应用在数组类型的属性上,此时Spring将会把所有匹配的bean进行装配。
6)@Autowired注解也可以应用在集合属性上,此时spring读取集合的类型信息,然后自动装配所有与之兼容的bean
7)@Autowired注解在java.util.Map上时,若该Map的键值为String,那么Spring将自动装配与之Map值类型兼容的Bean,此时Bean的名称成为键值。
8)如果@Autowired注解自动装配时有多个同类型的bean那么就会按照名称去找。
下面我们对@Autowired注解进行应用,在我们项目当中,一般都是Controller类中会注入Service,Service类会注入Respository,我们就用上一篇文章中的代码,对各个类按照这个顺序进行注入,并且调用注入bean的方法。
UserController类:注入UserService类
1 @Controller 2 public class UserController { 3 private UserService userService; 4 @Autowired 5 public void setUserService(@Qualifier("userService") UserService userService) { 6 this.userService = userService; 7 } 8 9 public void execute() { 10 System.out.println("UserController execute...."); 11 userService.add(); 12 } 13 }
UserService类:注入UserRepositoryImpl类
1 @Service 2 public class UserService { 3 @Autowired 4 private UserRepository userRepository; 5 public void add() { 6 System.out.println("UserService add..."); 7 userRepository.save(); 8 } 9 }
UserRepositoryImpl类
@Repository(value = "userRepository") public class UserRepositoryImpl implements UserRepository {public void save() {System.out.println("UserRepository Save。。。。");} }
运行测试类:
1 public class Main { 2 public static void main(String[] args) { 3 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-annotation.xml"); 4 UserController userController = (UserController) ctx.getBean("userController"); 5 System.out.println(userController); 6 7 UserService userService = (UserService) ctx.getBean("userService"); 8 System.out.println(userService); 9 10 UserRepository userRepository = (UserRepository) ctx.getBean("userRepository"); 11 System.out.println(userRepository); 12 13 TestObject testObject = (TestObject) ctx.getBean("testObject"); 14 System.out.println(testObject); 15 } 16 }
输出结果:我们可以发现可以成功的输出四个对象,证明我们的注入式成功的。
3.使用@Resource或@Inject自动装配Bean
Spring还支持@Resource和@Inject注解,这两个注解和@Autowired注解的功能类似
@Resource:注解要求提供一个Bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为Bean的名称,并且它并不是Spring提供的注解而是import javax.annotation.Resource中的注解。
@Inject和:@Autowired注解一样是按类型匹配注入的Bean,但是没有required属性。
最后建议使用@Autowired注解。
转载于:https://www.cnblogs.com/fengyun2019/p/10844564.html
Spring基础18——通过注解配置bean之间的关联关系相关推荐
- Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等...
实验1:配置通过静态工厂方法创建的bean [通过静态方法提供实例对象,工厂类本身不需要实例化!] 1.创建静态工厂类 public class StaticFactory {private sta ...
- 20.Spring 通过注解配置Bean
一.在classpath中扫描组件 1.组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 2.特定组件包括: @Component:基本注解,标识了一个受Sp ...
- SSM4==通过XML配置spring 事务,通过纯注解配置spring 事务
mysql的事务管理,是指在有关系的表(比如有外键)之间实现ACID,比如表A的金额列的外键是表B的金额列,那么如果A的金额减了300,B的金额也要减少300.如果A减300成功了,B失败了,mysq ...
- Spring概念、类注解和Bean作用域
1.Spring 是什么? 我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃而庞⼤的社区,这就是它之所以能长久不衰的原因.Spr ...
- Spring注入方式及注解配置
一:基于xml的DI(Dependency Injection) 注入类型: 定义学生Student实体类和小汽车Car实体类:进行封装和生成ToString(),并自定义属性Car Student ...
- 4. Spring 如何通过 XML 文件配置Bean,以及如何获取Bean
在 Spring 容器内拼凑 bean 叫做装配.装配 bean 的时候,你是在告诉容器,需要哪些 bean ,以及容器如何使用依赖注入将它们配合在一起. 理论上,bean 装配的信息可以从任何资源获 ...
- Spring的理解以及注解配置Spring
Spring概念:是一个轻量级控制反转(IOC)和,面向切面(AOP)的容器.装什么像什么,什么都可以装,管理者是对象.运用于一 式的开发,不排斥任何框架. SpringAOP:.将通知织入到被代理对 ...
- Spring 在xml文件中配置Bean
Spring容器是一个大工厂,负责创建.管理所有的Bean. Spring容器支持2种格式的配置文件:xml文件.properties文件,最常用的是xml文件. Bean在xml文件中的配置 < ...
- spring + hibernate + 实体类 注解配置代码
<?xml version="1.0" encoding="UTF-8"?> <beansxmlns="http://www.spr ...
最新文章
- poj3259(Bellman_ford算法)
- python内置函数可以返回列表元组_Python内置函数()可以返回列表、元组、字典、集合、字符串以及range对象中元素个数....
- c语言1至1000能被7或11 个数208 数下来没有208个,数学高手看过来:10000以内不能被3,5,7,9,11中任何一? 爱问知识人...
- Springsecurity-oauth2之/oauth/token的处理
- [转载]Hot Door CADtools (实战篇)
- c语言程序设计实验二模板,C语言程序设计实验二.doc
- 大数据之-Hadoop之HDFS_HDFS_基于JAVA的开发_客户端环境准备---大数据之hadoop工作笔记0054
- Mysql 浮点型入门
- 如何判断一个进程已经完成初始化?
- Android Studio 编译输出中文乱码的解决办法
- Linux内核源码分析
- 最受欢迎的网管工具集
- 《软件评测师教程》学习笔记-第一章:软件测试概述
- 算法题04:分治法:求第K小元素(线性时间选择算法)
- Cknife(中国菜刀) and AntSword(中国蚁剑)使用
- PyCharm入门教程——多个插入符号
- 美通社企业新闻汇总 | 2019.1.17 | 骊住在上海成立亚洲研发中心,霍尼韦尔深入参与中国最大石化项目建设...
- Debian上安装 Proxmox VE 7
- Replace Autoprefixer browsers option to Browserslist config,VUECLI3报错
- excel两行数据匹配【vlookup、countif】
热门文章
- axios Post无法传递数据的解决方案
- 解决WordPress设置错误的url网站不能访问的问题
- 完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三 1-转
- java 送参数_关于java:如何以编程方式发送带参数的HTTP请求?
- Java 通过Executors创建线程池的种类
- [Java] 蓝桥杯 BEGIN-1 入门训练 A+B问题
- 蓝桥杯 ALGO-53 算法训练 最小乘积(基本型)
- 1006. 换个格式输出整数 (15)-PAT乙级真题
- 逸管家中小企业未来的发展不可忽视人才战略
- windows下批量杀死进程