spring常见问题

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>


2、Spring的自动装配

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


也可以通过在配置文件中配置AutowireAnnotationBeanPostProcessor达到相同的效果。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值