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、通过注解自动转配

步骤:

  1. 指定context命名空间

  2. 在xml中定义可以使用注解<context:annotation-config/>
    
  3. 在原类中用

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/>

posted @ 2020-05-27 23:06  贝加尔湖畔╭  阅读(127)  评论(0编辑  收藏  举报