Spring Boot 学习--01.依赖注入@Compenent@Autowired

Spring Boot 学习–01.依赖注入

@Component@Autowired

依赖注入是Spring Boot里非常重要的特性,Dependency Injection。这里的例子是《深入浅出Spring boot2.x》中的例子。

任务说明

人可以通过动物来完成某些工作,比如让狗守门,猫抓老鼠。那么如何来建立他们的关系,即依赖注入呢

注解说明

@Component
装配,用处是表明这个类被扫描进入Spring IoC容器中,可以用来做Bean
@ComponentScan
扫描装配,表明何种策略进行扫描,by name,type,basePackage路径包,
@Autowired
根据属性的类型by type,找到对应的Bean进行注入,可以标注 属性(类前面)、方法(方法前面)、参数(构造方法的参数前面)
@Primary
优先级选择这个Bean,放在Bean前面
@Qualifier
限定,限定就用这个Bean,by name

任务分解

1.创建Bean。
1.1 创建接口Person 、Animal,人类接口有设置动物setAnimal,使用动物service两个方法;动物接口有动物做什么的方法use
1.2 创建实现类 BussinessPerson,实现接口,注入动物Bean,重写接口方法;Dog ,Cat,实现接口,重写接口方法use,说明具体做什么
2.依赖注入
在BussinessPerson中,其本身是一个Bean,用@Autowired注入一个动物,由于注入Bean应该是唯一的,根据Animal类别去查找,发现有Dog 和Cat两个Bean,会报错,
需要用@Primary或者@Qualifier(“dog”) 注意Bean的名字是首字母小写的,
@Autowired可以标注
属性、方法、构造方法的参数

3.配置依赖注入AppConfig
config包下,建立AppConfig.class ,用@Configuration说明这是配置文件,用@ComponentScan说明要扫描装配的方式,一般写包名,包内都扫
4.测试
新建AnnotationConfigApplicationContext类来加载配置文件AppConfig.class。创建person实例,对应BussinessPerson,调用person方法service()

代码

结构
Spring Boot 学习--01.依赖注入@Compenent@Autowired_第1张图片

1.创建Bean。
1.1 创建接口Person 、Animal,人类接口有设置动物setAnimal,使用动物service两个方法;动物接口有动物做什么的方法use
1.2 创建实现类 BussinessPerson,实现接口,注入动物Bean,重写接口方法;Dog ,Cat,实现接口,重写接口方法use,说明具体做什么

package com.king.sbootlearn.pojo.definition;

public interface Animal {
    public void use();
}
package com.king.sbootlearn.pojo.definition;

/**
 * 人类接口  和 动物接口,接下来做实现类pojo下
 */
public interface Person {
    //使用动物服务
    public void service();

    //设置动物
    public void setAnimal(Animal animal);
}

BussinessPerson

package com.king.sbootlearn.pojo;

import com.king.sbootlearn.pojo.definition.Animal;
import com.king.sbootlearn.pojo.definition.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class BussinessPerson implements Person {

    private Animal animal=null;
    public BussinessPerson(@Autowired@Qualifier("dog") Animal animal) {
        this.animal=animal;
    }

    /**
     * Autowired将 动物的bean注入到 BussinessPerson中,实现依赖注入,Bean之间的依赖
     */
//    @Autowired
//    @Qualifier("dog")
//    private Animal animal = null;


    @Override
    public void service() {
        this.animal.use();
    }

    @Override
    public void setAnimal(Animal animal) {
        this.animal=animal;
    }
}

Dog

package com.king.sbootlearn.pojo;

import com.king.sbootlearn.pojo.definition.Animal;
import org.springframework.stereotype.Component;

@Component
public class Dog implements Animal {

    @Override
    public void use() {
        System.out.println("DOg["+Dog.class.getSimpleName()+"]'s job is watch door");
    }
}

Cat

package com.king.sbootlearn.pojo;

import com.king.sbootlearn.pojo.definition.Animal;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;

@Component
@Primary
public class Cat implements Animal {
    @Override
    public void use() {
        System.out.println("cat's name is ["+Cat.class.getSimpleName()+"],and its job is catch mouse");
    }
}

2.依赖注入
在BussinessPerson中,其本身是一个Bean,用@Autowired注入一个动物,由于注入Bean应该是唯一的,根据Animal类别去查找,发现有Dog 和Cat两个Bean,会报错,
需要用@Primary或者@Qualifier(“dog”) 注意Bean的名字是首字母小写的,

见上面BussinessPerson代码块,中有@Autowired属性标注用法,构造方法参数用法

@Component
public class BussinessPerson implements Person {

    private Animal animal=null;
    public BussinessPerson(@Autowired@Qualifier("dog") Animal animal) {
        this.animal=animal;
    }

    /**
     * Autowired将 动物的bean注入到 BussinessPerson中,实现依赖注入,Bean之间的依赖
     */
//    @Autowired
//    @Qualifier("dog")
//    private Animal animal = null;


    @Override
    public void service() {
        this.animal.use();
    }

    @Override
    public void setAnimal(Animal animal) {
        this.animal=animal;
    }
}

3.配置依赖注入AppConfig
config包下,建立AppConfig.class ,用@Configuration说明这是配置文件,用@ComponentScan说明要扫描装配的方式,一般写包名,包内都扫

package com.king.sbootlearn.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.Properties;


/**
 * 配置文件
 *
 */
@Configuration
@ComponentScan("com.king.sbootlearn.*")
//搜索该包下所有Bean
public class AppConfig {

    }
    

4.测试
新建AnnotationConfigApplicationContext类来加载配置文件AppConfig.class。创建person实例,对应BussinessPerson,调用person方法service()

package com.king.sbootlearn.config;

import com.king.sbootlearn.pojo.BussinessPerson;
import com.king.sbootlearn.pojo.User;
import com.king.sbootlearn.pojo.definition.Person;
import com.king.sbootlearn.service.UserService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.logging.Logger;

/**
 *
 */
public class IocTest {
    private static Logger log = Logger.getLogger(String.valueOf(IocTest.class));

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
        //把配置文件读进来,scan对appconfig所在包和子包,所有的bean,扫描装配
        
        Person person = ctx.getBean(BussinessPerson.class);
        person.service();
    }
}

你可能感兴趣的:(java,Spring,boot)