
Spring
文章平均质量分 64
白帆瀚宇
这个作者很懒,什么都没留下…
展开
-
静态AOP使用示例
加载时织入指的是在虚拟机载入字节码文件时动态织入AspectJ切面.spring框架的值添加微AspectJ LTW在动态织入过程中提供更细粒度的控制.在java5+的代理能使用一个叫“Vanilla”的AspectJ LTW,这需要在启动JVM的时候将某个JVM参数设置为开.这种JVM范围的设置在一些情况下或许不错,但是通常情况下显得粗粒度了.Spring的LTW能让你在per-ClassLoader的基础上打开LTW,这显然更加细粒度,而且不用修改服务的启动脚本,只需要简单修改应用上下文的一个或几原创 2022-06-01 19:00:00 · 499 阅读 · 0 评论 -
创建AOP之创建
在前面的文章分析了获取增强器以及匹配的增强器之后,我们便可以根据增强器来创建代理了. protected Object createProxy(Class<?> beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource) { if (this.beanFactory instanceof ConfigurableListableBe原创 2022-06-02 12:00:00 · 449 阅读 · 0 评论 -
创建AOP之寻找匹配的增强器
前面一篇文章已经分析了如何获取增强器,下面分析这些增强器哪些是真正匹配,是我们需要的,需要挑出来. protected List<Advisor> findAdvisorsThatCanApply( List<Advisor> candidateAdvisors, Class<?> beanClass, String beanName) { ProxyCreationContext.setCurrentProxiedBeanName(beanName);原创 2022-06-01 16:00:00 · 132 阅读 · 0 评论 -
创建AOP之获取增强器
protected Object[] getAdvicesAndAdvisorsForBean( Class<?> beanClass, String beanName, @Nullable TargetSource targetSource) { // 获取增强器 List<Advisor> advisors = findEligibleAdvisors(beanClass, beanName); if (advisors.isEmpty()) { ret.原创 2022-05-31 20:00:00 · 215 阅读 · 0 评论 -
创建AOP之总览
上一篇文章分析了自定义标签注册解析并且注册了AnnotationAwareAspectJAutoProxyCreator,我们可以看看这个类的层次结构:可以看到AnnotationAwareAspectJAutoProxyCreator实现了BeanPostProcessor接口,当Spring加载这个bean的时候会在实例化前调用他的postProcessAfterInitialization方法在父类AbstractAutoProxyCreator的postProcessAfterInitiali原创 2022-05-30 19:30:00 · 340 阅读 · 0 评论 -
aop的使用的介绍
1、导入依赖<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.2</version></dependency>2、创建被拦截的beanpublic class TestBean { private String testStr = "testS原创 2022-05-30 15:00:00 · 225 阅读 · 0 评论 -
Spring中的事件广播器和监听器
事件传播器在分析Spring的事件传播器之前,还是先来看一下Spring的事件监听的简单用法.1、定义监听器事件public class TestEvent extends ApplicationEvent { public String msg; public TestEvent(Object source) { super(source); } public TestEvent(Object source, String msg) {原创 2022-05-29 10:00:00 · 552 阅读 · 0 评论 -
初始化消息资源
Spring中的国际化相信很多人都听过,下面先分析一下使用方法.比如我们正在开发一个支持多国语言的web应用程序,要求系统能够根据客户端的系统的语言类型返回对应的界面:英文的操作系统返回英文界面,中文的操作系统返回中文界面,这就是有名的i18n国际化问题.简单来说就是为每种语言提供一套相应的资源文件,并以规范化命名的方式保存在特定的目录中,由系统自动根据客户端语言选择适合的资源文件.“国际化信息”需要两个条件来确定一个特定类型的本地化信息,这两个条件分别是:语言类型和国家/地区的类型.如中文本地化信息原创 2022-05-28 15:31:52 · 149 阅读 · 0 评论 -
BeanPostProcessor
先来分析一下beanPostProcessor的注册.BeanPostProcessor的调用是在bean的实例化阶段进行的.自定义一个后处理器:public class MyInstantiationAwareBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) thro原创 2022-05-28 13:18:55 · 282 阅读 · 0 评论 -
BeanFactoryPostProcessor
BeanFactory是Spring中容器功能的基础,用于存放所有已经加载的bean,为了保证程序上的高可扩展性,Spring针对BeanFactory做了大量的扩展.激活注册BeanFactoryPostProcessorBeanFactoryPostProcessor和BeanPostProcessor类似,可以对beanDefinition进行处理,也就是说SpringIOC容器允许BeanFactoryPostProcessor在容器实际实例化任何bean之前读取beanDefinition,并原创 2022-05-26 19:30:00 · 12818 阅读 · 0 评论 -
ApplicationContext之功能扩展
接这上篇文章分析,上篇文章分析到创建好beanFactory,Spring也已经完成对配置文件的解析,ApplicationContext也是在这个基础上进行展开的.protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // 设置 beanFactory的classLoader为当前context的classLoader beanFactory.setBeanClassLoader(getC原创 2022-05-25 19:30:00 · 211 阅读 · 0 评论 -
ApplicationContext
之前的分析都是在XmlBeanFactory的基础上进行的分析,现在我们开始分析ApplicationContext,相比之下ApplicationContext提供了更多的扩展功能.首先看看使用两个不同的类去加载配置文件在写法上的不同:使用BeanFactoryBeanFactory bf = new XmlBeanFactory(new ClassPathResource(“beanFactoryTest.xml));使用ApplicationContextApplicationCo原创 2022-05-24 19:30:00 · 270 阅读 · 0 评论 -
Spring创建bean之初始化Bean和注册DisposableBean
初始化Beanbean配置的时候,有一个init-method的属性,这个属性就是在bean初始化的时候调用指定的方法来进行初始化.protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) { // 判断是否需要权限 if (System.getSecurityManager() != null) { // 需要权限原创 2022-05-23 10:00:00 · 455 阅读 · 0 评论 -
Spring创建bean之属性注入
依赖注入即属性填充this.populateBean(beanName, mbd, instanceWrapper);protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { if (bw == null) { if (mbd.hasPropertyValues()) { throw new Bea原创 2022-05-22 10:00:00 · 334 阅读 · 0 评论 -
Spring创建bean之实例化
上一篇文章分析了创建bean的整个过程时候,下面继续分步骤的进行分析Spring是如何创建bean的.首先我们分析一下Spring是如何实例化bean的:protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) { // 解析bean的class Class<?> beanClass = this.resolveBea原创 2022-05-21 17:25:54 · 377 阅读 · 0 评论 -
Spring创建bean
之前分析了准备创建bean的一些操作.现在来分析doCreateBean()这个方法做了哪些事.protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { BeanWrapper instanceWrapper = null; // 判断是不是singleton类型的原创 2022-05-21 14:57:29 · 325 阅读 · 0 评论 -
Spring中的循环依赖
什么循环依赖?比如最简单的,A依赖B,B依赖A.或者这个依赖的圈更大一些:A依赖B,B依赖C,C依赖A.Spring解决循环依赖其实前面提到过Spring并不是会解决所有的依赖,只有满足一定的条件的依赖才会尝试解决.Spring容器循环依赖包括构造器循环依赖和setter循环依赖.构造器循环依赖通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出BeanCurrentlyInCreationException异常表示循环依赖.还记得之前分析的,在创建bean之前,会给当前的beanN原创 2022-05-21 12:19:08 · 278 阅读 · 0 评论 -
准备创建Bean
前面分析了获取单例Bean,回忆一下,首先先尝试从缓存中获取bean,如果缓存中没有,会先给beanName标记正在创建bean,然后调用ObjectFactory的getObject来创建bean,创建完成后会把beanName的标记状态去掉,更新三级缓存的数据.那么分析到这里,最关键的就是那个getObject方法.上一篇文章也分析了,Spring调用了一个getSingleton的重载方法:public Object getSingleton(String beanName, ObjectFacto原创 2022-05-21 11:55:40 · 138 阅读 · 0 评论 -
获取单例bean
前面分析了从缓存中获取bean,那么没有缓存的时候,按照推理,就是应该创建bean了.Spring中运用了一个重载方法:getSingleton来进行获取的.分析一下这个方法public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { Assert.notNull(beanName, "Bean name must not be null"); synchronized (this.原创 2022-05-20 10:00:00 · 215 阅读 · 0 评论 -
bean的实例中获取对象
在bean的加载流程中有一个非常高频的方法:getObjectForBeanInstance().这个方法是我们在得到bean的实例之后要做的,这个方法主要功能就是检测一下bean是不是FactoryBean类型的,如果是则需要调用getObject方法,具体的FactoryBean的使用,在之前的文章里有分析过.上源码分析一下protected Object getObjectForBeanInstance( Object beanInstance, String name, String be原创 2022-05-19 19:45:00 · 370 阅读 · 0 评论 -
缓存中获取单例bean
为了提高效率,很多地方都会通过加缓存进行性能优化.Spring中的单例bean也不例外,Spring中的单例容器中的对象只会被创建一次,后续使用,直接从单例容器中取即可.在调用getBean()方法的时候,会先尝试从缓存中获取,从缓存中获取这里涉及到一个三级缓存的问题,也是面试中常常被问到的一个问题.先来看看三级缓存的源码:public Object getSingleton(String beanName) { return getSingleton(beanName, true);}pr原创 2022-05-18 19:44:27 · 138 阅读 · 0 评论 -
FactoryBean的用法
有没有想过为什么Spring要使用FactoryBean创建对象?Spring通过反射机制利用bean的class属性指定的实现类来实例化bean.在某些情况下,实例化bean过程比较复杂,如果按照传统的方式,则需要在< bean>中提供大量的配置信息,配置方式的灵活性是受限的,采用编码的方式可能会得到一个简单的方案.Spring为次提供了一个FactoryBean的工厂类接口,用户可以通过实现该接口制定实例化bean的逻辑.从3.0开始,FactoryBean开始支持范型,即接口声明改为Fa原创 2022-05-18 17:57:01 · 3340 阅读 · 1 评论 -
Bean的加载流程
根据之前的分析,可以知道我们已经把配置文件的元素解析好了,并且把bean标签对应的元素都解析到了beanDefinition的对应属性中.下面就先大致看下bean加载的整个流程,细节后面再分析Cat whiteCat =(Cat) bf.getBean("whiteCat");上面的getBean到底实现了哪些功能,一起 看看源码吧. public Object getBean(String name) throws BeansException { return doGetBean(name,原创 2022-05-16 11:14:27 · 1548 阅读 · 0 评论 -
Spring自定义标签的解析
前面已经讲了Spring中默认标签的解析过程,下面开始分析自定义标签的解析.还是从最开始配置文件解析成document,并且得到对应的root之后,开始对所有的元素进行解析,而就是这里边会分默认和自定义标签两种格式的区分: protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { if (delegate.isDefaultNamespace(root)) { NodeL原创 2022-05-15 10:00:00 · 671 阅读 · 1 评论 -
spring中默认标签alias、import标签解析
Alias标签在bean标签里边有一个alias属性和name属性,可以指定bean的别名,但是有的场景下,在定义bean的时候就把他的别名都指定好是不适用的.比如这个Bean在组件A中,想把他叫做componentA,但是在组件B中又想把他叫做componetB,所以还有一个单独的标签:< alias>专门解决上述场景的.<bean id="myBean" class="com.itpluto.MyBean"></bean><alias name="myB原创 2022-05-14 18:45:00 · 872 阅读 · 0 评论 -
spring中默认标签Bean标签解析二
回顾一下上一节的入口代码 protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) { // 1、解析bean标签 BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele); if (bdHolder != null) { // 2、如果bdHolder不为空的时候存在默认标签的子节原创 2022-05-14 13:46:26 · 280 阅读 · 0 评论 -
spring中默认标签Bean标签解析一
在Spring种有两种标签,一种是默认标签,另一种是自定义标签.对两种标签的用法和解析方式存在着很大的不同.首先分析的是默认标签的解析过程.解析标签的入口代码 protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { if (delegate.isDefaultNamespace(root)) { NodeList nl = root原创 2022-05-13 19:30:00 · 365 阅读 · 0 评论 -
Spring解析及注册BeanDefinition
上一篇文章介绍了资源文件转为Document文件.下面接着介绍doLoadBeanDefinitions中最核心的部分.如果说前面两篇文章都是介绍XML解析的准备阶段的话,那么registerBeanDefinitions()里面会进行真正的XML文件的解析.把代码贴一遍 protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) throws BeanDefinitionStoreExcepti原创 2022-05-12 18:30:00 · 636 阅读 · 0 评论 -
Spring中的Document
上一篇文章已经介绍了Spring中XML的验证方式.接着讲Spring是如何把配置文件解析成Document的.Document @Override public Document loadDocument(InputSource inputSource, EntityResolver entityResolver, ErrorHandler errorHandler, int validationMode, boolean namespaceAware) throws Exception {原创 2022-05-11 15:20:17 · 522 阅读 · 0 评论 -
Spring中XML的验证模式
XML文件的验证模式保证了XML文件的正确性,而比较常用的验证模式有两种:DTD、XSD.DTD与XSD的区别一、DTD(Document Type Definition)即文档型定义,是一种XML约束模式语言,是XML文件的验证机制,是XML文件组成的一部分.他可以通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签是否使用正确.一个DTD文档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的实体或符号规则.DTD的引入分为两种方式:内部引用内部引用应当通过下面的原创 2022-05-11 14:22:49 · 724 阅读 · 0 评论 -
XmlBeanFactory
接着分析XmlBeanFactory容器,上一节已经把他和DefaultListableBeanFactory做了比较,下面就是以他为研究对象进行深入分析.BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactory.xml")); 根据上面的时序图,我们可以知道XmlBeanFactory初始化的整个过程.下面就分别分析各个步骤.配置文件的封装通过代码可以知道,配置文件是通过ClassPathResource进行原创 2022-05-10 11:58:50 · 979 阅读 · 0 评论 -
Spring的组成结构
beans包的层级结构src/main/java 用于展现Spring的主要逻辑src/main/resources 用于存放系统的配置文件src/test/java 用于对主要逻辑进行单元测试src/test/resources 用于存放测试用的配置文件两个核心类的介绍1、DefaultListableBeanFactoryDefaultListableBeanFactory是整个bean加载的核心部分,是Spring注册及加载Bean的默认实现.AliasRegistry:定义对原创 2022-05-09 23:24:04 · 337 阅读 · 0 评论