一、Bean的生命周期

流程

Bean创建 —— 初始化 —— 销毁

创建:

  • 单实例:在容器启动时创建对象
  • 多实例:每次调用时创建对象

初始化:

  • 都是在对象创建完成后,调用初始化方法

销毁:

  • 单实例:容器关闭时,调用销毁方法
  • 多实例:容器不会管理这个bean,只能手动调用销毁方法

实现方式

  1. 在 @Bean 注解上指定初始化(initMethod)、销毁方法(destroyMethod)

    @Bean(initMethod = "init", destroyMethod = "destroy")
    public Car car(){
    return new Car();
    }
  2. 让Bean实现 InitializingBeanDisposableBean 接口,重写它们的方法

    public class Cat implements InitializingBean, DisposableBean {
    public Cat() {
    System.out.println("Cat...Construct...");
    } @Override
    public void afterPropertiesSet() throws Exception {
    System.out.println("Cat...init...");
    } @Override
    public void destroy() throws Exception {
    System.out.println("Cat...destroy...");
    }
    }
  3. 使用 JSR250 中的 @PostConstruct@PreDestroy 注解标注初始化、销毁方法

    public class Dog {
    public Dog() {
    System.out.println("Dog...Construct...");
    } @PostConstruct
    public void init(){
    System.out.println("Dog...init...");
    } @PreDestroy
    public void destroy(){
    System.out.println("Dog...destroy...");
    }
    }
  4. 实现BeanPostProcessor接口,重写

    postProcessBeforeInitialization(在初始化之前工作)

    postProcessAfterInitialization(在初始化之后工作)

    public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("postProcessBeforeInitialization" + beanName);
    return bean;
    } @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("postProcessAfterInitialization" + beanName);
    return bean;
    }
    }

二、属性赋值相关注解

@Value

作用:

​ 添加在字段上,用于给属性赋值

属性:

  • value:指定要传入的值

用法:

public class Person {
@Value("张三") //普通方式赋值
private String name; @Value("#{20 - 1}") //使用SpEL表达式
private Integer age; @Value("${person.nickName}") //使用 ${} 读取配置文件内容
private String nickName; //省略getter setter toString方法
}

上述第三种方式显然是不能读取到的,我们需要配置一下配置文件的位置,使用到下面这个注解

@PropertySource

作用:

​ 读取指定的外部配置文件,将K/V键值对保存到运行的环境变量中,用 ${} 来获取

属性:

  • name:给属性源指定一个名称
  • value:要加载的配置文件的路径,可以指定多个
  • ignoreResourceNotFound:是否忽略资源未找到的情况,默认false
  • encoding:给定资源的特定字符编码,例如 “UTF-8”
  • factory:指定一个自定义属性源工厂,默认使用 PropertySourceFactory

用法:

在 resources 目录下创建一个 properties 文件,内容如下

person.nickName=小张

然后在配置类上标注 @PropertySource("classpath:person.properties") 即可

可以直接在@Value注解中获取,也可以通过 ioc 容器对象获取

ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration4.class);
String nickName = context.getEnvironment().getProperty("person.nickName");
System.out.println(nickName);

三、自动装配相关注解

Spring 利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值

@Autowired

  • 默认按照类型去容器中寻找对应的组件,如果只有一个就赋值

  • 如果找到多个相同类型的组件,再按照属性名寻找

  • 有一个required属性,默认是true;

  • 可以写在构造器、方法、参数、属性上

@Qualifier

  • 一般配合 @Autowired 使用,指定需要装配的组件的id,@Autowired 就直接按照id注入。
  • 如果 id 对应的组件不存在,并且没有指定 required = false,则会报错

@Primary

  • 让Spring进行自动装配的时候,首先选择标注了@Primary的组件
  • 如果已经使用 @Qualifier 指明了要装配的组件,则不生效

