1、通过 name 获取对象
2、通过 factoryBean 获取对象
3、通过类型获取对象
4、通过类型获取对象集合
5、通过指定注解获取对象
6、通过 BeanProvider 获得对象
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="com.dependency.domain.User">
<property name="id" value="123"></property>
<property name="name" value="zhangsan"></property>
</bean>
/* 当希望从容器中获取到一个bean对象的时候,容器中却找到了多个匹配的bean,此时spring不知道
* 如何选择了,处于懵逼状态,就会报异常。
* spring中可以通过bean元素的primary属性来解决这个问题,可以通过这个属性来指定当前bean为
* 主要候选者,当容器查询一个bean的时候,如果容器中有多个候选者匹配的时候,此时spring会返
* 回主要的候选者
*/
<bean id="superUser" class="com.dependency.domain.SuperUser" parent="user" primary="true">
<property name="address" value="弯弯的小河"></property>
</bean>
<bean id="objectFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
<property name="targetBeanName" value="user"></property>
</bean>
</beans>
public class TestSpringUtil {
public static void main(String[] args) {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("META-INF/spring-bean.xml");
// 通过名称获取对象
getBeanByName(beanFactory);
// 延迟获取对象
getBeanByObjectFactory(beanFactory);
// 通过类型获取对象
getBeansByType(beanFactory);
// 通过类型获取对象集合
getCollectionBeansByType(beanFactory);
// 通过指定注解获取对象
getBeansByAnnoation(beanFactory);
}
/**
* 通过名称获取对象
*/
private static void getBeanByName(BeanFactory beanFactory) {
User user = (User) beanFactory.getBean("user");
System.out.println("通过名称获取对象:" + user);
}
/**
* 延迟获取对象
*/
private static void getBeanByObjectFactory(BeanFactory beanFactory) {
ObjectFactory<User> objectFactory = (ObjectFactory) beanFactory.getBean("objectFactory");
User user = objectFactory.getObject();
System.out.println("延迟获取对象:" + user);
}
/**
* 通过类型获取对象
*/
private static void getBeansByType(BeanFactory beanFactory) {
User user = beanFactory.getBean(User.class);
System.out.println("通过类型获取对象:" + user);
}
/**
* 通过类型获取对象集合
*/
private static void getCollectionBeansByType(BeanFactory beanFactory) {
if(beanFactory instanceof ListableBeanFactory){
ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory;
Map<String, User> users = listableBeanFactory.getBeansOfType(User.class);
System.out.println("通过类型获取对象集合:"+ users);
}
}
/**
* 通过指定注解获取对象
*/
private static void getBeansByAnnoation(BeanFactory beanFactory) {
if(beanFactory instanceof ListableBeanFactory){
ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory;
Map<String, User> users = (Map)listableBeanFactory.getBeansWithAnnotation(Super.class);
System.out.println("通过指定注解@Super获取对象:"+ users);
}
}
}
public class ObjectProviderDemo {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(ObjectProviderDemo.class);
applicationContext.refresh();
ObjectProvider<String> objectProvider = applicationContext.getBeanProvider(String.class);
System.out.println(objectProvider.getObject());
}
@Bean
public String getStr(){
return "字符串对象";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
<!--DTD 需要引入对应的jar包,spring-bean、spring-context、spring-tx-->