闲谈 Spring 容器中对象的获取

  • Post author:
  • Post category:其他



<bean id="名字" class="类型"></bean>



注解配置的 bean,它的 bean id 默认为类名首字母小写

@Autowired 默认是按照类型(byType)注入的,结合 @Qualifier(“XX”) 使用,可以让 @Autowired 按照 byName 方式装配;

@Resource 默认是按照属性名(byName)装配的,通过设置name和 type 属性可以指定注入方式,使用 type 属性时按照类型(byType)注入;

Spring 管理的 bean 默认单例。

众所周知,使用单例在多线程的情况下有时候会有线程安全问题,这时可以使用 @Scope(“prototype”) 注解,可以通知Spring把被注解的Bean变成多例。也可以直接 new,或者加锁。

scope属性

  • singleton:默认值,单例
  • prototype:多实例

    @Scope(“prototype”) 的用法

    .
  • request:创建对象把对象放到request域里面。代表的是这个对象在一次请求范围内只会创建一次。
  • session:创建对象把对象放到session域里面。代表的是这个对象在一次会话范围内只会创建一次。
  • globalSession:在集群web项目中使用。代表的是这个对象在一次会话范围内只会创建一次。


在无法注入获取 bean 的时候

,可以通过实现

ApplicationContextAware

获取 Spring 容器中的 bean,下面是工具类


@Component
public class AppUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
        applicationContext = arg0;
    }

    public static <T> T getObject(Class<T> requiredType) {
        return applicationContext.getBean(requiredType);
    }

    public static Object getObject(String beanName) {
        return applicationContext.getBean(beanName);
    }

    public static String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType) {
        return applicationContext.getBeanNamesForAnnotation(annotationType);
    }

    public static Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) {
        return applicationContext.getBeansWithAnnotation(annotationType);
    }


}




bean实例化有三种方式实现

第一种 利用反射,使用类的无参数构造创建(重点)

<bean id="user" class="com.lurenwu.ioc.User"></bean>

第二种 使用静态工厂创建

public class Bean2Factory {
    //静态的方法,返回Bean2对象
    public static Bean2 getBean2(){
        return new Bean2();
    }
}
<bean id="bean2" class="com.lurenwu.bean.Bean2Factory" factory-method="getBean2"></bean>

第三种 使用实例工厂创建

public class Bean3Factory {
    public Bean3 getBean3(){
        return new Bean3();
    }
}
<bean id="bean3Factory" class="com.lurenwu.bean.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>



版权声明:本文为weixin_43209861原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。