依赖注入是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()
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();
}
}