1、项目结构
Controller层代码
package com.Controller;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import com.Service.UserService;
import com.Service.UserServiceI;
import com.Service.UserServiceImpl1;
@Controller
public class UserController {
/*
* 该层不涉及复杂的业务逻辑
*/
public UserController() {
// TODO Auto-generated constructor stub
System.out.println("构造方法执行了");
}
@Autowired
@Qualifier(value="u2")
// @Resource(name = "u2")
private UserServiceI us;
public String sayHello() {
System.out.println(us.sayHello());
return "controller";
}
}
Dao层代码
package com.Dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
public UserDao() {
// TODO Auto-generated constructor stub
}
public String sayHello() {
return "dao执行了!";
}
}
Service层代码
//接口类
package com.Service;
public interface UserServiceI {
public String sayHello();
}
package com.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.Dao.UserDao;
@Service("u2")
public class UserServiceImpl2 implements UserServiceI {
@Autowired
private UserDao ud;
@Override
public String sayHello() {
// TODO Auto-generated method stub
// System.out.println(ud.sayHello()+"u2");
return "u2" + ud.sayHello();
}
}
扫描配置类
package com;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com")//组件扫描
public class MyConfig {
public MyConfig() {
// TODO Auto-generated constructor stub
}
}
测试类
package com;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.Controller.UserController;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 启动容器
ApplicationContext ac = new AnnotationConfigApplicationContext(MyConfig.class);
// 获取bean
UserController uc = ac.getBean(UserController.class);
// 调用
String show = uc.sayHello();
}
}
这里
@AutoWried注解是按照属性注入
@Resource是按照名称注入
@Qualifier+@AutoWried一起使用可以达到@Resource的使用效果
为什么要使用按名称注入呢?
如果单纯的使用@AutoWried注解,当一个接口有多个实现类的时候,那么就容易出现如下错误:
在接口生成类的实例的时候它不知道生成哪一个。
解决办法
1、@AutoWried+@Qualifier
2、@Resource
特别的要给Service注解添加个名称@Service(“u1”)
@AutoWried
@Qualifier(value=“u1”)
或者@Resource(name = “u1”)