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

被折叠的 条评论
为什么被折叠?



