Spring注解 - 生命周期、属性赋值、自动装配
一、Bean的生命周期
流程
Bean创建 —— 初始化 —— 销毁
创建:
- 单实例:在容器启动时创建对象
- 多实例:每次调用时创建对象
初始化:
- 都是在对象创建完成后,调用初始化方法
销毁:
- 单实例:容器关闭时,调用销毁方法
- 多实例:容器不会管理这个bean,只能手动调用销毁方法
实现方式
在 @Bean 注解上指定初始化(initMethod)、销毁方法(destroyMethod)
@Bean(initMethod = "init", destroyMethod = "destroy")
public Car car(){
return new Car();
}
让Bean实现 InitializingBean 和 DisposableBean 接口,重写它们的方法
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...");
}
}
使用 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...");
}
}
实现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 指明了要装配的组件,则不生效
一.生命周期 @Bean自定义初始化和销毁方法 //====xml方式: init-method和destroy-method==== <bean id="person" c ... 对于上面的知识图解,需要一点一点的研究. 首先核心容器: 控制反转 和 依赖注入 创建工程: maven仓库搜索 spring context : 引入后 <!-- https://mvnre ... 当我们要往一个bean的某个属性里注入另外一个bean,我们会使用<property> + <ref/>标签的形式.但是对于大型项目,假设有一个bean A被多个bean引用注 ... 在Spring框架中,属性的注入我们有多种方式,我们可以通过构造方法注入,可以通过set方法注入,也可以通过p名称空间注入,方式多种多样,对于复杂的数据类型比如对象.数组.List集合.map集合.P ... Bean的装配方式 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 文章目录 Bean的装配方式 基于XML的装配 基于注解 ... 使用注解装配: 从spring2.5开始,Spring启用了使用注解自动装配Bean的属性,使用注解方式自动装配与在XML中使用 autowire 属性自动装配并没有太大区别,但是使用注解方式允许更细 ... 1.代码结构图 xxx 2.bean代码 package com.xxx.bean; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * D ... Spring作为当前Java最流行.最强大的轻量级框架.Spring Bean的生命周期也是面试高频题,了解Spring Bean周期也能更好地帮助我们解决日常开发中的问题.程序员应该都知道Sprin ... Spring Bean 生命周期示意图: 了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程. -------------------------------- ... 一.Mac下搭建推流服务器(Nginx+RTMP+FFMpeg) 安装x264 git clone git://git.videolan.org/x264.git cd x264 ./configur ... Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别的网络 ... 输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数. 第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用. 如果你希望输出的 ... 冒泡排序 介绍: 冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作 ... 宇宙辐射不仅是宇航员面临的问题.在乘坐飞机的过程中,我们所有人都会暴露在宇宙辐射中.一趟从伦敦到新加坡再到墨尔本的飞行中,人体受到的辐射量就相当于进行一次胸部X射线透视. 在去年12月NASA举 ... 在使用docker的过程中,发现其有很多内存相关的命令,对其中的swap(交换内存)和shm(共享内存)尤其费解.于是查阅了一些资料,弄明白了二者的基本区别. swap 是一个文件,是使用硬盘空间的一 ... 装饰器既然可以增加原来函数的功能,那能不能改变传给原函数的参数呢? 我们实验一下,先上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date ... 概述 数据字典主要解决下拉框数据填充和数据表格转义处理,一个数据字典可以多处使用. 1.多个页面下拉框使用同样的数据,改一个地方需要把所有页面都要修改 2.数据表格转义代替自己手动写templet解析 ... 最近写项目需要画出应用程序调用链的网路拓扑图,完全自己写需要花费些时间,那么首先想到的是echarts,但echarts的自定义写法写起来非常麻烦,而且它的文档都是基于配置说明的,对于自定义开发不太方 ... 迭代器 迭代器对象:有__next__()方法的对象是迭代器对象,迭代器对象依赖__next__()方法进行依次取值 with open('text.txt','rb',) as f: res = f ...Spring注解 - 生命周期、属性赋值、自动装配的更多相关文章
随机推荐