Spring获取对象的几种方式?

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值