使用Autowired
- 一般情况下,controller和service是有关联关系的,service和DAO层是有关联关系的,我们使用autowired注解,在controller中装配service,在service中装配reponsitory
package com.zj.annotation.service;
public interface TestService {
void add();
}
package com.zj.annotation.service;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
@Service
public class TestServiceImpl implements TestService {
@Override
public void add() {
System.out.println("service impl add.....");
}
}
@Controller
public class TestController {
@Autowired
private TestService testService;
public void excute(){
testService.add();
}
}
- 注意,使用autowired的前提是TestService的bean归IOC容器管理(使用注解或配置文件配置的方式配置了该bean)
- 如果没有创建testService这个bean,那么将抛异常
- 也可以使用required=false来声明可以不创建该bean:@Autowired(required=false)
- autowired也可以用于方法
@Controller
public class TestController {
private TestService testService;
@Autowired
private void getTestService(TestService testService) {
this.testService = testService;
}
public void excute(){
testService.add();
}
}
这种写法和上面效果一样
细节注意
如果有多个类实现了TestService这个接口,那么autowired会自动装配哪个?
根据实现类的name,如其中一个实现类:@Service(“testService”),那么就自动装配这个实现类,因为
private TestService testService;
如果有多个实现类,但是没有指明name怎么办?
如果没有指明name,将会抛异常,但是我们可以使用@Qualifier注解来说明使用哪一个实现类
@Controller
public class TestController {
@Autowired
@Qualifier("testServiceImpl2")
private TestService testService;
public void excute(){
testService.add();
}
}
实现类为TestServiceImpl2,bean的name(id)默认为testServiceImpl2
- @Qualifier也可以用于方法,或者方法的参数,如:
private TestService testService;
@Autowired
@Qualifier("testServiceImpl2")
private void getTestService(TestService testService) {
this.testService = testService;
}
或者
private TestService testService;
@Autowired
private void getTestService(@Qualifier("testServiceImpl2")TestService testService) {
this.testService = testService;
}