4、使用注解开发
7、自动装配
说白了:就是偷懒的
7.1、ByName
一个人有一只猫和一条狗狗
<bean id="cat" class="bing.Cat"></bean>
<bean id="dog" class="bing.Dog"/>
<!-- ByName:表示通过name在当前页面寻找:person种set后面的值的id-->
<bean id="person" class="bing.Person" autowire="byName" />
注意:id必须一致
7.2、ByType
<!-- ByType:表示通过type在当前页面寻找:person中的属性类型相同的类(bean)-->
<bean id="person2" class="bing.Person" autowire="byType"/>
注意:单个可用,多个直接爆红!
7.3、通过注解自动转配
步骤:
-
指定context命名空间
-
在xml中定义可以使用注解<context:annotation-config/>
-
在原类中用
xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 我们加上注解使用注解开发的命名空间1、在上面添加 2、在下面指定要用-->
<context:annotation-config/>
<bean id="cat1" class="bing.Cat"/>
<bean id="cat2" class="bing.Cat"/>
<bean id="dog" class="bing.Dog"/>
<bean id="person" class="bing.Person"/>
java文件
package bing;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
/**
* @author zhangbingbing
* @version 1.0
* @date 2020/5/17 19:43
*/
public class Person {
//Autowired注解会去此类配置的beans.xml中通过 ByName 和 ByType方式寻找属性的值,这里甚至可以省略set方法
@Autowired
@Qualifier("cat1")
private Cat cat;
@Autowired
private Dog dog;
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
注意:Autowired注解是默认用 ByName 和ByType去寻找,如果都不满足则报错,我们还可以使用
@Qualifier("cat1")来配合它,它就是指定找哪一个的!
拓展:
javax中的Resource注解也可以完成这个功能,更加强大!
@Resource
private Cat cat;
@Resource
private Dog dog;
功能类似
8、使用注解开发
## 常用依赖
```pom
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
```
## 注解
### 自动装配注解
- @Autowired
- 自动装配,先ByType寻找,在ByName寻找,如果找不到报错
- 但是我们可以配合@Qualifier("dog")直接要找的地方
- @Resource
- 自动装配,先ByName寻找,在ByType寻找,如果找不到报错
- @Nullable
可以让参数什么的为空的注解
- @Component: 相当于<bean id="user" class="bing.User"/>,默认id为类名小写
1、bean注入
- @Component: 相当于
,默认id为类名小写
2、属性注入@Value(属性值)
可以省去set方法
- 可以在属性前加上@Value(属性值)
- 也可以在set方法前加上@Value(属性值)
package bing;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author zhangbingbing
* @version 1.0
* @date 2020/5/18 10:42
*/
@Component()//相当于:<bean id="user" class="bing.User"/>
public class User {
@Value("rabbit") //相当于<property name="name" value="rabbit"/>
private String name;
@Value("19")
private int age;
private String gender;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
@Value("girl")
public void setGender(String gender) {
this.gender = gender;
}
}
3、衍生注解
- 1、@Component衍生出的注解
为了三层架构职责分明和Compinent作用相同
- @Controller :servlet层也就是控制层
- @Service : service层
- @Repository :dao层
功能都一样,都是注入bean
- 2、自动装配注解
第七章讲过了,就是装配类的属性的,一个人的猫咪和狗狗
- 3、作用域注解scope
@Component()//相当于:<bean id="user" class="bing.User"/>
@Scope("singleton") //相当于<bean scope="singleton"/>
public class User {
@Value("rabbit") //相当于<property name="name" value="rabbit"/>
private String name;
@Value("19")
小结
xml和注解的比较:
- xml功能更加强大,适用于任何场景,结构清晰
- 注解:操作简洁,配置方便,不适用于复杂的场景
理想状态:
使用xml配置bean,也就是创建对象,指定scope等等。
使用注解进行属性注入,这种情况不需要扫描包,只需要加:
在xml中定义可以使用注解<context:annotation-config/>