Spring注解 - 生命周期、属性赋值、自动装配的更多相关文章

  1. Spring笔记(2) - 生命周期/属性赋值/自动装配及部分源码解析

    一.生命周期 @Bean自定义初始化和销毁方法 //====xml方式: init-method和destroy-method==== <bean id="person" c ...

  2. Spring注解(生命周期)

    对于上面的知识图解,需要一点一点的研究. 首先核心容器: 控制反转 和 依赖注入 创建工程: maven仓库搜索 spring context  : 引入后 <!-- https://mvnre ...

  3. Spring - bean的autowire属性(自动装配)

    当我们要往一个bean的某个属性里注入另外一个bean,我们会使用<property> + <ref/>标签的形式.但是对于大型项目,假设有一个bean A被多个bean引用注 ...

  4. Spring注解开发系列Ⅳ --- 属性赋值

    在Spring框架中,属性的注入我们有多种方式,我们可以通过构造方法注入,可以通过set方法注入,也可以通过p名称空间注入,方式多种多样,对于复杂的数据类型比如对象.数组.List集合.map集合.P ...

  5. 【Spring】Spring中的Bean - 5、Bean的装配方式(XML、注解(Annotation)、自动装配)

    Bean的装配方式 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 文章目录 Bean的装配方式 基于XML的装配 基于注解 ...

  6. spring实战四之Bean的自动装配(注解方式)

    使用注解装配: 从spring2.5开始,Spring启用了使用注解自动装配Bean的属性,使用注解方式自动装配与在XML中使用 autowire 属性自动装配并没有太大区别,但是使用注解方式允许更细 ...

  7. Spring Bean 注入 1 - 构造方法注入,属性注入,自动装配

    1.代码结构图 xxx 2.bean代码 package com.xxx.bean; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * D ...

  8. 大厂高频面试题Spring Bean生命周期最详解

    Spring作为当前Java最流行.最强大的轻量级框架.Spring Bean的生命周期也是面试高频题,了解Spring Bean周期也能更好地帮助我们解决日常开发中的问题.程序员应该都知道Sprin ...

  9. Spring点滴四:Spring Bean生命周期

    Spring Bean 生命周期示意图: 了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程. -------------------------------- ...

随机推荐

  1. 虚拟网卡 TUN/TAP 驱动程序设计原理(经典)

    盗用-收藏 简介 虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱 ...

  2. 深入理解 C/C++ 数组和指针

    本文转载自CSDN@WalkingInTheWind,原文链接:https://blog.csdn.net/luckyxiaoqiang/article/details/7044380 C语言中数组和 ...

  3. in与exist , not in与not exist 的区别

    in和exists     in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的.     ...

  4. idea 使用sonarlint报错解决方案

    在idea使用sonarlint可能出现以下报错: Plugin 'org.sonarlint.idea' failed to initialize and will be disabled. Ple ...

  5. python标准库-builtin 模块之compile,execfile

    eval函数仅仅允许执行简单的表达式.对于更大的代码块时,使用compile和exec函数. 例子:使用 compile函数验证语法 NAME = "script.py" BODY ...

  6. python 自动发送邮件遇到的问题

    在学习自动化测试高级应用,根据内容写关于自动发送邮件出现了几个问题以及解决办法: 问题1: 代码写好之后,运行的时候,出现如下报错: SMTPAuthenticationError: (550, '\ ...

  7. 吴裕雄--天生自然KITTEN编程:逃脱升天

  8. 云服务器 ECS--查找公网ip使用终端连接云服务

    前段时间购买了阿里云服务器,购买之后一直没用使用,今天来操作一波,可谓一波三折,只能说,不看他们的操作指南你可能连地方都找不到,所以,在这里,我想给初次购买阿里云服务的童鞋门,写写我是怎么使用阿里云服 ...

  9. Proto3:Techniques

    本文描述处理Protocol Buffer常用到的一些设计模式.你也可以给Protocol Buffers discussion group发送设计或使用问题. 流式多条消息 如果你想将多个消息写入到 ...

  10. 谈谈从事IT测试行业的我,对于买房买车有什么样的感受

    周边测试同事,开发同事买?买?的比较多, 偶尔大家话题中也会谈起这个. 毕竟工作.衣.食.住.行和我们每个IT从业者息息相关, 大家有着相同或相似的感受与经验. - 前公司 以前公司测试经理 10年从 ...