Spring-IoC-03

bean scope属性

singleton单例

singleton是容器默认的scope,所以写和不写没有区别。scope为singleton的时候,在Spring的IoC容器中只存在一个实例,所有对该对象的引用将共享这个实例。该实例从容器启动,并因为第一次被请求而初始化后,将一直存活到容器退出,也就是说,它与IoC容器“几乎”拥有相同的寿命

  • 对象实例数量:singleton类型的bean定义,在一个容器中只存在一个共享实例,所有对该类型bean的依赖都引用这一单一实例
  • 对象存活时间:singleton类型bean定义,从容器启动,到它第一次被请求而实例化开始,只要容器不销毁或退出,该类型的单一实例就会一直存活

优点:

在单例模式下,可以减少每次创建对象的内存空间,减少CPU的计算资源。

全局只有一个对象,当多次调用该对象时,会不会出现堵塞现象?

singleton在容器是单例多线程执行,不会造成堵塞

缺点:

存在线程安全风险。

演示:

Spring-IoC-03

当由两个任务需要调用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

  1. @Resource设置name属性,则按name在IoC容器中将bean注入

  2. @Resource未设置name属性

    1. 以属性名作为bean name在IoC容器中匹配bean,如有匹配则注入
    2. 按属性名未匹配,则按类型进行匹配,同@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> 标签

上一篇:阿里云对象存储OSS————跨域资源共享(CORS)(m3u8 无法加载m3u8:跨域访问被拒绝)


下一篇:Shiro——主配置文件