Bean 的注册方式:
- xml <bean>
- @Bean 注解
- @Component 及其派生出来的注解 @Service、@Controller、@Repository;其他规范类似功能的注解,@Resource、@Inject
- @Import
- BeanDefinitionRegistry#registerBeanDefinition
- BeanDefinitionReaderUtils#registerWithGeneratedName
- AnnotatedBeanDefinitionReader#register
- SingletonBeanRegistry#registerSingleton
...
代码示例:
pom
<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>
<parent>
<groupId>constxiong</groupId>
<artifactId>spring-study</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>006-spring-bean-register</artifactId>
<properties>
<spring-version>5.2.2.RELEASE</spring-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
</dependencies>
<build>
</build>
</project>
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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="user1" class="constxiong.User"/>
<!-- 开启注解能力 -->
<context:component-scan base-package="constxiong"/>
</beans>
User 类
package constxiong;
public class User {
private Integer id;
private String name;
public User() {
}
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}
测试代码:
package constxiong;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.AnnotatedBeanDefinitionReader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
/**
* 测试 Bean 注册
* @author ConstXiong
*/
@Configuration
@Import(Other.class)
public class Test {
public static void main(String[] args) {
// xml <bean> 注册
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring-bean-register.xml");
User user1 = context.getBean("user1", User.class);
System.out.println(user1);
// @Bean 注册
User user2 = context.getBean("user2", User.class);
System.out.println(user2);
// @Component 注册
Friend friend = context.getBean("test.Friend", Friend.class);
System.out.println(friend);
// @Import 注册
Other other = context.getBean("constxiong.Other", Other.class);
System.out.println(other);
// BeanDefinitionRegistry#registerBeanDefinition() 注册
RootBeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClass(User.class);
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.addPropertyValue("id", 3);
propertyValues.addPropertyValue("name", "custom");
beanDefinition.setPropertyValues(propertyValues);
((DefaultListableBeanFactory)context.getBeanFactory()).registerBeanDefinition("custom", beanDefinition);
User custom = context.getBean("custom", User.class);
System.out.println(custom);
// BeanDefinitionReaderUtils#registerWithGeneratedName() 注册
beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClass(User.class);
propertyValues = new MutablePropertyValues();
propertyValues.addPropertyValue("id", 4);
propertyValues.addPropertyValue("name", "util");
beanDefinition.setPropertyValues(propertyValues);
beanDefinition.setPrimary(true);
BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, (DefaultListableBeanFactory)context.getBeanFactory());
System.out.println(context.getBean(User.class));
// AnnotatedBeanDefinitionReader#registerBean() 注册
AnnotatedBeanDefinitionReader reader = new AnnotatedBeanDefinitionReader((DefaultListableBeanFactory)context.getBeanFactory());
reader.registerBean(User.class, "annotated");
System.out.println(context.getBean("annotated", User.class));
// SingletonBeanRegistry#registerBean() 注册
context.getBeanFactory().registerSingleton("singleton", new User(6, "singleton"));
System.out.println(context.getBean("singleton"));
}
@Bean
static User user2() {
return new User(1, "constxiong");
}
@Component
static class Friend {
private int id = 10;
private String name = "friend";
@Override
public String toString() {
return "Friend{" +
"id=" + id +
", name='" + name + ''' +
'}';
}
}
}
class Other {
private int id = 10;
private String name = "other";
@Override
public String toString() {
return "Other{" +
"id=" + id +
", name='" + name + ''' +
'}';
}
}
【Java学习资源】整理推荐
- Bean 的作用域
- maven 集成 tomcat 以 jar 的方式打包 web 应用
- Spring 依赖注入与依赖查找来源的区别
- Spring 依赖注入的处理过程与 DependencyDescriptor 的说明
- Spring 各种 Aware 接口回调注入
- Spring Bean 生命周期内的 Exception 复现
- Spring 内建 Bean
- Spring Bean 的别名
- Spring Bean 未指定名称的命名规则
- Bean 何时被 GC
- Spring Bean 延迟加载
- ObjectFactory 与 BeanFactory 的区别
- Bean 销毁的方式与顺序
- Bean 初始化的方式与顺序
- Bean 的实例化方式
- Bean的注册方式
- 什么是 BeanDefinition?
- Spring IoC 容器启动时做了什么?
- BeanFactory 与 FactoryBean 的区别
- BeanFactory 与 ApplicationContext 的区别
- Spring IoC 依赖注入的实现方式
- Spring IoC 依赖注入(支持哪些数据类型?)
- Spring bean 依赖查找
- Spring-IoC
- Spring 的核心特性