Spring 中的接口知识整理

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

目录:

FactoryBean

BeanPostProcessor

1.FactoryBean

FactoryBean接口,它在Spring框架源码内部,被大量使用,如使用AOP创建bean的代理时,使用了ProxyFactoryBean;从JNDI中查找对象时,使用了JndiObjectFactoryBean。

它在框架外,很少使用。但是为了学习,也得研究研究,您说是不?

它怎么使用?首先看看构造。

1 public interface FactoryBean<T> {

 // 返回的是这个工厂管理的对象的实例
2 T getObject() throws Exception;
3  // 返回的是工厂创建的对象的类型
4 Class<?> getObjectType();
5
6 boolean isSingleton();
7
8 }

上个例子,看具体东西。

 1 public class Tool {
 2
 3
 4     private int id;
 5     public Tool(int id) {
 6         this.id = id;
 7     }
 8     public int getId() {
 9         return id;
10     }
11
12     public void setId(int id) {
13         this.id = id;
14     }
15 }
 1 public class ToolFactory implements FactoryBean<Tool> {
 2
 3     private int factoryId;
 4     private int toolId;
 5     // 创建的是Tool的对象
 6     @Override
 7     public Tool getObject() throws Exception {
 8         return new Tool(toolId);
 9     }
10
11     @Override
12     public Class<?> getObjectType() {
13         return Tool.class;
14     }
15
16     @Override
17     public boolean isSingleton() {
18         return false;
19     }
20
21     public int getFactoryId() {
22         return factoryId;
23     }
24
25     public int getToolId() {
26         return toolId;
27     }
28
29     public void setFactoryId(int factoryId) {
30         this.factoryId = factoryId;
31     }
32
33     public void setToolId(int toolId) {
34         this.toolId = toolId;
35     }
36
37 }
 1 public class Test {
 2
 3     public static void main(String[] args) {
 4         @SuppressWarnings("resource")
 5         ApplicationContext context = new ClassPathXmlApplicationContext("beaFactoryTest.xml");
 6         Tool tool = (Tool) context.getBean("tool");         // 在名字前面加 & 表示要得到工厂类的bean
 7         ToolFactory tool2 = (ToolFactory) context.getBean("&tool");
 8         System.out.println("Tool Id is " + tool.getId());
 9         System.out.println("ToolFactory Id is " + tool2.getFactoryId());
10
11     }
12 }
1     <bean id="tool" class="com.lee.demo.beanfactory.ToolFactory">
2         <property name="factoryId" value="9090"/>
3         <property name="toolId" value="108"/>
4     </bean>

最后执行结果:

Tool Id is 108
ToolFactory Id is 9090

2.BeanPostProcessor

它叫bean后处理器,也就是处理bean,它针对所有的bean,在初始化前后,对bean进行操作。主要内容我会在例子中描述。

例子:

 1 public class HelloWorld {
 2     private String message;
 3
 4     public void setMessage(String message) {
 5         this.message = message;
 6     }
 7
 8     public void getMessage() {
 9         System.out.println("Your Message : " + message);
10     }
11   

// 加上init方法和destory方法,是为了在后面验证他们和postProcessBeforeInitialization  postProcessAfterInitialization 执行的先后顺序
12     public void init() {
13         System.out.println("Bean is going through init.");
14     }
15
16     public void destroy() {
17         System.out.println("Bean will destroy now.");
18     }
19 }
 1 public class InitHelloWorld implements BeanPostProcessor {
 2     // BeanPostProcessor 接口中主要是下面两个方法 初始化前的后处理 初始化后的后处理
 3     @Override
 4     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
 5
 6         System.out.println("BeforeInitialization : " + beanName);
 7         return bean; // you can return any other object as well
 8     }
 9
