一、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. HHP|HPLC-MS/MS|PMT|PST|de novo|

    生物医学大数据 Protein 应用 人类蛋白质组计划 Gene的存在要依靠在蛋白水平确认基因真实存在. 蛋白质组是确定时间地点的研究单元的蛋白质总体,因为时间.地点和研究单元的相互组合存在多种变化, ...

  2. 吴裕雄--天生自然HTML学习笔记:HTML 段落

    HTML 可以将文档分割为若干段落. HTML 段落 段落是通过 <p> 标签定义的. 实例 <p>这是一个段落 </p> <p>这是另一个段落< ...

  3. btrace简单使用

    基本安装 在github上btrace项目的release下 下载最新的btracehttps://github.com/btraceio/btrace/releases 解压完后,将btrace的b ...

  4. 吴裕雄--天生自然 R语言开发学习:重抽样与自助法(续一)

    #-------------------------------------------------------------------------# # R in Action (2nd ed): ...

  5. 最新中文版虚拟机VMware Workstation隆重上市

    vmware虚拟机 在虚拟机软件中VMware Workstation算是一款非常强大较稳定的软件了,今天 VMware Workstation 10.0正式发布了,最让人欣喜的是该版本终于有了简体中 ...

  6. [资讯]同济D&I出品 | 绝对是史上最萌的机器人教具!!!

      机器人小曼……" 3D打印.激光切割等先进工艺. Anibot中包含三种不同的动物形象:小鸡安妮.小鹿安娜.猫头鹰安迪.孩子们通过对各个元器件的学习及编程确保它们幸福成长在阳光氤氲的森林 ...

  7. tips [ 18870 ]

    Created at 2017-08-23 Updated at 2018-01-31 Category 东方大陆 Tag 东方大陆 上面有编辑时间的,别吐槽说什么过期内容了使用 lightPIC图床 ...

  8. Mongdb创建 连接过程

    在bin目录下启动后 Show dbs 显示库,库里有内容才会显示库名称 Use admin 切换库 没有的默认创建 show users显示用户信息 Show collections显示表名 db. ...

  9. Python——7列表生成式

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  10. python 软件目录规范

      软件目录结构规范 软件开发规范 一.为什么要设计好目录结构? 1.可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等.从而非常快 ...