1. @Component:组件.(作用在类上)可以作用在任何一个类上
2. Spring中提供@Component的三个衍生注解:(功能目前来讲是一致的)
* @Controller -- 作用在WEB层(同样可以使用@Component,因为@Controller是@Component的细化。下面两个组件同)
* @Service -- 作用在业务层
* @Repository -- 作用在持久层
* 说明:这三个注解是为了让标注类本身的用途清晰,Spring在后续版本会对其增强
3. 属性注入的注解(说明:使用注解注入的方式,可以不用提供set方法)
* 如果是注入的普通类型,可以使用value注解
* @Value -- 用于注入普通类型
@Component(value="userService") public class UserServiceImpl implements UserService{ @Value(value="jack") private String name; public void sayHello(){ System.out.println("say spring"+name); } }
这样name便被赋予了jack的值。
* 如果注入的是对象类型,使用如下注解
* @Autowired -- 默认按类型进行自动装配
(1)创建Dao层对象UserDao。这里一定要注意的是:UserDao中也应该加入组件,因为配置文件根据注解去扫描各个文件,如果扫描到就为其创建对象。
package com.huida.demo1; import org.springframework.stereotype.Repository; @Repository(value="userDao")//(一定要加上) public class UserDao { public void save(){ System.out.println("保存用户"); } }
(2)在UserServiceImpl实现方法中,引入自定义对象userDao:
这里定义的对象名与Dao层声明的名称不同,那又是如何进行匹配的呢?@Authowired是按照类型进行匹配的,这里定义的dao的类型为UserDao,就去扫描UserDao然后为其创建对象进行匹配。
@Component(value="userService") public class UserServiceImpl implements UserService{ @Value(value="jack") private String name; //按照类型自动装配,按照类型进行匹配。 @Autowired private UserDao dao; public void sayHello(){ System.out.println("say spring"+name); dao.save(); } }
* 如果想按名称注入
* @Qualifier -- 强制使用名称注入
如果按照名称注入的话,value中的值应该与Dao层对象声明的名称一样才可以匹配成功
@Component(value="userService") public class UserServiceImpl implements UserService{ @Value(value="jack") private String name; @Qualifier(value="userDao")//按名称注入,value中的值应该与Dao层组件写的名称一样 */ private UserDao dao; public void sayHello(){ System.out.println("say spring"+name); dao.save(); } }
* @Resource -- 相当于@Autowired和@Qualifier一起使用
* 强调:Java提供的注解
* 属性使用name属性
@Component(value="userService") public class UserServiceImpl implements UserService{ @Value(value="jack") private String name; @Resource(name="userDao") private UserDao dao; public void sayHello(){ System.out.println("say spring"+name); dao.save(); } }
不管是哪种方法,执行结果都一样,执行结果为: