Spring学习-自动装配
Spring自动配置的两个核心功能为:1.组件扫描;2.自动装配。
组件扫描就是指将@ComponentScan注解指定路径下的@Component,@Controller,@Service,@Repository,等注解标记的类注册到Spring上下文当中,这个过程假设所有的组件相互之间没有依赖。
但是现实不可能这么简单!缺少依赖关系的组件也很难实现有用的功能,因此自动装配的重要性也就显而易见,所谓自动装配是指利用@Autowired注解将已经扫描注册的bean注入到当前bean当中,用于构建更加复杂的bean。
需要注意的是,通常情况下,组件装配的时候,必须有唯一标识的bean存在,方可以注入到当前对象当中。
所谓唯一标识,包含两层意思。第一,至少存在一个该类型的bean实例;第二,已存在的该类型bean的实例,其名称不能冲突,需要区别开来。
1.项目结构
本项目所使用IDE为Idea,项目框架为Springboot,为了减少不必要的模板,项目采用lombok生产Getter和Setter等,项目文件结构如下所示。
├─src
│ ├─main│ │ ├─java
│ │ │ └─com
│ │ │ └─liguang
│ │ │ └─springboot
│ │ │ │ Config.java
│ │ │ │ SpringbootApplication.java
│ │ │ │
│ │ │ ├─CDplayer
│ │ │ │ └─soundSystem
│ │ │ │ ├─bean
│ │ │ │ │ CompactDisc.java
│ │ │ │ │ SgtPeppers.java
│ │ │ │ │
│ │ │ │ └─config
│ │ │ │ CDPlayerConfig.java
│ │ │ │
│ │ │ ├─knight
│ │ │ │ ├─bean
│ │ │ │ │ Knight.java
│ │ │ │ │
│ │ │ │ ├─config
│ │ │ │ │ KnightConfig.java
│ │ │ │ │
│ │ │ │ ├─controller
│ │ │ │ │ KnightController.java
│ │ │ │ │
│ │ │ │ └─dto
│ │ │ │ Minstrel.java
│ │ │ │
│ │ │ └─wizzard
│ │ │ └─dto
│ │ │ EvilWizzard.java
│ │ │
│ │ └─resources
│ │ │ application.properties
│ │ │ spring.xml
项目启动类为SpringBootApplication,本项目采用xml配置文件和JavaConfig注解两种方式混合配置。
2.xml配置定义bean
xml配置文件中定义了一个bean:EvilWizzard.class
package com.liguang.springboot.wizzard.dto;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.List;
import java.util.Set;
@Setter
@Getter
@ToString
public class EvilWizzard {
// string类型的set
private Set<String> magic;
// string类型的list
private List<String> weapons;
// string类型
private String sex;
// int类型
private int age;
}
为了验证不同类型变量的注入方式,该bean包含了set,list,string,int等几种类型变量,xml配置文件为spring.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="evilWizard" class="com.liguang.springboot.wizzard.dto.EvilWizzard">
<property name="age" value="500"/>
<property name="sex" value="male"/>
<property name="weapons">
<list>
<value>sword</value>
<value>Broom</value>
</list>
</property>
<property name="magic">
<set>
<value>change weather</value>
<value>call skeleton</value>
</set>
</property>
</bean>
</beans>
3.JavaConfig配置定义bean
为了将xml配置文件引入到JavaConfig配置文件,需要使用@ImportResource注解,其属性locations指定了spring.xml配置文件的位置。
package com.liguang.springboot.knight.config;
import com.liguang.springboot.knight.dto.Minstrel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
@ImportResource(locations = "classpath:spring.xml")
public class KnightConfig {
@Bean(value = "minstrel")
public Minstrel minstrel() {
Minstrel minstrel = new Minstrel(System.out);
minstrel.setId(1);
return minstrel;
}
}
*配置类为com.liguang.springboot.Config,该配置类导入上述配置类,汇总所有配置。
4.Controller结构
package com.liguang.springboot.knight.controller;
import com.liguang.springboot.knight.bean.Knight;
import com.liguang.springboot.knight.dto.Minstrel;
import com.liguang.springboot.CDplayer.soundSystem.bean.SgtPeppers;
import com.liguang.springboot.wizzard.dto.EvilWizzard;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/knight")
public class KnightController {
@Autowired
Minstrel minstrel;
@Autowired
Knight knight;
@Autowired
SgtPeppers sgtPeppers;
@Autowired
EvilWizzard evilWizzard;
@RequestMapping("/quest")
public String quest() {
System.out.println(knight);
minstrel.singBeforeQuest();
minstrel.singAfterQuest();
sgtPeppers.play();
return evilWizzard.toString();
}
}
为了测试bean组件能够成功装配,创建一个controller,将各个bean注入,运行项目,可以查看结果:http://localhost:8080/knight/quest
输出内容为:EvilWizzard(magic=[change weather, call skeleton], weapons=[sword, Broom], sex=male, age=500)
本项目GitHub地址,欢迎有兴趣的同学关注:点击打开GitHub链接
上一篇: SpringMVC的校验和国际化3
下一篇: GCC簡單介紹