装配Bean的三种方式
自动化装配Bean
自动化装配依赖组件扫描@ComponentScan
,该注解默认会扫描当前包以及当前包下的所有组件,装配到spring容器中。
可以扫描哪些组件
@Component
@Service
@Controller
等
指定扫描的位置
默认会扫描当前包以及这个包下的所有子包。也可以指定扫描的基础包
@ComponentScan("com.bike")
或者@ComponentScan(basePackages="com.bike")
为组件扫描的Bean命名
spring应用上下文中所有的bean都会给定一ID.如果没有明确的给Bean设置ID,那么spring会根据类名为其指定一个ID(类名的第一个字母变为小写)。
如果想为Bean设置不同的ID,那么可以把期望的ID值传递给@component注解。@Componet("name1")
尽管自动化装配很方便,但如果我们想将第三方的组件装配到spring容器,那么自动化装配就行不通了,因为没有办法在它的类上添加@Component.在这种情况下就需要采用显示装配,有两种可选方案:java
和XML.
显示配置Bean–java
方式
声明简单Bean
通过@Configuration创建配置类,然后在配置类中编写一个方法,该方法会创建所需类型的实例,然后给这个方法添加@Bean注解,如下所示
@Configuration
public class Config{
@Bean
public Student student(){
return new Student();
}
}
@Bean注解告诉spring这个方法将会返回一个对象,该对象要注册到Spring容器中。
默认情况下,通过这种方式配置的Bean的ID和方法名一样。上例中的bean的ID就是student。如果你想为其设置一个不同的名字,那么可以重命名该方法,或者通过name属性指定Bean的ID
@Configuration
public class Config{
@Bean(name="happyStudent")
public Student student(){
return new Student();
}
}
JavaConfig
依赖注入
这种声明的bean很简单,他自身没有其他依赖。但如果我们要声明的Bean依赖于其他对象,比如Student对象依赖于Book对象,如何通过JavaConfig
实现注入呢?
显示配置Bean–XML方式
首先要明确,学习XML方式只是为了帮助维护已有的XML配置,在进行新的Spring工作时,首选的还是自动化配置和JavaConfig
。现在我们有一个Student类如下,那我们怎么通过xml
方式将Bean加载到spring容器中呢?
public class Student {
private Book book;
private String name;
private List<String> friends;
public Student() {
};
public Student(final Book book) {
this.book = book;
}
public Book getBook() {
return book;
}
public void setBook(final Book book) {
this.book = book;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
public List<String> getFriends() {
return friends;
}
public void setFriends(final List<String> friends) {
this.friends = friends;
}
}
第一步,创建一个标准的xml
配置文件,该配置文件的顶部声明多个xml
模式(xsd
)文件,这些文件定义了配置Spring的xml
元素。通过将book声明为一个Bean.然后通过构造器和属性注入依赖和字面值。
<?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:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<!--创建Book实例,该Bean的id是book -->
<bean id="book" class="com.study.FirstSpringBoot.dto.Book">
<!--借助构造器注入字面值 -->
<constructor-arg value="三国"/>
</bean>
<bean id="Student"
class="com.study.FirstSpringBoot.dto.Student">
<!--借助构造器注入依赖Bean ref引用的是依赖bean的ID-->
<constructor-arg ref="book"/>
<!--属性注入字面值 -->
<property name="name" value="zhangsan" />
<!--装配集合 -->
<property name="friends">
<list>
<value>lisi</value>
<value>wangwu</value>
</list>
</property>
</bean>
</beans>
接下来如何让spring发现这个xml
文件,并把其中的bean实例化到容器中呢?
答案就是@ImportResource
注解,将该注解添加到配置类上,如下所示:
@ImportResource("classpath:Student.xml")
@Configuration
public class StudentConfig {
}
如此,xml
配置的bean就加载到了spring容器中了。