为了更全面的了解
spring
,买了本spring
实战,在这里记录自己学习的笔记
- 首先创建一个
Maven
工程,pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>top.itreatment</groupId>
<artifactId>springbootTest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
// 这里只导入了一个核心依赖,但是Maven会根据依赖传递,加入其它核心依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
</dependencies>
</project>
-
具体导入的依赖:
为了演示组件扫描和自动装配,这里创建三个类:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class CompartDisc {
@Value("author")
private String author;
@Value("title")
private String title;
@Value("msg")
private String msg;
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "CompartDisc{" +
"author='" + author + '\'' +
", title='" + title + '\'' +
", msg='" + msg + '\'' +
'}';
}
}
public interface MediaPlayer {
void play();
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class CDPlayer implements MediaPlayer {
private CompartDisc disc;
@Autowired
public CDPlayer(CompartDisc disc) {
this.disc = disc;
}
public void play() {
System.out.println(disc.toString());
}
}
- 配置类:
package top.itreatment.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = {"top.itreatment"})
public class MyConfig {
}
- 通过组件扫描和依赖注入,上面会将
CompartDisc
实例加入到CDPlayer
实例中,编写测试进行检验如下:
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import top.itreatment.beans.CompartDisc;
import top.itreatment.beans.MediaPlayer;
import top.itreatment.config.MyConfig;
import static org.junit.Assert.assertNotNull;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyConfig.class)
public class Test {
@Autowired
private MediaPlayer mediaPlayer;
@Autowired
private CompartDisc disc;
@org.junit.Test
public void isNull(){
assertNotNull(disc);
assertNotNull(mediaPlayer);
}
@org.junit.Test
public void play(){
mediaPlayer.play();
}
}
下面将扫描方式改一下,只用显示javaConfig
的方式装配bean
对象:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import top.itreatment.beans.CDPlayer;
import top.itreatment.beans.CompartDisc;
@Configuration
public class MyConfig {
@Bean
CDPlayer cdPlayer(CompartDisc disc){
return new CDPlayer(disc);
}
@Bean
CompartDisc compartDisc(){
CompartDisc compartDisc = new CompartDisc();
compartDisc.setAuthor("author");
compartDisc.setTitle("title");
compartDisc.setMsg("msg");
return compartDisc;
}
}
为了将不同的业务的Bean实例在配置中分开,防止修改的时候太过于复杂。我们可以编写多个配置类,比如:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import top.itreatment.beans.CompartDisc;
@Configuration
@Import(MyConfig1.class)
public class MyConfig {
@Bean
CompartDisc compartDisc() {
CompartDisc compartDisc = new CompartDisc();
compartDisc.setAuthor("author");
compartDisc.setTitle("title");
compartDisc.setMsg("msg");
return compartDisc;
}
}
import org.springframework.context.annotation.Bean;
import top.itreatment.beans.CDPlayer;
import top.itreatment.beans.CompartDisc;
public class MyConfig1 {
@Bean
CDPlayer cdPlayer(CompartDisc disc) {
return new CDPlayer(disc);
}
}
只需要一个
Import
将其他的配置类导入进来就可以。不需要在其他的配置类上标Configuration
注解
- 下面用xml配置文件的形式实现上面的
JavaConfig
<?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:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
<bean class="top.itreatment.beans.CDPlayer" id="cdPlayer"/>
<bean class="top.itreatment.beans.CompartDisc" id="disc">
<property name="author" value="作者"/>
<property name="title" value="标题"/>
<property name="msg" value="信息"/>
</bean>
</beans>
- 然后将配置JavaConfig也要进行一点修改:
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
@ImportResource("classpath:application.xml")
public class MyConfig {
}