SpringInAction学习笔记(一):核心概念

时间:2021-11-11 12:18:56

Spring自带了多种应用上下文

AnnotationConfigApplicationContext:从一个或多个java配置类中加载应用上下文

AnnotationConfigWebApplicationContext:从一个或多个java配置类加载web的应用上下文

ClassPathXmlApplicationContext: 从类路径下的xml文件中加上上下文定义

FileSystemXmlApplicationContext:从文件系统下的xml文件加载上下文定义

XmlWebApplicationContext:从web应用下的xml文件加载上下文

FileSystemXmlApplicationCont 和 ClassPathXmlApplicationContext的区别是

FileSystemXmlApplicationCont是指定的文件系统下去寻找对应的xml文件

ClassPathXmlApplicationContext是在所有的类路径下去寻找xml文件的

 ApplicationContext context = new FileSystemXmlApplicationContext("d:/test.xml");

 or

 ApplicationContext context = new ClassPathXmlApplicationContext("test.xml");

bean的生命周期

SpringInAction学习笔记(一):核心概念

本地实验bean去实现其中的几个接口,例如 BeanNameAware, BeanPostProcessor, DisposableBean

代码大致如下,其中LogUtil自行替换即可

Applicationcontext的工具类,这里仅仅用class来获取,其他方法类似

public class SpringContextHolder {

    private static ApplicationContext innerContext;

    @Autowired
public void setInnerContext(ApplicationContext context){
innerContext = context;
} public static <T> T getBean(Class<T> clazz){
return innerContext.getBean(clazz);
} }
 @Component
public class TestBean implements BeanNameAware, BeanPostProcessor, DisposableBean { private String name; public void setBeanName(String name) {
LogUtil.info("name = " + name);
this.name = name;
} public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
LogUtil.info("post Before invoked, name " + beanName);
return bean;
} public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
LogUtil.info("post After invoked, name " + beanName);
return bean;
} public void destroy() throws Exception {
LogUtil.info("be destroy");
}
}

xml配置开启注解即可,这里不贴了

还有另一个与其一样的类,不同点是 打印到控制台的内容有 22 作为前缀

测试类大致如下

 @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/spring.xml")
public class SpringTest { @Test
public void test(){
try {
TestBean testBean = SpringContextHolder.getBean(TestBean.class);
TestBean2 testBean2 = SpringContextHolder.getBean(TestBean2.class);
} catch (QuestFailedException e) {
e.printStackTrace();
}
} }

运行结果如下

 post Before invoked, name testB
22 post Before invoked, name testB
post After invoked, name testB
22 post After invoked, name testB
post Before invoked, name testA
22 post Before invoked, name testA
post After invoked, name testA
22 post After invoked, name testA
post Before invoked, name springContextHolder
22 post Before invoked, name springContextHolder
post After invoked, name springContextHolder
22 post After invoked, name springContextHolder
post Before invoked, name org.springframework.context.event.internalEventListenerProcessor
22 post Before invoked, name org.springframework.context.event.internalEventListenerProcessor
post After invoked, name org.springframework.context.event.internalEventListenerProcessor
22 post After invoked, name org.springframework.context.event.internalEventListenerProcessor
post Before invoked, name org.springframework.context.event.internalEventListenerFactory
22 post Before invoked, name org.springframework.context.event.internalEventListenerFactory
post After invoked, name org.springframework.context.event.internalEventListenerFactory
22 post After invoked, name org.springframework.context.event.internalEventListenerFactory
post Before invoked, name quest
22 post Before invoked, name quest
post After invoked, name quest
22 post After invoked, name quest
post Before invoked, name knight
22 post Before invoked, name knight
post After invoked, name knight
22 post After invoked, name knight
post Before invoked, name minstrel
22 post Before invoked, name minstrel
post After invoked, name minstrel
22 post After invoked, name minstrel

可见第二个接口是针对spring环境下的所有bean的,当有多个接口的实现者时,均会被调用

spring的包情况

SpringInAction学习笔记(一):核心概念

Spring容器配置的三种方式

xml配置

java类配置

隐式的bean发现机制和自动配置

重点讲解第三点,spring从2个角度来实现自动化装配

组件扫描:spring自动发现应用上下文所创建的bean

自动装配:spring自动满足bean之间的依赖

基于java类配置的自动扫描

 @Configuration
@ComponentScan
public class CDPlayerConfig {
// nothing
}

ComponentScan会默认扫描该类所在的包的类,及其子包所有的类,这个与传统的在xml中配置 <context:component-scan base-package="xx" /> 的用法是一样的

@ComponentScan(value="xxx") 表明xxx是基础包 与 @ComponentScan(basePackages={"x1","x2"}) 是等价的

还可以是 @ComponentScan(basePackageClasses={a.class, b.class})  这类类锁在的包,也会作为扫描的基础包

bean类

 // 接口
public interface CompactDisc {
void play();
} // 一个实现类
@Component
public class SgtPeppers implements CompactDisc{ private String title = "sgt title"; private String artist = " paul "; public void play() {
LogUtil.info(title + " -> " + artist);
}
}

测试类

 @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest { @Autowired
private CompactDisc compactDisc; @Test
public void test(){
Assert.assertNotNull(compactDisc);
} }

运行的结果是通过,表明通过这种方式,成功的将bean装配了

这里顺带说下 Autowired 和 Resource的区别

