一、前言
本文章是在学习尚硅谷雷丰阳老师的Spring注解驱动的教程视频中,所记录的简单笔记以及代码实现!
雷丰阳老师的视频很赞,建议大家可以去学习一下!
小伙伴在学习Spring框架的时候,有没有被各种xml配置文件所烦扰呢?比如:组件的注册,依赖的注入,组件的生命周期,属性赋值,自动装配等等…
相关博客:
二、注解的相关知识与代码实现
自动装配:Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值!
(一)@Autowired、@Qualifier
自动注入,默认优先按照类型去容器中找对应的组件。
如果容器中存在多个相同类型的组件,再将属性的名称作为组件的id去容器中查找。
若想指定需要装配的组件的id,不想使用属性名的形式,使用@Qualifier注解指定组件id。
自动装配默认容器中已经存在该组件,没有则会报错。但可以使用@Autowired(required=false)去使用该类型属性。
@Primary注解,没有明确指定哪个组件让Spring进行自动装配的时候,首选的组件。当组件注册时,使用该注解时则获取容器中同类型的多个组件时会首选该组件。
Spring提供的注解,常和@Qualifier使用。
@Autowired注解可以在构造器,参数,方法,属性上使用!都是从IOC容器中获取属性对应的组件!
1. 属性
//代码解释,使用自动装配过程!
//声明controller,service
@Controller
public class PersonController {
}
@Service
public class PersonService {
//定义一个属性,区分同类型的组件
private int type = 0;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String toString() {
return "PersonService{" +
"type=" + type +
'}';
}
}
//定义配置类,自动扫描包
@Configuration
@ComponentScan({"com.study.controller", "com.study.service", "com.study.dao"})
public class MainConfigOfAutowired {
}
//测试
public class MainTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);
//获取controller组件,并打印
PersonController bean = applicationContext.getBean(PersonController.class);
System.out.println(bean);
}
}
结果:
PersonController{personService=PersonService{type=0}} //自动装配成功
===========================================================================
//测试自动装配按照类型装配,当同类型组件有多个时,按照组件id装配
//修改配置类,使用@Bean注解注册personcontroller类型组件
@Configuration
@ComponentScan({"com.study.controller", "com.study.service", "com.study.dao"})
public class MainConfigOfAutowired {
//指定组件id为personService1
@Bean("personService1")
public PersonService personService() {
PersonService personService = new PersonService();
//设置type为1,区分同类型的组件
personService.setType(1);
return personService;
}
}
//修改personController中的属性personService为personService1时
@Autowired
private PersonService personService1;
得到的结果是:PersonController{personService1=PersonService{type=1}}
//说明:@Autowired自动装配当有多个同类型组件时,是按照id查找组件
===========================================================================
//使用@Qualifier注解指定id
@Qualifier("personService")
@Autowired
private PersonService personService1;
得到的结果是:PersonController{personService1=PersonService{type=0}}
//说明:使用@Qualifier指定组件id时,则@Autowired按照属性名称查找组件则不生效!属性名称==>组件id
2. 方法
@Autowired一般标注在装配的组件的set方法上。
Spring容器创建当前对象,就会调用set方法,set方法的参数组件会从IOC容器中获取!
private PersonService personService1;
@Autowired
public void setPersonService(PersonService personService1) {
this.personService1 = personService1;
}
3. 构造器
容器启动的时候调用构造器创建对象,再进行初始化赋值!
- 使用构造器来进行装配的时候,@Autowired注解可以省略不写!参数的组件还是可以自动从IOC容器中获取得到!
@Autowired
public PersonController(PersonService personService1) {
this.personService1 = personService1;
}
4. 参数
public PersonController(@Autowired PersonService personService1) {
this.personService1 = personService1;
}
结果都是:PersonController{personService=PersonService{type=1}}
(二)@Resource
和@Autowired注解一样可以完成自动装配功能!
默认是按照组件的名称id进行装配的!
Java规范的注解,不支持@Primary注解!
//使用@Resource注解自动装配
@Resource
private PersonService personService1;
结果:PersonController{personService=PersonService{type=1}}
//说明:@Resource注解查找组件是按照组件名称id,进行装配!