本想每个小知识一篇随笔,但是那样,看起来有些单薄,所以,就放在一片文章里了。而且,以后还会慢慢在最后不断的追加。

目录:

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 中的接口知识整理的更多相关文章

  1. Spring中Ordered接口简介

    目录 前言 Ordered接口介绍 Ordered接口在Spring中的使用 总结 前言 Spring中提供了一个Ordered接口.Ordered接口,顾名思义,就是用来排序的. Spring是一个 ...

  2. 转:spring中InitailizingBean接口的简单理解

    转自:https://www.cnblogs.com/wxgblogs/p/6849782.html spring中InitializingBean接口使用理解   InitializingBean接 ...

  3. spring中InitializingBean接口使用理解

    InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法. 测试程序如下: imp ...

  4. spring中ApplicationContextAware接口描述

    项目中使用了大量的工厂类,采用了简单工厂模式: 通过该工厂类可以获取指定的处理器bean,这些处理器bean我们是从spring容器中获取的,如何获取,是通过实现ApplicationContextA ...

  5. spring中InitializingBean接口使用理解(转)

    InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法. 测试程序如下: imp ...

  6. spring(五):spring中Aware接口的使用

    spring中自定义组件需要使用spring的底层组件时,可以通过自定义组件实现相关XxxAware接口,重写其中的方法进而实现 例如:自定义一个组件,该组件中需要使用ApplicationConte ...

  7. Spring中ApplicationContextAware接口的用法

    1.为什么使用AppplicationContextAware? ApplicationContext的BeanFactory 的子类, 拥有更强大的功能,ApplicationContext可以在服 ...

  8. Spring中的接口BeanFactory和FactoryBean的学习

    BeanFactory: 相当于对象工厂,可以获取对象的实例以及相应的属性.BeanFactory定义了IOC容器的最基本形式,并提供了IOC容器应遵守的的最基本的接口,也就是Spring IOC所遵 ...

  9. spring中ApplicationContextAware接口使用理解

    一.这个接口有什么用?当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以直 ...

随机推荐

  1. Win10系列:VC++媒体播放控制4

    (7)音量控制 MediaElement控件具有一个Volume属性,通过设置此属性的值可以改变视频音量的大小.接下来介绍如何实现视频的音量控制,首先打开MainPage.xaml文件,并在Grid元 ...

  2. Vue + Element UI 实现权限管理系统(更换皮肤主题)

    自定义主题 命令行主题工具 1.安装主题工具 首先安装「主题生成工具」,可以全局安装或者安装在当前项目下,推荐安装在项目里,方便别人 clone 项目时能直接安装依赖并启动. yarn add ele ...

  3. 计算机基础part1

    一:计算机的基本组成 1.计算机由输入单元.控制单元.算法逻辑单元.输出单元.存储单元,五大单元组成 二:概念篇 CPU:中央处理器,其内含有指令集(取码-解码-执行的过程) CPU同一时刻只能干一件 ...

  4. day2编程语言的两大分类

    编程的语言的发展经历了 机器语言 汇编语言 高级语言 高级语言更贴近人类的语言,但是必须被翻译成计算机能读懂的二进制后,才能够被执行,按照翻译方式分为 1   编译型(需要编译器,相当于用谷歌翻译); ...

  5. nginx在linux上的安装与配置详解(一)

    Nginx的安装与配置详解 (1)nginx简介     nginx概念: Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like ...

  6. 四:FAQ附录(容器交互,镜像交互,镜像导出)

    1.交互式运行容器的方法: 1>-it进入到操作系统中: 2>另开一个cmd验证: 3>这是在image之上多了一个可写的从:可以运行centos的命令做一些事(touch .yum ...

  7. SQL-14 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。 注意对于重复的emp_no进行忽略。

    题目描述 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t.注意对于重复的emp_no进行忽略.CREATE TABLE IF NOT EXISTS &q ...

  8. web项目与jsp有关的三个jar的依赖

    <!-- jsp --> <dependency> <groupId>javax.servlet</groupId> <artifactId> ...

  9. C#正则表达式类Match和Group类的理解

    正则表达式可以看做一种有特定功能的小型编程语言,在一段文本中定位子字符串.利用正则表达式可以快速地分析大量的文本以找到特定的字符模式:提取.编辑.替换或删除文本子字符串:或将提取的字符串添加到集合.正 ...

  10. Final阶段第1周/共1周 Scrum立会报告+燃尽图 06

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2485] 版本控制:https://git.coding.net/liuyy08 ...