一、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. 使用jQuery的".css()"和".attr()"方法设置元素"left"属性的注意点

    今天在使用jQuery方法".css()"设置"ajax-loader.gif"的位置时出了点小状况,关键代码如下(为了简化,这里假定要给"ajax- ...

  2. [洛谷P4299] 首都

    题目传送门 还是维护子树信息. 但是这里多了一个找重心的操作. 这里有一个关于树重心的结论,据说可以用反证法证明.反正我不会证 就是:新的重心一定在原来两个重心之间的那条树链上. 这样我们逐步缩小搜索 ...

  3. Appium移动自动化测试实例-基于python

    一.环境搭建 安装Android 环境变量.SDK.Android API.ADT等. 步骤1  安装SDK:下载地址为https://pan.baidu.com/s/1mi6PT9m.如提示错误:' ...

  4. PyCharm 介绍、安装、入门使用

    一.Pycharm介绍 前面几年的时间,我一直用的eclipse,后面开始听同事说用IntelliJ IDEA了,而且说是目前业界最好用的java开发工具,IDE(集成开发环境),没有之一.PyCha ...

  5. android 应用程序与服务端交互

    http://www.cnblogs.com/freeliver54/archive/2012/06/13/2547765.html 简述了Service的一些基础知识以及Service和Thread ...

  6. 20170220-coroutine

    协程 coroutine 最近频繁的听说到 "协程" 这个词,花了一段时间肤浅的研究了一下.对于 "它是一个什么东西" 有了一个大概的了解. from wiki ...

  7. Spring Boot2.x 动态数据源配置

    原文链接: Spring Boot2.x 动态数据源配置 基于 Spring Boot 2.x.Spring Data JPA.druid.mysql 的动态数据源配置Demo,适合用于数据库的读写分 ...

  8. Python——9函数式编程②

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

  9. C++走向远洋——61(项目一、排序函数模板)

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

  10. C# 客户端内存优化分析

    背景概述 C# 开发客户端系统的时候,.net 框架本身就比较消耗内存资源,特别是xp 这种老爷机内存配置不是很高的电脑上运行,所以就需要进行内存上的优化,才能流畅的在哪些低端电脑上运行. 想要对C# ...