zoukankan      html  css  js  c++  java
  • SpringAnnotation注解之@Autowired

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

    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>

    这里我们需要写一个<property name="userDao" ref="userDaoImpl"></property>来给bean注入属性。使用了annotation之后呢,就可以不用这样写

    了。直接去掉<property>属性

    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
    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来进行注入







  • 相关阅读:
    爸爸妈妈儿子女儿吃水果问题以及五个哲学家吃饭问题
    同步与互斥中的购票和退票问题的PV操作与实现
    创建react&ts&antd项目
    在POM配置Maven plugin提示错误“Plugin execution not covered by lifecycle configuration”的解决方案
    aws rds 储存空间占用 异常排查 存储空间占满
    Linux下clang、gcc、intel编译器最新版本安装笔记
    extern "C"与extern "C" { … }的差别
    gcc预处理指令之#pragma once
    指向类的成员变量的指针
    Java程序中使用SQLite总结
  • 原文地址:https://www.cnblogs.com/meet/p/4758217.html
Copyright © 2011-2022 走看看