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