IOC @Autowired/@Resource/@Qulified的用法实例

首先要知道另一个东西,default-autowire,它是在xml文件中进行配置的,可以设置为byName、byType、constructor和autodetect;比如byName,不用显式的在bean中写出依赖的对象,它会自动的匹配其它bean中id名与本bean的set**相同的,并自动装载。
@Autowired是用在JavaBean中的注解,通过byType形式,用来给指定的字段或方法注入所需的外部资源。
两者的功能是一样的,就是能减少或者消除属性或构造器参数的设置,只是配置地方不一样而已。
autowire四种模式的区别:

@Autowired 可以作用在

  •    成员变量
  •    成员方法
  •    构造方法

--------------------------------------------@Autowired用在成员变量上面-------------------------------------

1. 创建一个接口IUserDao

 
package com.longteng.service.Imple;

public interface IUserDao {

    public String addUserName(String name);
    //public Map<String,String> getUserByName(String name);
}
 

2. 创建IUserDao的实现类UserDao 

 
package com.longteng.service.Imple;

import org.springframework.stereotype.Repository;

@Repository
public class UserDao implements IUserDao {

    @Override
    public String addUserName(String name) {
        return name+"添加成功了";
    }
}
 

3 . 创建IUserDao的实现类AnotherUserDao 

package com.longteng.lesson2.dao.impl;

import com.longteng.lesson2.dao.IOrderDao;
import org.springframework.stereotype.Repository;

@Repository
public class AnotherOrderDao implements IOrderDao {
    @Override
    public String bookOrder(String name) {
        return null;
    }
}

4、  创建OrderService

package com.longteng.lesson2.service;
import com.longteng.lesson2.dao.IOrderDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Service
public class OrderService {

    @Autowired
    IOrderDao iOrderDao;

    public String  getOrderInfo(String name){
       return iOrderDao.bookOrder(name);
    }
    @PostConstruct
    public void initTest(){
        System.out.println("初始化调用方法");
    }
    @PreDestroy
    public void tearDownTest(){
        System.out.println("回收调用方法");
    }
}

5、创建一个配置文件

package com.longteng.lesson2.config;

import com.longteng.lesson2.service.OrderService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = {"com.longteng.lesson2.dao","com.longteng.lesson2.service"})
public class OrderCfg {

    @Bean
    public OrderService getOrderService(){
        return new OrderService();
    }
}

6、创建测试类

package com.longteng.lesson2.dao;

import com.longteng.lesson2.config.OrderCfg;
import com.longteng.lesson2.service.OrderService;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class OrderDaoTest {
    ApplicationContext context;
    @Before
    public void initApplication(){
        context = new AnnotationConfigApplicationContext(OrderCfg.class);
    }
    @Test
    public void test(){
        OrderService orderService = context.getBean("orderService", OrderService.class);
        System.out.println(orderService.getOrderInfo("zhou"));
        Assert.assertEquals("成功了","zhou预订了订单",orderService.getOrderInfo("zhou"));
    }
}

7 测试结果

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.longteng.lesson2.dao.IOrderDao' available: expected single matching bean but found 2: anotherOrderDao,orderDao
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:173)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
    ... 36 more

8 解决办法

修改1

package com.longteng.lesson2.dao.impl;

import com.longteng.lesson2.dao.IOrderDao;
import org.springframework.stereotype.Repository;

@Repository("anotherOrderDao")
public class AnotherOrderDao implements IOrderDao {
    @Override
    public String bookOrder(String name) {
        return null;
    }
}

修改2

package com.longteng.lesson2.dao.impl;

import com.longteng.lesson2.dao.IOrderDao;
import org.springframework.stereotype.Repository;

@Repository("orderDao")
public class OrderDao implements IOrderDao {
    @Override
    public String bookOrder(String name) {
        return name+"预订了订单";
    }
}

修改3

package com.longteng.lesson2.service;
import com.longteng.lesson2.dao.IOrderDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Service
public class OrderService {

