闲谈 Spring 容器中对象的获取

<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>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值