当前位置: 代码迷 >> 综合 >> Spring注入Bean的四种方式,看这一篇就够了
  详细解决方案

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

热度:43   发布时间:2024-03-07 03:51:37.0

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的idpublic 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{@Overridepublic 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注册类*/@Overridepublic 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注册@Beanpublic PigFactoryBean pigFactoryBean(){return new PigFactoryBean();}
}
public class PigFactoryBean implements FactoryBean<Pig>{@Overridepublic Pig getObject() throws Exception {// TODO Auto-generated method stubreturn new Pig();}@Overridepublic Class<?> getObjectType() {// TODO Auto-generated method stubreturn Pig.class;}@Overridepublic boolean isSingleton() {return true;}
}

 

  相关解决方案