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







  • 相关阅读:
    hdu 5444 Elven Postman 二叉树
    tensorflow2.x模型保存问题
    【NVIDIA】Win10 + CUDA10 + cuDNN 安装教程(转载)和遇到的坑
    windows下 为不同虚拟环境配置不同的cuda
    多线程
    socket编程
    引用类型和值类型
    记录报错
    github下载慢问题
    LabelImg的安装出现No module named 'libs.resources'错误
  • 原文地址:https://www.cnblogs.com/meet/p/4758217.html
Copyright © 2020-2023  润新知