Spring5入门-09-基于Java的容器配置
一、前言
-
参考视频:遇见狂神说-Spring5
-
参考文档:官方文档
-
使用:
- IDEA 2019.3
- Maven
- Spring 5.2.9.RELEASE
- Junit 4.12
这是完全不使用Spring的xml配置,全权交给Java来配置Spring。
之前推荐使用XML,从Spring4开始,推荐基于Java的容器配置。
二、准备依赖
spring-webmvc由于继承的关系会有一张依赖网:
算是省心省力吧。
<!--Spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!--JUnit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
三、样例
路径
代码
Role
package com.duzhuan.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @Autord: HuangDekai
* @Date: 2020/10/1 11:23
* @Version: 1.0
* @since: jdk11
*/
@Component
public class Role {
@Value("2")
private int rid;
@Value("user")
private String roleName;
public int getRid() {
return rid;
}
public void setRid(int rid) {
this.rid = rid;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
@Override
public String toString() {
return "Role{" +
"rid=" + rid +
", roleName='" + roleName + '\'' +
'}';
}
}
User
package com.duzhuan.pojo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @Autord: HuangDekai
* @Date: 2020/9/30 22:07
* @Version: 1.0
* @since: jdk11
*/
public class User {
@Value("1")
private int id;
@Value("duzhuan")
private String name;
@Autowired
private Role role;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", role=" + role +
'}';
}
}
可以看到,这里的role使用了@Autowired
,对应前面Role.java里的@Component
。
SpringConfig
package com.duzhuan.config;
import com.duzhuan.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* @Autord: HuangDekai
* @Date: 2020/9/30 22:08
* @Version: 1.0
* @since: jdk11
*/
@Configuration
@ComponentScan("com.duzhuan")
public class SpringConfig {
@Bean
public User user(){
return new User();
}
}
可以看到,多了几个注解。
@Configuration
表明这是一个Spring的配置类,事实上,当我们点进去的时候,可以看到:
这表明@Configuration
也是一个组件。
-
@ComponentScan("com.duzhuan")
等价于xml配置文件里的<context:component-scan base-package="com.duzhuan"/>
-
@Bean
则需要放在如上格式的代码中。这样有一个显而易见的好处,比如当User
是一个接口类时,可以很轻易的返回具体的实现类的对象。 -
@Bean public User user(){ return new User(); }
就等价于:
<bean id="user" class="com.duzhuan.pojo.User"> <一些注入的属性..............> </bean>
对于基于Java的容器配置的Sping来说,注入的属性则在其他地方配置了。
测试样例
package com.duzhuan.config;
import com.duzhuan.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @Autord: HuangDekai
* @Date: 2020/10/1 11:18
* @Version: 1.0
* @since: jdk11
*/
public class SpringConfigTest {
@Test
public void userTest(){
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
User user = context.getBean("user", User.class);
System.out.println(user);
}
}
这里getBean
中Bean
的id
是什么?是
@Bean
public User user(){
return new User();
}
中的方法名,即user()
的user
。
这种方法没有xml配置文件,这么这么获取容器?仔细打开ApplicationContext
的代码,寻找其实现类可以发现如下:
测试结果