spring作用、spring注解、管理对象的作用域与生命周期、自动装配

Spring

1. 作用

创建和管理对象,使得开发过程中,可以不必使用new关键字创建对象,而是直接获取对象!并且,还可以通过一些配置,使得某些获取到的对象,其中某些属性已经是被赋值的!

2. Spring注解

在Spring中,定义了一系列的注解,可以取代几乎所有的XML配置!

尽管使用注解可以完成此前的许多配置,但是,基于Spring的项目仍需要Spring的配置文件!

2.1. 常用注解

使用注解的方式来创建和管理对象,首先,必须在Spring的配置文件中添加组件扫描:

<!-- 组件扫描 -->
<!-- 仅在组件扫描的包下的类,才会被Spring管理 -->
<!-- 某个类,如果在扫描范围中,且添加了注解,则会被Spring管理 -->
<!-- base-package:扫描的根包 -->
<!-- 根包:父级包,Spring扫描时,会扫描其各层级子包 -->
<!-- 当配置为cn.tedu.spring时 -->
<!-- cn.tedu.spring.dao或cn.tedu.spring.entity这些子包都会被扫描 -->
<context:component-scan
    base-package="cn.tedu.spring.entity" />

然后,确保需要被管理的类都在以上配置的包中(也可以在其子包中),并且,在类的声明之前添加注解:

@Component

在默认情况下,被管理的类的bean id是与类的名称相同,且首字母小写的!例如类名是User,则默认的bean id是user,或类名是UserDao,则默认的bean id是userDao

如果需要自定义bean id,可以在注解中添加bean id:

@Component("bean-id")

@Component作用相同的注解还有:

@Controller
@Service
@Repository

其中,@Component是通用注解,即对任意类都可以添加该注解,@Controller是对控件器类的注解,@Service是对业务类的注解,@Repository是对持久层类的注解。

不过,以上这4种的作用和使用方式完全相同!只是语义不同,即从语法上表达的意义不相同,应该根据类的定位来选取 其中的某个注解!

2.2. 【了解】管理对象的作用域与生命周期

由Spring所管理的对象,默认都是饿汉式单例的,通过@Scope注解可以配置某个类被Spring管理时,是否是单例的:

@Scope("prototype")
public class ...

常用的配置方式有@Scope("singleton")@Scope("prototype")

如果需要配置该类最终是否是懒加载的,可以使用@Lazy注解,当添加了该注解后,就是懒加载模式,即:只有第1次获取对象时,才会创建对象,而在加载Spring配置文件的过程中,并不会把对象创建出来!

关于@Lazy也可以配置值,例如@Lazy(true)@Lazy(false)

饿汉式:一开始就已准备好了,随时都有的吃!

懒汉式:不到逼不得已,不干活!

注意:是否懒加载,是建立在单例的基础之上的!如果不是单例的,则懒加载的配置是无效的!

作用域:在多大的范围内是有效的!对于变量/对象而言,作用域就是它存在的时长,即何时创建及何时销毁!由于单例的对象都是static实现的,也就涉及创建时间和销毁时间的问题!而非单例的,作用域与普通的局部变量相同!

简单的懒汉式单例代码(没有解决线程安全问题):

public class King {
    private static King king = null;

    private King() {
    }

    public static King getInstance() {
        if (king == null) {
            king = new King();
        }
        return king;
    }

}

由Spring管理的对象,也存在生命周期问题,毕竟单例模式的类的对象何时创建、何时销毁,是我们无法确定的!为了确保初始化和销毁工作的正常执行,Spring允许在类中自定义初始化方法和销毁方法,使用了@PostConstruct注解的方法是生命周期初始化方法,会在构造方法之后被自动调用,使用了@PreDestroy注解的方法是生命周期销毁方法,会在Spring容器销毁并释放资源的前一刻被自动调用。

注意:以上2个方法是在javax包中定义的,使用之前,需要为项目添加Tomcat运行环境,否则无法识别!

注意:以上生命周期方法是建立在单例模式之下的,对于非单例模式而言,以上生命周期方法其实没有意义!

2.3. 自动装配

当使用了自动装配后,由Spring管理的对象时,会自动尝试为各属性注入值,值的来源可以是其它bean,例如:

public class UserService {
    public IUserDao userDao;
}

public class UserDao1 implements IUserDao {
}

如果以上2个类都是由Spring管理的,则在创建UserService对象时,会尝试自动的将UserDao对象作为其属性值!

自动装配的常用模式有byNamebyType,前者表示根据名称来装配,即:要求bean id与属性名保持一致,后者表示根据类型来装配,即bean的类型与属性的类型保持一致(允许是接口与实现类的关系,也允许是父子级继承的关系),不过,根据类型装配,要求匹配该类型的对象必须是有且仅有1个,如果有2个,则会抛出异常,无法装配!

原文地址:https://www.cnblogs.com/ahaijava/p/10064427.html

时间: 2024-07-29 15:58:48

spring作用、spring注解、管理对象的作用域与生命周期、自动装配的相关文章

