- 1.在
xml
配置文件中加载bean - 2.使用
@Component
类注解加载bean - 3.使用
@Bean
注解加载bean - 4.使用
@ImportResource
导入bean - 5.使用
@Import
导入bean - 6.使用
AnnotationConfigApplicationContext
注册bean
1.在xml
配置文件中加载bean
<bean id="user" class="com.test.bean.user"/>
2.使用@Component
类注解加载bean
- 需要注意:类必须在扫描范围
ComponentScan
内,否则注解不生效 @Component
有三个常用的衍生注解@Controller
:用于控制层@Service
:用于服务层,处理业务@Repository
:用于数据层,访问数据
@Component
public class User {
}
3.使用@Bean
注解加载bean
- 有两种实现方式
- 第一种是在配置类中直接创建对象
return new User()
- 第二种是实现
FactoryBean
- 第一种是在配置类中直接创建对象
3.1 配置类中直接创建对象
@Configuration
public class MyConfig {
@Bean
public User user(){
return new User();
}
}
3.2 实现FactoryBean
- 创建
UserFactoryBean
类,并实现FactoryBean
public class UserFactoryBean implements FactoryBean<User> {
@Override
public User getObject() throws Exception {
return new User();
}
@Override
public Class<?> getObjectType() {
return User.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
- 配置类中使用
UserFactoryBean
加载bean
@Configuration
public class MyConfig {
@Bean
public UserFactoryBean user(){
return new UserFactoryBean();
}
}
4.使用@ImportResource
导入bean
-
@ImportResource
用于从指定配置文件加载bean -
创建配置文件
config1.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="user" class="com.test.bean.User"/>
</beans>
- 配置类使用
@ImportResource
导入配置文件
@Configuration
@ImportResource("config1.xml")
public class MyConfig {
}
5.使用@Import
导入bean
@Import
有多方式
5.1 @Import
将指定的类加载为bean
- 配置类中使用
@Import
指定需要加载的bean
@Configuration
@Import({User.class, Role.class})
public class MyConfig {
}
5.2 导入ImportSelector
- 这种方式的好处是可以通过
AnnotationMetadata
获取到MyConfig
配置类的相关信息 - 创建
MyImportSelector
类,并实现ImportSelector
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.test.bean.User", "com.test.bean.Role"};
}
}
- 配置类中使用
@Import
导入MyImportSelector
@Configuration
@Import(MyImportSelector.class)
public class MyConfig {
}
5.3 导入ImportBeanDefinitionRegistrar
- 创建
MyBeanRegistrar
类,并实现ImportBeanDefinitionRegistrar
public class MyBeanRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
AbstractBeanDefinition definition = BeanDefinitionBuilder.rootBeanDefinition(User.class)
.getBeanDefinition();
registry.registerBeanDefinition("user", definition);
}
}
- 配置类中使用
@Import
导入MyBeanRegistrar
@Configuration
@Import(MyBeanRegistrar.class)
public class MyConfig {
}
5.4 导入BeanDefinitionRegistryPostProcessor
- 这种方式的好处是可以对bean进行后处理,可以修改已经加载的bean或添加自定义的bean
- 创建
MyBeanPostProcessor
类,并实现BeanDefinitionRegistryPostProcessor
public class MyBeanPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
AbstractBeanDefinition definition = BeanDefinitionBuilder.rootBeanDefinition(User.class)
.getBeanDefinition();
registry.registerBeanDefinition("user", definition);
}
}
- 配置类中使用
@Import
导入MyBeanPostProcessor
@Configuration
@Import(MyBeanPostProcessor.class)
public class MyConfig {
}
6.使用AnnotationConfigApplicationContext
注册bean
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig.class);
ctx.register(User.class);
System.out.println(ctx.getBean("user"));
}