<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 版权协议,转载请附上原文出处链接和本声明。