Spring5入门-09-基于Java的容器配置

一、前言

这是完全不使用Spring的xml配置,全权交给Java来配置Spring。

之前推荐使用XML,从Spring4开始,推荐基于Java的容器配置。



二、准备依赖

spring-webmvc由于继承的关系会有一张依赖网:

image-20200922215433508

算是省心省力吧。

<!--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>


三、样例

路径

image-20201001161055263


代码

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的配置类,事实上,当我们点进去的时候,可以看到:

image-20201001162324474

​ 这表明@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);
    }
}

这里getBeanBeanid是什么?是

  @Bean
  public User user(){
      return new User();
  }

中的方法名,即user()user
这种方法没有xml配置文件,这么这么获取容器?仔细打开ApplicationContext的代码,寻找其实现类可以发现如下:

image-20201001163142155


测试结果

image-20201001163329869

posted @ 2020-10-01 16:35  杜撰丶  阅读(118)  评论(0编辑  收藏  举报