Spring 中的接口知识整理
本想每个小知识一篇随笔,但是那样,看起来有些单薄,所以,就放在一片文章里了。而且,以后还会慢慢在最后不断的追加。
目录:
FactoryBean
BeanPostProcessor
1.FactoryBean
FactoryBean接口,它在Spring框架源码内部,被大量使用,如使用AOP创建bean的代理时,使用了ProxyFactoryBean;从JNDI中查找对象时,使用了JndiObjectFactoryBean。
它在框架外,很少使用。但是为了学习,也得研究研究,您说是不?
它怎么使用?首先看看构造。
public interface FactoryBean<T> { // 返回的是这个工厂管理的对象的实例
T getObject() throws Exception;
// 返回的是工厂创建的对象的类型
Class<?> getObjectType(); boolean isSingleton(); }
上个例子,看具体东西。
public class Tool { private int id;
public Tool(int id) {
this.id = id;
}
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
}
}
public class ToolFactory implements FactoryBean<Tool> { private int factoryId;
private int toolId;
// 创建的是Tool的对象
@Override
public Tool getObject() throws Exception {
8 return new Tool(toolId);
9 } @Override
public Class<?> getObjectType() {
13 return Tool.class;
14 } @Override
public boolean isSingleton() {
return false;
} public int getFactoryId() {
return factoryId;
} public int getToolId() {
return toolId;
} public void setFactoryId(int factoryId) {
this.factoryId = factoryId;
} public void setToolId(int toolId) {
this.toolId = toolId;
} }
public class Test { public static void main(String[] args) {
@SuppressWarnings("resource")
ApplicationContext context = new ClassPathXmlApplicationContext("beaFactoryTest.xml");
Tool tool = (Tool) context.getBean("tool");
// 在名字前面加 & 表示要得到工厂类的bean
ToolFactory tool2 = (ToolFactory) context.getBean("&tool");
System.out.println("Tool Id is " + tool.getId());
System.out.println("ToolFactory Id is " + tool2.getFactoryId()); }
}
<bean id="tool" class="com.lee.demo.beanfactory.ToolFactory">
<property name="factoryId" value="9090"/>
<property name="toolId" value="108"/>
</bean>
最后执行结果:
Tool Id is 108
ToolFactory Id is 9090
2.BeanPostProcessor
它叫bean后处理器,也就是处理bean,它针对所有的bean,在初始化前后,对bean进行操作。主要内容我会在例子中描述。
例子:
public class HelloWorld {
private String message; public void setMessage(String message) {
this.message = message;
} public void getMessage() {
System.out.println("Your Message : " + message);
}
// 加上init方法和destory方法,是为了在后面验证他们和postProcessBeforeInitialization postProcessAfterInitialization 执行的先后顺序
public void init() {
System.out.println("Bean is going through init.");
} public void destroy() {
System.out.println("Bean will destroy now.");
}
}
public class InitHelloWorld implements BeanPostProcessor {
// BeanPostProcessor 接口中主要是下面两个方法 初始化前的后处理 初始化后的后处理
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("BeforeInitialization : " + beanName);
return bean; // you can return any other object as well
} @Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("AfterInitialization : " + beanName);
return bean; // you can return any other object as well
} }
Test.java
public class Test { public static void main(String[] args) {
@SuppressWarnings("resource")
AbstractApplicationContext context = new ClassPathXmlApplicationContext("beaFactoryTest.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
obj.getMessage();
// 注册钩子方法
context.registerShutdownHook();
}
}
查看源码:
@Override
// 在JVM运行期间,注册一个钩子关闭方法,关闭掉这个context。实际的关闭程序的操作,被代理给doClose方法。
public void registerShutdownHook() {
if (this.shutdownHook == null) {
// No shutdown hook registered yet.
this.shutdownHook = new Thread() {
@Override
public void run() {
doClose();
}
};
Runtime.getRuntime().addShutdownHook(this.shutdownHook);
}
}
xml文件
<bean id = "helloWorld" class = "com.lee.demo.beanfactory.HelloWorld"
init-method = "init" destroy-method = "destroy">
<property name = "message" value = "Hello World!"/>
</bean> <bean class = "com.lee.demo.beanfactory.InitHelloWorld" />
执行结果:
BeforeInitialization : helloWorld
Bean is going through init.
AfterInitialization : helloWorld
Your Message : Hello World!
[org.springframework.context.support.ClassPathXmlApplicationContext] - Closing org.springframework.context.support.ClassPathXmlApplicationContext@6ae40994: startup date [Thu May 17 23:31:53 JST 2018]; root of context hierarchy
Bean will destroy now.
在这里大致说一下Spring的实例化过程:
实例化Bean对象→设置对象属性→检查Aware相关接口并设置相关依赖→BeanPostProcessor前置处理→检查是否是InitializingBean以决定是否调用afterPropertiesSet方法→
检查是否配置有自定义的init-method方法→BeanPostProcessor后置处理→是否实现DisposableBean接口→是否配置有自定义的destroy方法
3.Aware接口
它是干什么用的呢?作用就是通过上下文(Context)可以获得当前环境。看看它的接口:
我们拿BeanNameAware来举个例子。
public class User implements GetNameAware { private String id;
private String name;
private String address;
6 @Override
7 public void setBeanName(String name) {
8 this.id = name;
9 }
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
} }
public class User2 { private String id;
private String name;
private String address;
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
} }
public interface GetNameAware extends BeanNameAware { }
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beaFactoryTest.xml");
User user = (User) ctx.getBean("user1");
User2 user2 = (User2) ctx.getBean("user2");
System.out.println("user id " + user.getId() + " user name " + user.getName() + " user address " + user.getAddress());
System.out.println("========================================");
System.out.println("user2 id " + user2.getId() + " user2 name " + user2.getName() + " user2 address " + user2.getAddress());
}
}
<bean id="user1" class="com.lee.demo.aware.User">
<property name="name" value="lee"/>
<property name="address" value="China"/>
</bean> <bean id="user2" class="com.lee.demo.aware.User2">
<property name="name" value="lin"/>
<property name="address" value="Tokyo"/>
</bean>
执行结果(user id 因为继承了GetNameAware接口,对BeanName进行了设置):
user id user1 user name lee user address China
========================================
user2 id null user2 name lin user2 address Tokyo
Spring 中的接口知识整理的更多相关文章
- Spring中Ordered接口简介
目录 前言 Ordered接口介绍 Ordered接口在Spring中的使用 总结 前言 Spring中提供了一个Ordered接口.Ordered接口,顾名思义,就是用来排序的. Spring是一个 ...
- 转:spring中InitailizingBean接口的简单理解
转自:https://www.cnblogs.com/wxgblogs/p/6849782.html spring中InitializingBean接口使用理解 InitializingBean接 ...
- spring中InitializingBean接口使用理解
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法. 测试程序如下: imp ...
- spring中ApplicationContextAware接口描述
项目中使用了大量的工厂类,采用了简单工厂模式: 通过该工厂类可以获取指定的处理器bean,这些处理器bean我们是从spring容器中获取的,如何获取,是通过实现ApplicationContextA ...
- spring中InitializingBean接口使用理解(转)
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法. 测试程序如下: imp ...
- spring(五):spring中Aware接口的使用
spring中自定义组件需要使用spring的底层组件时,可以通过自定义组件实现相关XxxAware接口,重写其中的方法进而实现 例如:自定义一个组件,该组件中需要使用ApplicationConte ...
- Spring中ApplicationContextAware接口的用法
1.为什么使用AppplicationContextAware? ApplicationContext的BeanFactory 的子类, 拥有更强大的功能,ApplicationContext可以在服 ...
- Spring中的接口BeanFactory和FactoryBean的学习
BeanFactory: 相当于对象工厂,可以获取对象的实例以及相应的属性.BeanFactory定义了IOC容器的最基本形式,并提供了IOC容器应遵守的的最基本的接口,也就是Spring IOC所遵 ...
- spring中ApplicationContextAware接口使用理解
一.这个接口有什么用?当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以直 ...
随机推荐
- Win10系列:VC++媒体播放控制4
(7)音量控制 MediaElement控件具有一个Volume属性,通过设置此属性的值可以改变视频音量的大小.接下来介绍如何实现视频的音量控制,首先打开MainPage.xaml文件,并在Grid元 ...
- [CodeForces332E]Binary Key
Problem 题目给出一个加密前的字符串长度为p和加密后的字符串长度为s,让你求一个长度为K字典序最小的密钥. 密钥是循环的,第i位为1表示加密前的第i为是有用的否则是没用的. Solution 首 ...
- sqlserver指定排序字段
在sqlserver中可以指定排序的字段,需要将哪个字段值排在最前面或最后面,都是可以的.见如下代码: SELECT * FROM public_comment order by case [User ...
- 运行TensorFlow出现Your CPU supports instructions that this TensorFlow binary was not compiled to use: AV
原因: import os #在顶头位置加上 os.environ["TF_CPP_MIN_LOG_LEVEL"]='1' # '1'表示默认的显示等级,运行时显示所有信息 os. ...
- Traumland--梦乡--IPA--德语
德国电影<<英俊少年>>的插曲.
- doctype和Quirks模式
doctype: 告诉浏览器使用什么模式去渲染页面,可能会影响页面的css渲染和js代码的执行. DTD :为了兼容旧的浏览器渲染方式,将DTD作为参数告诉浏览器使用什么模式渲染页面.始于IE6; 1 ...
- LeetCode 43 字符串相乘
题目: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", ...
- Github拉取远端的时候提示“ssh: connect to host github.com port 22: Connection timed out”错误
在使用Github的时候,如果使用到拉取远端分支的时候或者测试ssh -T git@github.com的时候可能会出现连接失败的问题,错误描述为“ssh: connect to host githu ...
- chromium ③
chromium源码学习笔记(1) -- 学习计划 对于c++开发者来说,chromium几乎是目前最值得学习的优秀开源代码.先看看chromium包含了多少令人激动的特性: 1, ...
- 2019-03-18-day013-装饰器与内置函数
上周回顾 函数: def 函数名(): 缩进 函数体 闭包: a = 50 def func(): a = 10 def avg(): print(a) 函数名的使用: 当做值被赋值给变量 当做返回值 ...