乐趣区

关于spring:spring注解开发ConfigurationBean

Configuration&Bean

应用 XML 形式

首先新建一个 maven 工程,增加如下依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.6.RELEASE</version>
</dependency>

其次新建一个 bean

package com.yefengyu.spring.test.bean;

public class Person {
    private String name;
    private Integer age;
    
    public Person(String name, Integer age){
        this.name = name;
        this.age = age;
    }

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

    public Integer getAge() {return age;}

    public void setAge(Integer age) {this.age = age;}

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

再次创立一个 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="person" class="com.yefengyu.spring.test.bean.Person">
        <property name="age" value="30"/>
        <property name="name" value="yefengyu"/>
    </bean>
    
</beans>

最初测试

package com.yefengyu.spring.test.bean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
        Person person = (Person) ctx.getBean("person");
        System.out.println(person);//Person{name='yefengyu', age=30}
    }
}

应用注解的形式

不须要 xml 文件,然而须要一个能够替换 xml 配置文件的配置类

package com.yefengyu.spring.test.bean;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// 配置类等于配置文件
@Configuration// 通知 spring 这是一个配置类
public class Config {
    
    @Bean// 给容器注册一个 bean,类型为返回值类型,id 默认为办法名称
    public Person person() {return new Person("yefengyu", 28);
    }
}

测试

package com.yefengyu.spring.test.bean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Client {public static void main(String[] args) {ApplicationContext ctx= new AnnotationConfigApplicationContext(Config.class);
        Person person = ctx.getBean(Person.class);
        System.out.println(person);//Person{name='yefengyu', age=30}
    }
}

下面是用的 bean 的类型来获取,也能够应用 bean 的名称,也就是以前配置文件的 id

Person person = (Person) applicationContext.getBean("person");

留神:

  • 首先 id 默认为办法名称,也就是 Config 类 中的 person 办法
  • 其次也能够不和办法名称统一,这个时候次要在 bean 的注解上加上一个值,如下所示,示意不应用默认形式,咱们给 bean 自定义 ID
@Configuration
public class Config {@Bean("getPerson")
    public Person person() {return new Person("yefengyu", 30);
    }
}

此时如果使 ID 来获取 bean,只能是 getPerson,不是应用 person,你指定了 ID,就不能应用默认的 ID。

最初阐明下:

在 xml 中 bean 的 id 也就是 bean 的名称,只是一个标识,在 xml 中应用 id 这个属性而不是用 name,然而咱们能够通过一个办法来获取,依据这个办法的名称咱们猜想 id 和名称表白的意思很相近,就是注解和 xml 配置中惟一标识 bean 的标记。

public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
    String[] names = ctx.getBeanDefinitionNames();
    for (String name : names) {System.out.println(name);
    }
}

后果如下:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
config
person
退出移动版