在bean的实例化过程中,也会用到一系列的相关注解. 如@PostConstruct和@PreDestroy用来标记初始化和销毁方法. 平常更多的是侧重于应用,很少会有人去了解它背后发生的事情. 今天就来看下它们的源码,这样它们对你来说就不再是黑盒子了,而且学习源码对每个技术人来说都是必经之路. 人们对事物的认知以及自己的做法,往往分为三个阶段: 1)最初看一个事物,非常复杂,简直没有一点头绪,此时很多人就会放弃. 2)过了一段时间后,发现整体来看没有想象中的那么难,此时很多人以为自己已经get…
从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct.这两个注解被用来修饰一个非静态的void()方法,而且这个方法不能有抛出异常声明. 使用方式,例如: @PostConstruct //方式1 public void someMethod(){ ... } public @PostConstruct void someMethod(){ //方式2 ... } 1.@PostCo…
从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct.这两个注解被用来修饰一个非静态的void()方法.而且这个方法不能有抛出异常声明. 使用方式,例如: @PostConstruct //方式1 public void someMethod(){ ... } public @PostConstruct void someMethod(){ //方式2 ... } 1.@PostCo…
@PostConstruct注解使用 @PostConstructApi使用说明 The PostConstruct annotation is used on a method that needs to be executed after dependency injection is done to perform any initialization. This method MUST be invoked before the class is put into service. Th…
问题的描述与方案的提出 在Spring从XML转向注解时,为了自身的开发方便,对注解含义进行了扩充(具体参考本号上一篇文章). 这个扩充直接导致了一个问题,就是需要从注解往元注解以及元元注解(即沿着从下向上的方向)里传递数据. 为了更好的描述这个问题,请再看个示例: @interface A {     String a() default "";} @A@interface B {     String a() default "";     String b()…
@Resource是Java的注解,表示一个资源,它具有双向的含义,一个是从外部获取一个资源,一个是向外部提供一个资源. 这其实就对应于Spring的注入和注册.当它用在字段和方法上时,表示前者.当它用在类上时表示后者.Spring只提供了对前者的支持. 该注解本身表示的是资源,资源的含义是很宽泛的.由于绝大部分情况下在使用Spring的时候,它的容器里都是普通的bean,所以这个注解就作为bean的注入来使用了. 对于依赖注入这个事情,整体可以分为三步: 1)找出需要被注入的元素,即标了注解的…
在Spring中能够完成依赖注入的注解有JavaSE提供的@Resource注解,就是上一篇文章介绍的. 还有JavaEE提供的@javax.inject.Inject注解,这个用的很少,因为一般都不会去引用JavaEE的jar包. 编程新说注:JavaEE早已经被Oracle抛弃了.JavaEE这个名字已经成为历史. 还有两个就是@Value和@Autowired注解,这可是Spring自己的亲孩子.所以这两个使用的最多. 虽然注解不一样,但是目的一样,都是用来进行依赖注入,而且Spring处…
在容器启动快完成时,会把所有的单例bean进行实例化,也可以叫做预先实例化. 这样做的好处之一是,可以及早地发现问题,及早的抛出异常,及早地解决掉. 本文就来看下整个的实例化过程.其实还是比较繁琐的. 一.从容器中找出所有的bean定义名称 因为不知道谁是单例bean,所以只能先全部找出来.如下图01: 二.循环遍历所有的bean名称,检查是否符合条件 首先要合并bean定义,因为bean定义可以有父子关系,类似继承. 然后这个合并后的bean定义必须是,非抽象的,单例的,非延迟初始化的. 那么…
非Spring风格的代码与Spring的结合 现在的开发都是基于Spring的,所有的依赖都有Spring管理,这没有问题. 但是要突然写一些非Spring风格的代码时,可能会很不习惯,如果还要和Spring风格的代码结合起来的话,就会稍显麻烦. 因为非Spring风格的代码不由Spring管理,所以Spring不会给我们注入依赖,相反,我们要自己去Spring中拿取依赖. 所以首先目标就是要获取Spring容器,即ApplicationContext,方法通常如下图01: 定义一个类实现App…
在Spring中,既可以实现InitializingBean和DisposableBean接口或在bean配置文件中指定 init-method 和 destroy-method 在初始化和销毁回调函数.在这篇文章中,我们将介绍如何使用 @PostConstruct 和 @PreDestroy 注解来做同样的事情. 注:@PostConstruct和@PreDestroy 标注不属于 Spring,它是在J2EE库- common-annotations.jar. @PostConstruct…
实现 初始化方法和销毁方法3种方式: 实现标识接口 InitializingBean,DisposableBean(不推荐使用,耦合性太高) 设置bean属性 Init-method destroy-method 使用注释配置后,调用@PostConstruct和@PreDestroy注解 注:@PostConstruct和@PreDestroy 标注不属于 Spring,它是在J2EE库- common-annotations.jar. @PostConstruct 和 @PreDestroy…
在Spring中,既可以实现InitializingBean和DisposableBean接口或在bean配置文件中指定 init-method 和 destroy-method 在初始化和销毁回调函数.在这篇文章中,我们将介绍如何使用 @PostConstruct 和 @PreDestroy 注解来做同样的事情. 注:@PostConstruct和@PreDestroy 标注不属于 Spring,它是在J2EE库- common-annotations.jar. @PostConstruct…
其实对Spring的了解达到一定程度后,你就会发现,无论是使用Spring框架开发的应用,还是Spring框架本身的开发都是围绕着注解构建起来的. 空口无凭,那就说个最普通的例子吧. 在Spring中要启用一项XXX功能,标准做法就是用@EnableXXX这种“启用”类型的注解. 那么这种类型的注解一般都做了什么呢?分析一下吧. 看过本号文章的人都知道,Spring的核心就是bean定义和bean,如果我想增加某方面的功能,只需写若干个类,并作为bean定义注册到容器中即可. 因此“启用”类型的…
一个小小的里程碑 首先感谢能看到本文的朋友,感谢你的一路陪伴. 如果每篇都认真看的话,会发现本系列以bean定义作为切入点,先是详细解说了什么是bean定义,接着又强调了bean定义为什么如此重要. 然后又讲了获取bean定义详细信息的方法,接着又讲了bean定义注册的若干种方式,然后是bean定义注册方式的实现细节. 最后又以SpringBoot应用为例,从容器启动前.启动后分两个阶段解说bean定义是如何进入到容器里的. 就是bean工厂后处理器配合使用@ComponentScan注解和@I…
以下内容引用自http://wiki.jikexueyuan.com/project/spring/annotation-based-configuration/spring-jsr250-annotation.html: Spring还支持基于JSR-250的注解,其中包括@PostConstruct,@PreDestroy和@Resource注解.虽然这些注解不是真正需要的,因为你已经有其他替代品,但让我们简要了解一下. @PostConstruct和@PreDestroy注解 要定义一个b…
从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct.这两个注解被用来修饰一个非静态的void()方法.而且这个方法不能有抛出异常声明. 使用方式,例如: @PostConstruct //方式1 public void someMethod(){ ... } public @PostConstruct void someMethod(){ //方式2 ... } 1.@PostCo…
通过实现 @PostConstruct 和 @PreDestroy 注解,也可以指定 bean 的初始化和销毁方法 一.Student 类 public class Student{ public Student(){ System.out.println("创建 Student 对象"); } //对象创建并赋值之后被调用 @PostConstruct public void init(){ System.out.println("初始化"); } //容器移出…
现在的Spring相关开发都是基于SpringBoot的. 最后在打包时可以把所有依赖的jar包都打进去,构成一个独立的可执行的jar包.如下图13: 使用java -jar命令就可以运行这个独立的jar包.如下图14: 这个jar包的执行入口就是一个main函数,典型的格式如下: @SpringBootApplicationpublic class TasteSpringApplication {    public static void main(String[] args) {     …
别看Spring现在玩的这么花,其实它的“筹码”就两个,“容器”和“bean定义”. 只有先把bean定义注册到容器里,后续的一切可能才有可能成为可能. 所以在进阶的路上如果要想走的顺畅些,彻底搞清楚bean定义注册的所有细节至关重要. 毕竟这是万里长征的第一步.有句话怎么说来着,“勿在浮沙筑高台”. Spring步入注解和Java配置的时代也有些时日了.而且也旗帜鲜明的表达了bean的注册方法. 这不,就是这个接口,AnnotationConfigRegistry,如下图01: 再来看下这个接…
上一篇文章强调了bean定义注册占Spring应用的半壁江山.而且详细介绍了两个重量级的注册bean定义的类. 今天就以SpringBoot为例,来看看整个SpringBoot应用的bean定义是如何注册进容器的. 先来看看经典的启动入口,如下图01: 可以看到调用的是run方法,并把主类(main或primary)作为第一个参数出入. 接下来要做的事情,就是顺藤摸瓜,看看到底发生了什么,并确定下究竟哪些类被注册了bean定义. 此时,我就是一个快乐的小侦探,OK,走起. 上面的调用走到了这里,…
上一篇文章整体非常轻松,因为在容器启动前,只注册了一个bean定义,就是SpringBoot的主类. OK,今天接着从容器的启动入手,找出剩余所有的bean定义的注册过程. 具体细节肯定会颇为复杂,同样,大家只需关注都干了什么,不用考虑如何干的. 来宏观的看下容器的启动过程,即refresh方法,如下图01: 只捡重要的来说,就是四大步: 第一,准备好bean工厂(BeanFactory). 第二,调用已经注册的bean工厂后处理器(BeanFactoryPostProcessor). 第三,注…
上一篇文章介绍了对@Configuration类的处理逻辑,这些逻辑都写在ConfigurationClassPostProcessor类中. 这个类不仅是一个“bean工厂后处理器”,还是一个“bean定义注册后处理器”. 这其实是两个接口,它们都是来操作bean定义.所以非常重要. 换句话说,能操作bean定义的,也只有这两个接口,你说重要不重要. 查看下类型信息,在整个Spring中确实只有这两个接口,如下图01: 虽然它们都是进行和bean定义相关的操作,但目的却是明显不同的. bean…
@Resource 注解被用来激活一个命名资源(named resource)的依赖注入,在JavaEE应用程序中,该注解被典型地转换为绑定于JNDI context中的一个对象. Spring确实支持使用@Resource通过JNDI lookup来解析对象,默认地,拥有与@Resource注解所提供名字相匹配的“bean name(bean名字)”的Spring管理对象会被注入. 在下面的例子中,Spring会向加了注解的setter方法传递bean名为“dataSource”的Spring…
关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二种是:通过 在xml中定义init-method 和 destory-method方法 第三种是: 通过bean实现InitializingBean和 DisposableBean接口 下面演示通过  @PostConstruct 和 @PreDestory 第一种: 1:定义相关的实现类: pac…
关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二种是:通过 在xml中定义init-method 和  destory-method方法 第三种是: 通过bean实现InitializingBean和 DisposableBean接口 下面演示通过  @PostConstruct 和 @PreDestory 1:定义相关的实现类: package…
1)@Resource(JSR-250标准注解,推荐使用它来代替Spring专有的@Autowired注解) Spring 不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分别…
JSR 定义:JSR是Java Specification Requests的缩写,意思是Java 规范提案.是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求.任何人都可以提交JSR,以向Java平台增添新的API和服务.JSR已成为Java界的一个重要标准. 扩展:属于JSR的jar包存在于javax包下. Spring对JRS-250的支持注解 @Resoure @Resoure(name="    ")相当于@Autowired和@…
本文介绍了使用Spring注解注入属性的方法.使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifier,@PostConstruct,@PreDestroy等注解来实现. 1.1. 使用注解以前我们是怎样注入属性的 类的实现: 1 public class UserManagerImpl implements UserManager { 2 private UserDao userDao; 3 public…
本文介绍了使用spring注解注入属性的方法. 使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifier,@PostConstruct,@PreDestroy等注解来实现. 使用注解以前我们是怎样注入属性的 类的实现: 1. public class UserManagerImpl implements UserManager { 2. private UserDao userDao; 3. public v…
关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二种是:通过 在xml中定义init-method 和  destory-method方法 第三种是:通过bean实现InitializingBean和 DisposableBean接口 下面演示通过  @PostConstruct 和 @PreDestory 1:定义相关的实现类: package…