Spring常见问题
1、Scope属性的作用与取值
<bean id="userDAO" class="UserDAOImpl"/>
<bean id="userService" class="UserService" scope="prototype">
<property name="userDAO" ref="userDAO"/>
</bean>
1、默认情况下,scope="singleton"
,表示单例模式,由IOC容器自动创建且全局唯一。
2、scope="prototype"
,表示多例模式,每一次调用getBean()时,会创建新的对象。
3、scpoe="request"
/"session"
:
如果在工程中引入了SpringMVC,这两个属性就生效了,含义是:
request,如果在同一个“request”请求内,对象是同一个。不同的请求,IOC容器会创建不同的对象。
session,同一个session内部,多次调用getBean()获取的是同一个对象。不同的session,IOC会创建不同的对象。
4、scope属性决定了在Spring工程中创建对象是单例还是多例。
2、lazy-init属性的作用
<bean id="userDAO" class="UserDAOImpl"/>
<bean id="userService" class="UserService" lazy-init="true">
<property name="userDAO" ref="userDAO"/>
</bean>
lazy-init:懒加载,当设置为true
时,表示只有用到这个Bean时,才会实例化。
注意:当scope属性为"prototype"
多例模式时,lazy-init就会失效。
lazy-init有自己的使用场景,因为其作用是对象在第一次getBean()时被创建,所以可以起到减小服务器压力的作用。
比如:当前有上千个类,但并不是所有的类都是目前需要的,有些是作为备用选项使用的。此时我们就可以使用lazy-init来减轻服务器和内存的压力,有利于系统的快速启动。
3、@Autowired与@Resource有什么区别
1、@Autowired
:Spring提供的注入注解,由第三方提供;@Resource
:java官方进行的定义
2、二者的机制不同,@Autowired
只能按照类型在IOC容器中进行匹配。而@Resource
可以通过设置“name”属性指定Bean id,可以按照“name”进行匹配。
当@Resource
不设置“name”属性时,会将“属性名”作为默认的“Bean id”在IOC容器中进行查找,当属性名和IOC容器中的“bean id”不一样时,这种情况下才会跟@Autowired
一样采用类型进行匹配,其更加智能。(如果设置了“name”属性,则将设置的名称作为“bean id”进行精准匹配。如果没有设置“name”属性,优先使用属性名作为“bean id”到IOC容器中进行查找,如果匹配不到,再按照类型在IOC容器中进行查找)
发表回复