1、Spring框架中的单例Beans是线程安全的么?
Spring框架并没有对单例bean进行任何多线程的封装处理,关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的,如果你的bean有多种状态的haunted(比如View Model对象),就需要自行保证线程安全。
最浅显的解决办法就是将多态bean的作用域由“singleton”变为“prototype”
2、Spring中注入Java Collection
Spring提供了一下四种集合类的配置元素:
# <list>:该标签用来装配可重复的list值
# <set>:该标签用来装配没有重复的set值
# <map>:该标签可用来注入键和值可以为任何类型的键值对
# <props>:该标签支持注入键和值都是字符串类型的键值对
例子:
<beans>
<bean>
<!-- java.util.List -->
<property name="list">
<list>
<value>A</value>
<value>B</value>
<value>C</value>
</list>
</property>
<!-- java.util.Set -->
<property name="set">
<set>
<value>1</value>
<value>2</value>
<value>3</value>
</set>
</property>
<!-- java.util.Map -->
<property name="map">
<mpa>
<entry key="1" value="A" />
<entry key="2" value="B" />
</mpa>
</property>
<!-- java.util.Properties -->
<property name="properies">
<props>
<prop key="admin">xxx</prop>
<prop key="password">...</prop>
</props>
</property>
</bean>
</beans>
在Spring框架中,在配置文件中设定bean的依赖关系是一个很好的机制,Spring容器还可以自动装配合作关系bean之间的关联关系。这个意味着Spring可以通过向Bean Factory中注入的方式自动搞定bean之间的依赖关系。自动装配可以设置在每个bean商,也可以设定在特定的bean上。
下面的XML配置文件表明了如何根据名称将一个bean设置为自动装配:
<span style="font-size:12px;"><bean id="xxxDAO" class="xxx.xxxDAOImpl" autowire="byName"></span>
除了bean配置文件中提供的自动装配模式,还可以使用@Autowired注解来自动装配指定的bean,在使用@Autowired注解之前需要在按照如下的配置方式在Spring配置文件进行配置才可以使用。
<span style="font-size:12px;"><content:annotation-config /></span>
<span style="font-size:12px;"><bean class="org.springframework.beans.factory.annotation.AutowireAnnotationBeanPostProcessor /></span>
配置好以后就可以使用@Autowired来标注了
4、自动装配模式的区别
(1)no:这是Spring框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean定义用标签明确的设置依赖关系。
(2)byName:该选项可以根据bean名称设置依赖关系,当向一个bean中自动装配一个属性时,容器将根据bean的名称自动在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。
(3)byType:该选项可以根据bean类型设置依赖关系,当向一个bean中自动装配一个属性时,容器将根据bean的类型字段在配置文件中查询一个匹配的bean,如果找到的话就在装配这个属性,如果没有找到的haunted就报错。
(4)constructor:构造器的自动装配和byType模式类似,但是仅仅适用于与有构造器相同参数的bean,如果在容器中没有找到构造器参数类型一致的bean,那么将会抛出异常
(5)autodetect:改模式自动探测使用构造器自动装配或者byType自动装配。首先,首先会尝试找合适的带参数的构造器,如果找到的话就用构造器自动装配,如果在bean内部没有找到相应的构造器或者是无参构造器,容器就会自动选择byType的自动装配方式
5、BeanFactory和ApplicationContext有什么区别
BeanFactory可以理解为含有bean集合的工厂类,BeanFactory包含了bean的定义,以便在接收到客户端请求时将对应的bean实例化。
BeanFactory还能在实例化对象的时候生成写作类之间的关系,此举将bean自身与bean客户端的配置中解放出来,BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。
从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能,但application context再次基础上还提供了其他功能:
(1)提供了支持国际化的文本消息
(2)统一的资源文件读取方式
(3)在监听器中注册bean的事件
以下是三种交常见的ApplicationContext实现方式:
1、ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义,应用程序上下文从程序环境变量中取得。
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
2、FileSystemXmlApplicationContext : 由文件系统中的XML配置文件读取上下文。
ApplicationContext context = new FileSystemXmlApplicationContext("bean.xml") ;
3、XmlWebApplicationContext:由Web应用的XML文件读取上下文。
6、什么是Spring inner beans
在spring框架中,无论何时bean被使用时,当仅被调用了一个属性,一个明智的做法是将这个bean声明为内部bean,内部bean可以用setter注入“属性”和构造方法注入“构造参数”的方式来实现。
比如,在我们的应用程序中,一个Customer类引用了一个Person类,我们要做的是创建一个Person的实例,然后在Customer内部使用。
<span style="font-size:12px;">public class Customer{
private Person person;
// setters and getters
}</span>
public class Person {
private String name;
private Integer age;
}
内部bean的声明方式如下:
<bean id="CustomerBean" class="com.xx.Customer">
<property name="person">
<bean class="com.xx.Person">
<property name="name" vlaue="xx" />
<property name="age" value="18" />
</bean>
</property>
</bean>
7、解析@Autowired注解
@Autowired注解对自动装配何时何处被实现提供了更多细粒度的控制,@Autowired注解可以像@Required注解、构造器一样被用于在bean的设值方法上自动装配bean的属性,一个参数或者带有任何名称或带有多个参数的方法。
比如,可以在设置方法上使用@Autowired注解来替代配置文件中的<property>元素,当Spring容器在setter方法上找到@Autowired注解时,会尝试用byType自动装配。
当然我们也可以在构造方法上使用@Autowired注解,带有@Aautowired注解的构造方法意味着在创建一个bean时将会被自动装配,即便在配置文件中使用<constructor-arg>元素