    @Autowired
    @Qualifier("orderDao")
    IOrderDao iOrderDao;

    public String  getOrderInfo(String name){
       return iOrderDao.bookOrder(name);
    }
    @PostConstruct
    public void initTest(){
        System.out.println("初始化调用方法");
    }
    @PreDestroy
    public void tearDownTest(){
        System.out.println("回收调用方法");
    }
}

运行结果

初始化调用方法
14:35:54.218 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'getOrderService'
14:35:54.218 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
14:35:54.239 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@f4ea7c]
14:35:54.239 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'lifecycleProcessor'
14:35:54.241 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Could not find key 'spring.liveBeansView.mbeanDomain' in any property source
14:35:54.243 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'orderService'
zhou预订了订单

--------------------------------------------@Autowired用在成员方法上面-------------------------------------

1. 创建一个接口IUserDao

 
package com.longteng.service.Imple;

public interface IUserDao {

    public String addUserName(String name);
    //public Map<String,String> getUserByName(String name);
}
 

2. 创建IUserDao的实现类UserDao 

 
package com.longteng.service.Imple;

import org.springframework.stereotype.Repository;

@Repository
public class UserDao implements IUserDao {

    @Override
    public String addUserName(String name) {
        return name+"添加成功了";
    }
}
 

3 .   创建OrderService

package com.longteng.lesson2.service;
import com.longteng.lesson2.dao.IOrderDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Service
public class OrderService {


IOrderDao iOrderDao;
@Autowired
public void setiOrderDao(IOrderDao iOrderDao) {
this.iOrderDao = iOrderDao;
}

public String getOrderInfo(String name){
return iOrderDao.bookOrder(name);
}
@PostConstruct
public void initTest(){
System.out.println("初始化调用方法");
}
@PreDestroy
public void tearDownTest(){
System.out.println("回收调用方法");
}
}

4、创建一个配置文件

package com.longteng.lesson2.config;

import com.longteng.lesson2.service.OrderService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = {"com.longteng.lesson2.dao","com.longteng.lesson2.service"})
public class OrderCfg {

    @Bean
    public OrderService getOrderService(){
        return new OrderService();
    }
}

5、创建测试类

package com.longteng.lesson2.dao;

import com.longteng.lesson2.config.OrderCfg;
import com.longteng.lesson2.service.OrderService;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class OrderDaoTest {
    ApplicationContext context;
    @Before
    public void initApplication(){
        context = new AnnotationConfigApplicationContext(OrderCfg.class);
    }
    @Test
    public void test(){
        OrderService orderService = context.getBean("orderService", OrderService.class);
        System.out.println(orderService.getOrderInfo("zhou"));
        Assert.assertEquals("成功了","zhou预订了订单",orderService.getOrderInfo("zhou"));
    }
}

 6、运行结果

14:42:27.880 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Eagerly caching bean 'getOrderService' to allow for resolving potential circular references
14:42:27.880 [main] DEBUG org.springframework.beans.factory.annotation.InjectionMetadata - Processing injected element of bean 'getOrderService': AutowiredMethodElement for public void com.longteng.lesson2.service.OrderService.setiOrderDao(com.longteng.lesson2.dao.IOrderDao)
14:42:27.881 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'orderDao'
14:42:27.881 [main] DEBUG org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor - Autowiring by type from bean name 'getOrderService' to bean named 'orderDao'
14:42:27.881 [main] DEBUG org.springframework.context.annotation.CommonAnnotationBeanPostProcessor - Invoking init method on bean 'getOrderService': public void com.longteng.lesson2.service.OrderService.initTest()
初始化调用方法
14:42:27.881 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'getOrderService'
14:42:27.881 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
14:42:27.902 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@e31a9a]
14:42:27.902 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'lifecycleProcessor'
14:42:27.904 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Could not find key 'spring.liveBeansView.mbeanDomain' in any property source
14:42:27.906 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'orderService'
zhou预订了订单
原文地址:https://www.cnblogs.com/zhou-test/p/10096420.html