IOC容器

ゝ一纸荒年。 2023-06-13 09:15 72阅读 0赞

描述

  • IOC:控制反转,将对象的创建过程交给Spring容器,由容器管理对象的生命周期;

Bean的作用域

  • Spring Bean实例的作用范围由配置项scope限定:scope="singleton"
  • bean是一个由Spring IoC容器实例化、组装和管理的对象

































作用域 描述
singleton 单例模式(默认值);IOC容器仅创建一个Bean实例,每次返回的都是同一个Bean实例
prototype 原型模式;可以创建多个Bean实例,每次调用Bean时都返回一个新的Bean实例
以下适用于ApplicationContext环境中(WebApplicationContext继承ApplicationContext接口,是它的扩展)
request HTTP请求;每次HTTP请求都会创建一个新的Bean实例
session 会话;同一个session共享一个Bean实例,不同会话使用不同的Bean实例
global-session 全局会话;一般运用于Portlet应用环境(Portlet是基于Java的Web组件,由Portlet容器管理,并由容器处理请求,生产动态内容)

DI依赖注入

<1> 基于构造函数的依赖注入
  1. <!-- 传递引用 -->
  2. <constructor-arg ref="..."/>
  3. <!-- 或者 -->
  4. <constructor-arg>
  5. <ref bean="anotherExampleBean"/>
  6. </constructor-arg>
  7. <!-- 传递值 -->
  8. <constructor-arg type="int" value="..."/>
  9. <constructor-arg index="0" value="..."/>

注:使用type和index来处理多个构造器的注入

<2> 基于设值函数(setter)的依赖注入
  • 传递引用

    1. <property name="..." ref="..."/>
    1. <property name="..." value="..."/>
注:使用p-namespace实现xml配置
  1. <bean id="..." class="...">
  2. <property name="a" ref="c"/>
  3. <property name="b" value="3"/>
  4. </bean>
  5. <!-- 相当于以下 -->
  6. <bean id="..." class="..." p: b="3" p: a-ref="c"/>
注:注入高级属性-集合
  1. <property>
  2. <!-- list,set与list一样 -->
  3. <list>
  4. <value>...</value>
  5. <value>...</value>
  6. </list>
  7. <!-- map -->
  8. <map>
  9. <entry key="..." value="..."/>
  10. </map>
  11. <!-- props:properties的属性值 -->
  12. <props>
  13. <!-- key和value都是字符串类型 -->
  14. <prop key="...">...</prop>
  15. </props>
  16. </property>

自动装配

  • 在标签中配置autowire="..."
  • 在不使用和注入数据的情况下,Spring容器自动装配相互协作的bean 的关系

    public class School {

    1. private Student student; //使用byName方式装装配
    2. ......
    3. }

























装配方式 描述
no (默认)无自动装配;Bean引用必须由ref元素定义
byName 按属性名称自动装配
byType 按属性类型自动装配
constructor 类似于byType但适用于构造函数参数

基于注解的容器配置

  • 提供了XML设置的替代方法,该配置依赖字节码元数据来连接组件,而不是尖括号声明
  • 通过使用相关类,方法或字段声明上的注释,开发人员无需使用XML来描述bean的连接,而是将配置移入组件类本身
  • 使用注解时要在xml文件中配置<context:annotation-config/>:开启注解注入功能
  • <context:component-scan base-package="需要扫描的package"/>:扫描这个包下被注解标识的类,并自动注册为bean,配置它时可省去<context:annotation-config/>,它包含<context:annotation-config/>功能
  • @Required
    应用于bean的setter方法上,用于检查一个Bean的属性的值在配置期间是否被赋予或设置
  • @Autowired
    自动装配(byType),应用于setter方法、构造函数、成员变量
  • @Resource
    自动装配(默认byName),有name和type属性来指定装配方式
  • @Qualifier
    当使用@Autowired且出现多个类型一样的bean时,使用@Qualifier(“…”)来指定名称,表明用byName方式进行注入

    @Autowired

    1. @Qualifier(value = "user1")
    2. private User user;
  • @Value
    (1)将一个SpEL(SpEL:spring表达式,类似于ognl)表达式结果映射到功能处理方法的参数上;
    (2)要指定默认值,可以将@Value注释放在字段,方法和方法或构造函数参数上。
    (3)定义表达式的语法都是表单#{ <expression string> }














@Value(#{…}) @Value(${…})
表示常量,获取bean的属性,或者调用bean的某个方法 从配置properties文件中读取值
  1. @Value("#{'hello world!'}")
  2. private String str; //获取一个字符串,也可以获取一个数字常量
  3. @Value("#{dataSource.url}") //通过bean id获取bean的属性值
  4. private String jdbcUrl;
  5. @Value("#{ systemProperties['user.region'] }") //也可以用在方法上...
  6. public void setDefaultLocale(String defaultLocale) {
  7. this.defaultLocale = defaultLocale;
  8. }

基于Java的容器配置

  • @Configuration
    类似于xml里面的<beans>标签,用于配置类上,作为bean定义的来源
  • @Bean
    类似于xml里面的<bean>标签,用于方法之上,告诉方法让其产生一个Bean对象,然后把这个Bean对象交给Spring管理

    @Configuration

    1. public class AppConfig {
    2. @Bean
    3. public TransferServiceImpl transferService() {
    4. return new TransferServiceImpl();
    5. }
    6. }

等效于:

  1. <beans>
  2. <bean id="transferService" class="com.acme.TransferServiceImpl"/>
  3. </beans>
  • @Import
    用于类上,表示从另外一个配置类中加载@Bean定义
  • @Scope
    定义作用域,默认为单例模式

发表评论

表情:
评论列表 (有 0 条评论,72人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring IoC容器

    Spring IoC(Inversion of Control,控制反转)容器是Spring框架的核心功能之一,它是一个轻量级的容器,负责管理Java对象的生命周期和依赖关系。

    相关 Spring IoC容器

    我们将详细介绍 Spring 的 Ioc 容器。 IoC 是指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建。Spring 容器会负责控制程序之

    相关 IOC容器

    描述 IOC:控制反转,将对象的创建过程交给Spring容器,由容器管理对象的生命周期; Bean的作用域 Spring Bean实例的作用范围由配置

    相关 Spring IOC容器

    IOC(控制反转):不负责对象的创建,只负责使用,由外部容器创建 DI(依赖注入):创建对象并且组装对象之间的关系        ![watermark_type