话说上回,上篇文章介绍了使用XML的方式做依赖注入。
快速回顾:主要是使用配置文件实现属性成员的依赖注入,这样做的好处是:解耦
<bean id="person" class="juejin.di.bean.Person">
<property name="pet" ref="dog"></property>
<property name="name" value="Chengyunlai"></property>
</bean>
该篇再分享一下注解的依赖注入以及依赖查找方面的内容。
注解版的依赖查找
回想一下,注解版定义bean
是在配置类(@Configuration
)中使用@Bean
标注方法,方法通过New
的方式得到需要的bean
。
@Bean
public Person person(){
Person person = new Person();
return person;
}
- 对标XML的普通属性注入(value):
其实直接调用该类的setter
方法即可。
Person person = new Person();
person.setName("Chengyunai"); //setter注入
return person;
这时候会产生一个问题,虽然是调用了setter注入,但是这还是在代码中,属于硬编码的范围,但是Spring提供了读取外部properties文件的配置。见我这篇文章 Spring基础篇:利用注解将外部Properties属性注入到Bean中的方法 - 掘金 (juejin.cn)
这样就解决了硬编码的问题,同时做了代码解耦。
- 对标XML的类成员属性注入(ref)
其实也非常简单,主要还是调用setter
方法,但是注入的内容是Spring管理的bean
@Bean
public Pet pet(){
Pet dog = new Dog();
return dog;
}
上面的代码,是Spring管理了一个Pet
类,我们在Person
中注入时应该是这样,直接调用定义好的方法即可。
@Bean
public Person person(){
Person person = new Person();
person.setPet(pet()); // 直接调用上面定义的方法即可
return person;
}
依赖查找
依赖查找其实是主动声明出Spring容器的上下文,声明后向容器中去查询内容。
它的核心内容是:
这个例子以读取配置文件的方式;读取配置类则使用:AnnotationConfigApplicationContext
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("xxx.xml");
Person person = ctx.getBean(Person.class);
它有两个动作:
- 读取配置文件,通过方法得到上下文。
- 通过上下文拿到其中的
bean
注意,通常依赖查找是直接查出Spring管理的bean
,它无法做一些属性注入的内容,所以配置时应该要将依赖注入和依赖查找搭配使用。相比较的话,依赖注入还有很多其他的使用方法,可以实现类与类之间的关联,所以依赖注入会用的更频繁。