Spring注入Bean的四种方式,看这一篇就够了

本文详细介绍了Spring框架中注入Bean的四种方法:1. XML配置;2. 使用@Configuration和@Bean,配合@Conditional进行条件注入及@Scope、@Lazy设置;3. 利用@Import导入Bean,包括ImportSelector和ImportBeanDefinitionRegistrar接口的运用;4. 实现FactoryBean接口结合@Bean。了解这些,将全面理解Spring Bean的注入机制。

1.通过xml配置注入bean

<bean id="user" class="com.asong.User">
		<property name="name" value="asong"></property>
		<property name="age" value="19"></property>
</bean>

2.通过配置类和@Bean注解注入bean(@Configuration、@Bean)

@Configuration
public class Config {
	//给容器中注册一个bean, 类型为返回值的类型, 
	@Bean("user")	//bean的id
	public User user(){
		return new Person("asong",19);
	}
}

可以和@Conditional连用,此时为条件注入,需要实现Spring提供的Condition接口

@Conditional({xxx.class,xx.class})

@Scope可以设置单例或多例,Spring默认为单例,参数可设置为以下四种

* prototype:多实例: IOC容器启动的时候,IOC容器启动并不会去调用方法创建对象, 而是每次获取的时候才会调用方法创建对象
* singleton:单实例(默认):IOC容器启动的时候会调用方法创建对象并放到IOC容器中,以后每次获取的就是直接从容器中拿(大Map.get)的同一个bean
* request: 主要针对web应用, 递交一次请求创建一个实例
* session:同一个session创建一个实例

@Lazy注解可以设置Bean懒加载,即使用时加载(Spring默认ioc容器创建时加载Bean)

3.通过配置类和@Import注解注入bean,默认id为类全名(包名+类名)

@Configuration
//参数为Bean的class,也可以为ImportSelector和ImportBeanDefinitionRegistrar的实现类class
@Import(value = { User.class,Dog.class})
public class Config {

    ...
}

@Import这里的参数为class数组,可以传入Bean的class,也可以传入ImportSelector和ImportBeanDefinitionRegistrar的实现类class

接口ImportSelector:Spring提供的一个接口,可以指定传入的Bean,需要实现String[] selectImports方法,返回值为Bean类全名的String数组

public class CustomImportSelector implements ImportSelector{
	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata){
        //AnnotationMetadata:当前类的注解信息
		//返回值bean的类全名
		return new String[]{"com.xx.User","com.xx.Dog"};
	}
}

接口ImportBeanDefinitionRegistrar:Spring提供的一个接口,可以根据需要通过BeanDefinitionRegistry注册器注册Bean

public class CustomImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

	/*
	*AnnotationMetadata:当前类的注解信息
	*BeanDefinitionRegistry:BeanDefinition注册类
	*/
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		boolean bean1 = registry.containsBeanDefinition("com.xxx.User");
		boolean bean2 = registry.containsBeanDefinition("com.xxx.Dog");
		// TODO 如果User和Dog同时存在于我们IOC容器中,那么创建Cat类, 加入到容器
		// 对于我们要注册的bean, 需要使用RootBeanDefinition进行封装
		if(bean1 && bean2){
			RootBeanDefinition beanDefinition = new RootBeanDefinition(Cat.class);
			registry.registerBeanDefinition("cat", beanDefinition);
		}
	}

}

4.实现FactoryBean接口,和@Bean注解一起使用

@Configuration
public class Config {
	//通过Spring的工厂bean注册
	@Bean
	public PigFactoryBean pigFactoryBean(){
		return new PigFactoryBean();
	}
}
public class PigFactoryBean implements FactoryBean<Pig>{

	@Override
	public Pig getObject() throws Exception {
		// TODO Auto-generated method stub
		return new Pig();
	}

	@Override
	public Class<?> getObjectType() {
		// TODO Auto-generated method stub
		return Pig.class;
	}
	
	@Override
	public boolean isSingleton() {
		return true;
	}
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值