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; } }