SpringAnnotation注解之@Autowired

Stella981
• 阅读 657

@Autowired:自动装配,不用在bean里写属性来指定所依赖的属性

1

2

3

4

@Autowired

public void setUserDao(UserDao userDao) {

this .userDao = userDao;

}

Autowired:表示spring会在容器里找跟setUserDao(UserDao userDao)这里面的参数相同类型的bean,然后给注入进来。

例如:原来用XML方式的写法

1

2

3

4

5

< bean id = "userDaoImpl" class = "com.fz.annotation.dao.impl.UserDaoImpl" >

</ bean >

< bean id = "userService" class = "com.fz.xml.service.UserService" >

< property name = "userDao" ref = "userDaoImpl" ></ property >

</ bean >

这里我们需要写一个来给bean注入属性。使用了annotation之后呢,就可以不用这样写

了。直接去掉属性

1

2

3

4

< bean id = "userDaoImpl" class = "com.fz.annotation.dao.impl.UserDaoImpl" >

</ bean >

< bean id = "userService" class = "com.fz.xml.service.UserService" >

</ bean >

然后在userService里的userDao的set方法上加入@Autowired即可

现在测试:控制台打印出userDaoImpl里的User add.....信息,表示userDao已经获取到

1

2

3

4

5

6

[@Test](https://my.oschina.net/azibug)

public void getProperties(){

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext( "applicationContext_annotation.xml" );

UserService userService = (UserService) ctx.getBean( "userService" );

userService.userAdd();

}

通过测试,可以看出。@Autowired是根据set方法里的bean的类型来去容器里找相应类型的bean,也就是使用了byType

假如现在我们配置两个相同类型的userDaoImpl

1

2

3

4

5

6

<bean id= "userDaoImpl" class = "com.fz.annotation.dao.impl.UserDaoImpl" >

</bean>

<bean id= "userDaoImpl1" class = "com.fz.annotation.dao.impl.UserDaoImpl" >

</bean>

<bean id= "userService" class = "com.fz.annotation.service.UserService" >

</bean>

此时测试的时候将会报错:expected single matching bean but found 2。

但是,假如实际开发中我们就需要两个类型相同的bean呢?可以加上@Qualifier("userDaoImpl")

1

2

3

4

@Autowired

public void setUserDao( @Qualifier ( "userDaoImpl" )UserDao userDao) {

this .userDao = userDao;

}

@Qualifier``(``"userDaoImpl"``):表示使用名字为userDaoImpl的bean来进行注入,现在测试的话同样没问题。

也可以写在Autowired之后

@Autowired

@Qualifier("userDaoImpl")

public void setUserDao(UserDao userDao) 

总结:

1、@Autowired可以放在属性上,任意方法上,建议放在属性的set方法上。

2、@Autowired默认是按byType来查找bean的,如果找到多个同一类型的bean,则会报错

3、如果想按byName来查找bean,那就@Autowired和@Qualifier结合使用:`@Qualifier``(``"userDaoImpl"``):表示使用名字为userDaoImpl的bean来进行注入`

来自为知笔记(Wiz)

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
spring3.x注解自动注入
一、各种注解方式1.@Autowired注解(不推荐使用,建议使用@Resource)@Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。@Autowired的标注位置不同,它们都会在Spring在初始化这个bean时,自动装配这个属性。要使@Autowired能够工作,还需要在配置文件中加入以下Xml代码
Stella981 Stella981
3年前
Spring MVC 解读——@Autowired
SpringMVC解读——@Autowired一、@Autowired    作为一个Spring开发者对@Autowired注解必定是非常了解了,顾名思义自动装配,应该是Spring会自动将我们标记为@Autowired的元素装配好,与其猜测不如看看它的定义:@Targe
Easter79 Easter79
3年前
SpringMvc中@resource和@autowired区别
在java代码中使用@Autowired或@Resource注解方式进行装配这两个注解的区别是:@Autowired默认按类型装配,@Resource(https://my.oschina.net/u/929718)默认按名称装配,当找不到与名称匹配的bean才会按类型装配。如果我们想使用按名称装
Easter79 Easter79
3年前
Spring使用注解装配之@Autowired
1:可选的自动装配@Autowired具有强契约特征,其标注的属性或者参数必须是可装配的如果没有bean可装配,那么自动装配会失败,抛出NoSuchBeanDefinitionException当然,属性并不一定非要装配。null值也是可接受的。这样的话通过设置@Autowired(requiredfalse)来配置自动装配时可选的如果没有找到对
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这