bean scope属性
singleton单例
singleton是容器默认的scope,所以写和不写没有区别。scope为singleton的时候,在Spring的IoC容器中只存在一个实例,所有对该对象的引用将共享这个实例。该实例从容器启动,并因为第一次被请求而初始化后,将一直存活到容器退出,也就是说,它与IoC容器“几乎”拥有相同的寿命
- 对象实例数量:singleton类型的bean定义,在一个容器中只存在一个共享实例,所有对该类型bean的依赖都引用这一单一实例
- 对象存活时间:singleton类型bean定义,从容器启动,到它第一次被请求而实例化开始,只要容器不销毁或退出,该类型的单一实例就会一直存活
优点:
在单例模式下,可以减少每次创建对象的内存空间,减少CPU的计算资源。
全局只有一个对象,当多次调用该对象时,会不会出现堵塞现象?
singleton在容器是单例多线程执行,不会造成堵塞
缺点:
存在线程安全风险。
演示:
当由两个任务需要调用a对象的num属性时,任务A在调用setNum(1),同时任务B调用setNum(2),再次之后任务A调用getNum()输出a的num时却不是1,而是2。
prototype多例
对于那些请求方不能共享的对象实例,应该将其bean定义的scope设置为prototype。这样,每个请求方可以得到自己对应的一个对象实例。通常,声明为prototype的scope的bean定义类型,都是一些有状态的,比如保存每个顾客信息的对象
缺点:
prototype在容器中多实例,占用更多资源。
优点:
不存在线程安全问题。
singleton与prototype对比
singleton | prototype | |
---|---|---|
对象数量 | 全局唯一 | 存在多个 |
实例化时机 | IoC容器启动时 | getBean()或对象注入时 |
线程安全问题 | 存在 | 不存在 |
执行效率 | 高 | 低 |
基于注解与java config配置IoC容器
基于注解的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
组件类型注解
这四个注解,均使用在类上
@Component 组件注解,通过注解,被该注解描述的类将被IoC容器管理并实例化
@Controller 语义注解,说明当前类是MVC应用中的控制器类
@Service 语义注解,说明当前类是Service业务服务类
@Repository 语义注解,说明当前类用于业务持久层,通常描述对应Dao类
开启组件扫描
<!--XML配置开启组件扫描,才能使用注解-->
<context:component-scan base-package="package">
<!--排除某些类-->
<context:exclude-filter type="regex" expression="Class"/>
</context:component-scan>
组件类型注解默认beanId为类名首字母小写;
使用注解的value属性修改beanId。
自动装配注解
按类型装配:
@AutoWired 按容器内对象类型动态注入属性,由Spring机构提供
@Inject 基于JSR-330标准,其他通@AutoWired,但不支持required属性
按名称装配:
@Named 与@Inject配合使用,JSR-330规范,按属性名自动装配属性
@Resource 基于JSR-250规范,优先按名称、再按类型智能匹配
@AutoWired
如果注解放在set方法上,则自动按类型/名称对set方法参数进行注入
如果注解放在属性上,spring IoC容器会自动通过反射技术将属性private修饰符自动改为public,直接进行赋值
@Resource
-
@Resource设置name属性,则按name在IoC容器中将bean注入
-
@Resource未设置name属性
- 以属性名作为bean name在IoC容器中匹配bean,如有匹配则注入
- 按属性名未匹配,则按类型进行匹配,同@AutoWired,需要加入@primary解决类型冲突
在使用@Resource对象时推荐设置name或保证属性名与bean名称一致
元数据注解
为spring IoC容器管理对象时提供一些辅助信息
@Primary 按类型装配时出现多个相同类型对象,拥有此注解对象被优先注入
@PostConstruct 描述方法,相当于XML中init-method配置的注解版本
@PreDestroy 描述方法,相当于XML中destroy-method配置的注解版本
@Scope 设置对象的scope属性
@Value 为属性注入静态数据
基于java Config配置IoC容器
优势
完全摆脱XML的束缚,使用独立java类管理对象与依赖
注解配置相对分散,利用java Config可对配置集中管理
可以在编译时进行依赖检查,不容易出错
java Config核心注解
@Configuration 描述类,说明当前类是Java Config配置类,完全替代XML文件
@Bean 描述方法,方法返回对象将被IoC容器管理,beanId默认为方法名
@ImportResource 描述类,加载静态文件,可使用@Value注解获取
@ComponentScan 描述类,同XML的 <context:compoment-scan>
标签