@Autowired:根据属性类型进行自动装配(getType)
@Qualifier:根据属性名称进行注入
@Resource:可以根据类型(getType)自动装配,也可以根据名称(getName)自动装配
@Value:普通类型属性的注入
常见的结构方式如下
如何进行属性注入:
-
在Controller类上添加bean实例注解@Controller
-
在service类上添加bean实例注解@Service
如果想通过UserService接口调用具体实现类UserServiceImpl,如下:
@Autowired private UserService userService;
就必须实现接口,否则会报错
注意:不要将注解添加在接口上
-
在dao类上添加bean实例注解@Repository
-
在需要使用的地方注入声明属性
在service层使用dao
在controller层使用service
-
测试
public class Main { @Test public void testAnno(){ ApplicationContext context=new FileSystemXmlApplicationContext("/resource/bean1.xml"); UserController userController = context.getBean("userController", UserController.class); System.out.println(userController); userController.addUser(); } }
@Qualifier注解的使用
@Qualifier必须配合@Autowired一起使用
@Autowired会自动注入当前接口对应实现类的bean实例(默认是当前实现类类名的首字母小写作为bean实例的id),当接口的实现类存在多个的时候,@Autowired无法准确找到具体的实现类,就需要使用@Qualifier,来定位对应的bean实例的id
例如UserService接口存在UserServiceImpl和UserLoginServiceImpl实现类,都使用@Service注入了bean的实例,可以采用下述方式准确定位具体的bean实例。
@Autowired
@Qualifier(value = "userLoginServiceImpl")
private UserService userService;
@Resource注解的使用
@Resource注解是JDK自带的
byType方式
-
根据属性名找到对应的bean实例进行匹配,如果属性名与接口UserService相同,且UserService有多个实现类,则会报错
@Resource private UserService userServiceImpl; @Resource private UserService userLoginServiceImpl;
byName方式步骤描述
-
根据@Resource注解中的name属性,匹配UserService接口的实现类的bean实例的属性id
@Resource(name = "userLoginServiceImpl") private UserService userService1; @Resource(name = "userServiceImpl") private UserService userService2;
@Value注解的使用
用于注入基本数据类型、String和包装类型等常用基本类型
@Value(value="name")
private String name;
@Value(value= "2")
private int age;
@Value(value= "150")
private Integer high;