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的实例化过程. -------------------------------- ... 今天在使用jQuery方法".css()"设置"ajax-loader.gif"的位置时出了点小状况,关键代码如下(为了简化,这里假定要给"ajax- ... 题目传送门 还是维护子树信息. 但是这里多了一个找重心的操作. 这里有一个关于树重心的结论,据说可以用反证法证明.反正我不会证 就是:新的重心一定在原来两个重心之间的那条树链上. 这样我们逐步缩小搜索 ... 一.环境搭建 安装Android 环境变量.SDK.Android API.ADT等. 步骤1 安装SDK:下载地址为https://pan.baidu.com/s/1mi6PT9m.如提示错误:' ... 一.Pycharm介绍 前面几年的时间,我一直用的eclipse,后面开始听同事说用IntelliJ IDEA了,而且说是目前业界最好用的java开发工具,IDE(集成开发环境),没有之一.PyCha ... http://www.cnblogs.com/freeliver54/archive/2012/06/13/2547765.html 简述了Service的一些基础知识以及Service和Thread ... 协程 coroutine 最近频繁的听说到 "协程" 这个词,花了一段时间肤浅的研究了一下.对于 "它是一个什么东西" 有了一个大概的了解. from wiki ... 原文链接: Spring Boot2.x 动态数据源配置 基于 Spring Boot 2.x.Spring Data JPA.druid.mysql 的动态数据源配置Demo,适合用于数据库的读写分 ... */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ... */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ... 背景概述 C# 开发客户端系统的时候,.net 框架本身就比较消耗内存资源,特别是xp 这种老爷机内存配置不是很高的电脑上运行,所以就需要进行内存上的优化,才能流畅的在哪些低端电脑上运行. 想要对C# ...Spring注解 - 生命周期、属性赋值、自动装配的更多相关文章
随机推荐