Spring之Bean的作用域与生命周期

在前面博客中提到容器启动获得BeanDefinition对象中有一个scope 属性.该属性控制着bean对象的作用域.本章节介绍Bean的作用域及生命周期,了解bean是怎么来的又怎么没的. 一.Bean的作用域在Bean容器启动会读取bean的xml配置文件,然后将xml中每个bean元素分别转换成BeanDefinition对象.在BeanDefinition对象中有scope 属性,就是它控制着bean的作用域.Spring框架支持5种作用域,有三种作用域是当开发者使用基于web的App

Bean 注解(Annotation)配置(2)- Bean作用域与生命周期回调方法配置

Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Control – IOC) 理解依赖注入(DI – Dependency Injection) Bean XML 配置(1)- 通过XML配置加载Bean Bean XML 配置(2)- Bean作用域与生命周期回调方法配置 Bean XML 配置(3)- 依赖注入配置 Bean XML 配置(

Spring中bean用法(2):生命周期

一:基本流程 把一个bean纳入到Spring IoC容器之中,这个bean的生命周期就会交由容器进行管理 1.Bean的建立 由BeanFactory读取Bean定义文件,并生成各个实例. 2.Setter注入 执行Bean的属性依赖注入. 3.BeanNameAware的setBeanName() 如果Bean类实现了org.springframework.beans.factory.BeanNameAware接口,则执行其setBeanName()方法. 4.BeanFactoryAwar

MyBatis 作用域和生命周期

理解到目前为止所讨论的类的作用域和生命周期是非常重要的.如果使用不当可导致严重的并发性问题. SqlSessionFactoryBuilder  这个类可以在任何时候被实例化.使用和销毁.一旦您创造了SqlSessionFactory 就不需要 再保留它了.所以SqlSessionFactoryBuilder 实例的最好的作用域是方法体内(即一个本地方法 变量).您能重用SqlSessionFactoryBuilder 创建多个SqlSessionFactory 实例,但最好不要把 时间.资源放

文件载入流程,函数的使用【函数名,参数【按引用赋值的问题】,函数体,【变量作用域和生命周期】】

1.求最大公约数辗转相除求值例如:12,8求最大公约数12%8=4[不为零]8%4=0[为零,则4为最大公约数][原理就是12,8的最大公约数和8,4的最大公约数一致][这个问题已经可被证明]计算机中最早的算法 2.文件载入---流程[php执行的先后顺序][php对代码的编译以文件为单位]先检查一个文件中的语法再进行编译然后才会一行行解释执行 [这一点需要注意]这里进行文件载入的流程讲解:php文件载入时,被引入的文件中的语法并不会解析,只有当该文件被执行[也就是被引入语句之后的部分才会报错]

嵌入式 Linux C语言(八)——存储类型、作用域、生命周期、链接属性

嵌入式 Linux C语言(八)--存储类型.作用域.生命周期.链接属性 一.存储类型 C语言中,每个变量和函数都有两个属性:数据类型和数据的存储类型. 变量的存储类型是指存储变量值的内存类型.变量的存储类型决定变量何时创建.何时销毁以及它的值将保持多久.计算机中有三个地方可以用于存储变量:普通内存,运行时堆和栈,硬件寄存器.变量的存储类型取决于声明变量的位置. C语言存储类别说明符: 说明符 用    法 auto 只在代码块内变量声明中被允许, 表示变量具有本地生存期 extern 出现在顶

存储类、作用域、生命周期、链接属性

1.linux下C语言程序的内存映像代码段(.text).数据段(.data).bss段.栈.堆的概念 代码段(.text) (1)对应着程序中的代码(函数),代码段在linux中又叫文本段(.text)(2)部分平台下的const修饰的变量. 数据段(.data) 1.显式初始化为非0的全局变量: 2.显式初始化为非0的static局部变量 bss段 1.显式初始化为0或者未显式初始化的全局变量: 2.显式初始化为0或未显式初始化的static局部变量. 栈 局部变量分配在栈上:函数调用传参过

C++中的作用域与生命周期

Pascal之父Nicklaus Wirth曾经提出一个公式,展示出了程序的本质:程序=算法+数据结构.后人又给出一个公式与之遥相呼应:软件=程序+文档.这两个公式可以简洁明了的为我们展示程序和软件的组成. 程序的运行过程可以理解为算法对数据的加工过程,程序的运行的结果,就是算法加工数据产生的结果数据.算法描述的是对数据加工的步骤,对应于程序中的函数.数据结构描述的是数据在计算机中的组织结构,对应于程序中的数据类型.程序中数据对应的就是无处不在变量.对于我们编程人员,面对的无非就是函数,数据类型

C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内存分布:全局数据区 注意:如果在两个文件中都定义了相同名字的全局变量,连接出错:变量重定义 全局静态变量 作用域:文件作用域(只在被定义的文件中可见.) 生命周期:程序运行期一直存在 内存分布:全局数据区 定义方法:static关键字,const 关键字 注意:只要文件不互相包含,在两个不同的文件中