10     @Override
11     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
12
13         System.out.println("AfterInitialization : " + beanName);
14         return bean; // you can return any other object as well
15     }
16
17 }
Test.java
 1 public class Test {
 2
 3     public static void main(String[] args) {
 4         @SuppressWarnings("resource")
 5         AbstractApplicationContext  context = new ClassPathXmlApplicationContext("beaFactoryTest.xml");
 6         HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
 7         obj.getMessage();       // 注册钩子方法
 8         context.registerShutdownHook();
 9     }
10 }

查看源码:

 1 @Override    // 在JVM运行期间,注册一个钩子关闭方法,关闭掉这个context。实际的关闭程序的操作,被代理给doClose方法。
 2     public void registerShutdownHook() {
 3         if (this.shutdownHook == null) {
 4             // No shutdown hook registered yet.
 5             this.shutdownHook = new Thread() {
 6                 @Override
 7                 public void run() {
 8                     doClose();
 9                 }
10             };
11             Runtime.getRuntime().addShutdownHook(this.shutdownHook);
12         }
13     }

xml文件

1     <bean id = "helloWorld" class = "com.lee.demo.beanfactory.HelloWorld"
2       init-method = "init" destroy-method = "destroy">
3       <property name = "message" value = "Hello World!"/>
4    </bean>
5
6    <bean class = "com.lee.demo.beanfactory.InitHelloWorld" />

执行结果:

1 BeforeInitialization : helloWorld
2 Bean is going through init.
3 AfterInitialization : helloWorld
4 Your Message : Hello World!
5 [org.springframework.context.support.ClassPathXmlApplicationContext] - Closing org[email protected]6ae40994: startup date [Thu May 17 23:31:53 JST 2018]; root of context hierarchy
6 Bean will destroy now.

在这里大致说一下Spring的实例化过程:

实例化Bean对象→设置对象属性→检查Aware相关接口并设置相关依赖→BeanPostProcessor前置处理→检查是否是InitializingBean以决定是否调用afterPropertiesSet方法→

检查是否配置有自定义的init-method方法→BeanPostProcessor后置处理→是否实现DisposableBean接口→是否配置有自定义的destroy方法

3.Aware接口

它是干什么用的呢?作用就是通过上下文(Context)可以获得当前环境。看看它的接口:

我们拿BeanNameAware来举个例子。

 1 public class User implements GetNameAware {
 2
 3     private String id;
 4     private String name;
 5     private String address;
 6     @Override
 7     public void setBeanName(String name) {
 8         this.id = name;
 9     }
10     public String getId() {
11         return id;
12     }
13     public String getName() {
14         return name;
15     }
16     public String getAddress() {
17         return address;
18     }
19     public void setId(String id) {
20         this.id = id;
21     }
22     public void setName(String name) {
23         this.name = name;
24     }
25     public void setAddress(String address) {
26         this.address = address;
27     }
28
29 }
 1 public class User2 {
 2
 3     private String id;
 4     private String name;
 5     private String address;
 6     public String getId() {
 7         return id;
 8     }
 9     public String getName() {
10         return name;
11     }
12     public String getAddress() {
13         return address;
14     }
15     public void setId(String id) {
16         this.id = id;
17     }
18     public void setName(String name) {
19         this.name = name;
20     }
21     public void setAddress(String address) {
22         this.address = address;
23     }
24
25 }
1 public interface GetNameAware extends BeanNameAware {
2
3
4 }
 1 public class Test {
 2     public static void main(String[] args) {
 3         ApplicationContext ctx = new ClassPathXmlApplicationContext("beaFactoryTest.xml");
 4         User user = (User) ctx.getBean("user1");
 5         User2 user2 = (User2) ctx.getBean("user2");
 6         System.out.println("user id " + user.getId() + " user name " + user.getName() + " user address " + user.getAddress());
 7         System.out.println("========================================");
 8         System.out.println("user2 id " + user2.getId() + " user2 name " + user2.getName() + " user2 address " + user2.getAddress());
 9     }
10 }
1     <bean id="user1" class="com.lee.demo.aware.User">
2         <property name="name" value="lee"/>
3         <property name="address" value="China"/>
4     </bean>
5
6     <bean id="user2" class="com.lee.demo.aware.User2">
7         <property name="name" value="lin"/>
8         <property name="address" value="Tokyo"/>
9     </bean>

