首先要知道另一个东西,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预订了订单