Autowired自动装备,默认先按照类型去查找,如果找到了唯一的实例,那么顺利装配,如果不唯一,则需要使用 @Qualifier来指定

Resource则默认按照属性名去寻找,如果没有找到,则按照类型寻找,按类型寻找发现不唯一,也会报错,这个时候,就需要同  @Qualifier 一起使用

按上面的代码 修改2个bean类,以及测试类如下

 @Component(value = "cdc")
public class CdCommon implements CompactDisc { public void play() {
LogUtil.info("i'm cdc");
}
} @Component(value = "sp")
public class SgtPeppers implements CompactDisc{ private String title = "sgt title"; private String artist = " paul "; public void play() {
LogUtil.info(title + " -> " + artist);
}
} // 测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest { @Autowired
@Qualifier(value = "sp")
private CompactDisc compactDisc; @Resource
@Qualifier(value = "cdc")
private CompactDisc cdc1;
// private CompactDisc cdc; @Test
public void test(){
Assert.assertNotNull(compactDisc);
// Assert.assertNotNull(cdc);
Assert.assertNotNull(cdc1);
} }

这个运行的结果也是可以的

spring xml 方式声明bean ,参数有list时,可以这么使用

SpringInAction学习笔记(一):核心概念

SpringInAction学习笔记(一):核心概念的更多相关文章

  1. Docker 学习笔记之 核心概念

    Docker核心概念: Docker Daemon Docker Container Docker Registry Docker Client 通过rest API 和Docker Daemon进程 ...

  2. Docker&colon;学习笔记&lpar;1&rpar;——基础概念

    Docker:学习笔记(1)——基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...

  3. JavaScript&colon;学习笔记&lpar;2&rpar;——基本概念与数据类型

    JavaScript:学习笔记(2)——基本概念与数据类型 语法 1.区分大小写.Test 和 test 是完全不同的两个变量. 2.语句最好以分号结束,也就是说不以分号结束也可以. 变量 1.JS的 ...

  4. Elasticserach学习笔记-01基础概念

    本文系本人根据官方文档的翻译,能力有限.水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸. 原文出处:https://www.elastic.co/guide/en/e ...

  5. es6学习笔记-class之一概念

    前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...

  6. OpenFlow Switch学习笔记&lpar;一&rpar;——基础概念

    OpenFlow Switch v1.4.0规范是在2013年10月14号发布,规范涵盖了OpenFlow Switch各个组件的功能定义.Controller与Switch之间的通信协议Open F ...

  7. Elasticsearch学习之基本核心概念

    在Elasticsearch中有许多术语和概念 1. 核心概念 Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包 ...

  8. webpack学习2&period;3webpack核心概念

    核心概念(四个) Entry(入口) Output(出口) Loaders()来处理其他类型的资源文件 Plugins(插件) 1.入口(Entry) 作用:代码的入口,打包的入口,单个或多个, 示例 ...

  9. Maven笔记之核心概念及常用命令

    Maven的核心概念 Maven是一款服务于java平台的自动化构建工具. 自动化构建工具还有:make->ant->maven->gradle       1.约定的目录  2.P ...

随机推荐

  1. Android自定义控件之自定义属性

    前言: 上篇介绍了自定义控件的基本要求以及绘制的基本原理,本篇文章主要介绍如何给自定义控件自定义一些属性.本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解.有关原理知识请参考Android自定义控 ...

  2. DataGridView

    一.实现CheckBox列. 1.1 增加CheckBox列: 在DataGridView中增加CheckBox列: 注意:设置ColumnType类型和设置FalseValue为0,TrueValu ...

  3. 混合使用TFVC和GIT配置库的优化方案

    如果要选出最近几年在软件工程领域最热的技术,那毋庸置疑就是git了.作为分布式源代码管理(DVCS)的代表,git以其超快的操作,便捷的分支合并模型和P2P模式的代码分享模式让软件开发团队的很多复杂协 ...

  4. js-FCC算法Friendly Date Ranges

    让日期区间更友好! 把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推 ...

  5. quotation

    1. 如果不能修心,则诸事繁杂!; 2. 人生,是该追求平淡长久,还是绚烂短暂,我想人人都有自己的答案,但阅历或者情感,都不是越多越好,烂桃三筐不如鲜杏一个,是古老的俗话,却至今鲜活有力.以量取胜,实 ...

  6. Qt中QWidget加入到父类QWidget不能显示的问题

    最近忙活了半天发现了一个不容易发现的问题,比如我有一个父类的自定义Widget,并且自己设置了Pattle,但这个时候我如果再在当前Widget内部加入自己的widget就不能正常显示,但是加QPus ...

  7. AngularJs学习笔记6——四大特性之依赖注入

    压缩工具:YUI-compressor 为了优化网页功能,对一些脚本文件进行压缩,比如:删除所有的注释和空格等,简化形参.但是AngularJs模块中可以声明多种组件,如控制器.指令.过滤器.服务等. ...

  8. Android 性能优化(一)内存篇

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/54377370 本文出自:[余志强的博客] 本博客同时也发布在 Hoo ...

  9. MySQL缓存参数优化&lpar;转&rpar;

    MySQL 数据库性能优化之缓存参数优化 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在 ...

  10. dubbo报错Data length too large&colon; 10710120处理,及服务提供者协议配置详细说明

    工作中遇到以下报错信息 cause: java.io.IOException: Data length too large: 10710120, max payload: 8388608, chann ...