执行结果(user id 因为继承了GetNameAware接口,对BeanName进行了设置):

1 user id user1 user name lee user address China
2 ========================================
3 user2 id null user2 name lin user2 address Tokyo

原文地址:https://www.cnblogs.com/lihao007/p/9053644.html

时间: 2024-11-05 21:19:01

Spring 中的接口知识整理的相关文章

Spring中Ordered接口简介

前言 Spring中提供了一个Ordered接口.Ordered接口,顾名思义,就是用来排序的. Spring是一个大量使用策略设计模式的框架,这意味着有很多相同接口的实现类,那么必定会有优先级的问题. 于是,Spring就提供了Ordered这个接口,来处理相同接口实现类的优先级问题. Ordered接口介绍 首先,我们来看下Ordered接口的定义: public interface Ordered { int HIGHEST_PRECEDENCE = Integer.MIN_VALUE;

spring中InitializingBean接口使用理解

InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法. 测试程序如下: import org.springframework.beans.factory.InitializingBean; public class TestInitializingBean implements InitializingBean{ @Override public void afterProp

spring中aware接口的

一.关于spring中Aware结尾接口介绍: Spring中提供一些Aware结尾相关接口,像是BeanFactoryAware. BeanNameAware.ApplicationContextAware.ResourceLoaderAware.ServletContextAware等等. 实现这些 Aware接口的Bean在被实例化 之后,可以取得一些相对应的资源,例如实现BeanFactoryAware的Bean在实例化后,Spring容器将会注入BeanFactory的实例,而实现Ap

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

spring中自定义组件需要使用spring的底层组件时,可以通过自定义组件实现相关XxxAware接口,重写其中的方法进而实现 例如:自定义一个组件,该组件中需要使用ApplicationContext.BeanFactory,那么我们就可以通过实现ApplicationContextAware.BeanFactoryAware接口实现 ApplicationContextAware public class MyAware implements ApplicationContextAware

Spring: Jsp+Java 相关知识整理 (十三)

1. 在Java中获取 .properties 文件的路径 (src/main/resources 下) ProjectName |---src/main/java |---src/main/resources |---test.properties package xxx.yyy; public class Utils { private String filePath = Utils.class.getClassLoader().getResource("test.properties&qu

spring中ApplicationContextAware接口使用理解

一.这个接口有什么用?当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象.二.怎么使用这个接口?例如我有一个方法类AppUtil,这个方法类中需要使用到的ApplicationContext中的某个bean(companyService).一.因为spring要建立属于自己的容器,就必须要加载自己的配置文件.这个时

spring 中 InitializingBean 接口使用理解

前言:这两天在看 spring 与 quart 的集成,所以了解到 spring 是如何初始化 org.springframework.scheduling.quartz.SchedulerFactoryBean 开始执行的,这个正好涉及到 InitializingBean 接口. InitializingBean 接口为 bean 提供了初始化方法的方式,它只包括 afterPropertiesSet 方法,凡是继承该接口的类,在初始化 bean 的时候会执行该方法. Initializing

Spring中Resource接口的前缀书写格式

Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt");   //这个得到的是ClassPahResource. Resource template = ctx.getResource("file:///some/resource/path/myTemplate.txt");         //这个得到的是FileSystemResource. Resou

Spring的BeanPostProcesser接口介绍

前言 废话不多说,直接进入主题. 同学们有想过这么一种情况吗:Spring容器提供给我们的一些接口实现类并不能满足我们的要求,但是我们又不想重新写一个类,只想在原来类上修改一些属性? 举个例子,SpringMVC中通过<mvc:annotation-driven>标签自动生成的RequestMappingHandlerAdapter有个HandlerMethodArgumentResolverComposite类型的argumentResolvers属性,这个属性内部有个HandlerMeth