Spring应用上下文

news/2024/11/24 9:46:38/

学习《极客时间、spring全家桶学习记录贴》

Spring application context介绍:

Spring applicationcontext包含了业务pojo对象,还有配置的信息,Spring applicationcontext管理了所有的组件的生命周期,比如Inventoryservice、Productservice等组件。spring依赖注入也是通过上下文的实现的,在受托管的组件中,声明A组件依赖B组件,然后spring容器就会把依赖注入进去。

Spring应用上下文常用的接口

  • BeanFactory

  • DefaultListableBeanFactory

  • ApplicationContext的实现类:

  • ClassPathxmlApplicationContext

  • FileSystemXmlApplicationContext

  • AnnotationConfigApplicationContext

一般我们使用ApplicationContext接口及其实现,BeanFactory是最近本的应用上下文,springapplication context扩展了BeanFactory。开发过程中不建议直接使用BeanFactory。

web上下文层次:

当需要在Servlet中寻找某个Bean时,如果找不到,sping会到Root中去寻找。

通过Aop增强类方法的方式理解应用上下文

/*** 在方法结束打印信息*/
@Aspect
@Slf4j
public class FooAspect {@AfterReturning("bean(testBean*)")public void printAfter() {log.info("after hello()");}
}
/*** 打印信息,知道哪个上下文做了增强*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Slf4j
public class TestBean {private String context;public void hello() {log.info("hello " + context);}
}
/*** implements ApplicationRunner 重写run方法* @param args* @throws Exception*/@Overridepublic void run(ApplicationArguments args) throws Exception {//注解方式的上下文ApplicationContext fatherContext = new AnnotationConfigApplicationContext(FatherConfig.class);//声明fatherContext与childrenContext两个上下文是集成关系ClassPathXmlApplicationContext childrenContext = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"}, fatherContext);TestBean bean = fatherContext.getBean("testBeanA", TestBean.class);bean.hello();log.info("=============");TestBean bean1 = childrenContext.getBean("testBeanA", TestBean.class);bean1.hello();TestBean bean2 = childrenContext.getBean("testBeanB", TestBean.class);bean2.hello();}
第一种情况:Father和children上下文中都对testBeanA做了AOP增强
@Configuration
@EnableAspectJAutoProxy
public class FatherConfig {/*** 声明AOPAspect* @return*/@Beanpublic FatherAspect fatherAspect() {return new FatherAspect();}@Beanpublic TestBean testBeanA() {return new TestBean("Father");}@Beanpublic TestBean testBeanB() {return new TestBean("Father");}
}
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><aop:aspectj-autoproxy/><bean id="testBeanA" class="com.springwork.high.context.TestBean"><constructor-arg name="context" value="children" /></bean><!--    <bean id="fatherAspect" class="com.springwork.high.context.FatherAspect" />-->
</beans>

结果:Father上下文中的了testBeanA、testBeanB都得到AOP增强,同时children可以得到Father上下文中testBeanA的增强方法

23:09:56.847 [main] INFO  com.springwork.high.HighApplication - Started HighApplication in 2.261 seconds (JVM running for 3.135)
23:09:56.919 [main] INFO  com.springwork.high.context.TestBean - hello Father
23:09:56.920 [main] INFO  com.springwork.high.context.FatherAspect - after hello()
23:09:56.920 [main] INFO  com.springwork.high.HighApplication - =============
23:09:56.920 [main] INFO  com.springwork.high.context.TestBean - hello children
23:09:56.920 [main] INFO  com.springwork.high.context.FatherAspect - after hello()
23:09:56.920 [main] INFO  com.springwork.high.context.TestBean - hello Father
23:09:56.920 [main] INFO  com.springwork.high.context.FatherAspect - after hello()
23:09:56.921 [main] INFO  com.springwork.high.HighApplication - 
第二种情况:Father上下文中做了AOP增强,children上下文中没有AOP增强
/*** @author high* @version 1.0.0* @date 2023/3/26 21:45* @EnableAspectJAutoProxy 开启AspectJAutoProxy支持*/
@Configuration
@EnableAspectJAutoProxy
public class FatherConfig {/*** 声明AOPAspect* @return*/@Beanpublic FatherAspect fatherAspect() {return new FatherAspect();}@Beanpublic TestBean testBeanA() {return new TestBean("Father");}@Beanpublic TestBean testBeanB() {return new TestBean("Father");}
}
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">
<!--    <aop:aspectj-autoproxy/>--><bean id="testBeanA" class="com.springwork.high.context.TestBean"><constructor-arg name="context" value="children" /></bean><!--    <bean id="fatherAspect" class="com.springwork.high.context.FatherAspect" />-->
</beans>

结果:代表children的testBeanA没有被增强,发现children可以得到Father上下文中testBeanB增强

22:55:05.895 [main] INFO  com.springwork.high.context.TestBean - hello Father
22:55:05.896 [main] INFO  com.springwork.high.context.FatherAspect - after hello()
22:55:05.896 [main] INFO  com.springwork.high.HighApplication - =============
22:55:05.896 [main] INFO  com.springwork.high.context.TestBean - hello children
22:55:05.896 [main] INFO  com.springwork.high.context.TestBean - hello Father
22:55:05.896 [main] INFO  com.springwork.high.context.FatherAspect - after hello()
22:55:05.897 [main] INFO  com.springwork.high.HighApplication - 
第三种情况:Father上下文中没有AOP增强,children上下文中AOP增强了
@Configuration
@EnableAspectJAutoProxy
public class FatherConfig {/*** 声明AOPAspect* @return*/
//    @Bean
//    public FatherAspect fatherAspect() {
//        return new FatherAspect();
//    }@Beanpublic TestBean testBeanA() {return new TestBean("Father");}@Beanpublic TestBean testBeanB() {return new TestBean("Father");}
}
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><aop:aspectj-autoproxy/><bean id="testBeanA" class="com.springwork.high.context.TestBean"><constructor-arg name="context" value="children" /></bean><bean id="fatherAspect" class="com.springwork.high.context.FatherAspect" />
</beans>

结果:Father上下文中的没有testBeanA、testBeanB没有AOP增强,children上下文中testBeanA得到AOP增强了

23:02:16.950 [main] INFO  com.springwork.high.HighApplication - Started HighApplication in 2.175 seconds (JVM running for 3.014)
23:02:17.070 [main] INFO  com.springwork.high.context.TestBean - hello Father
23:02:17.070 [main] INFO  com.springwork.high.HighApplication - =============
23:02:17.075 [main] INFO  com.springwork.high.context.TestBean - hello children
23:02:17.076 [main] INFO  com.springwork.high.context.FatherAspect - after hello()
23:02:17.076 [main] INFO  com.springwork.high.context.TestBean - hello Father
23:02:17.077 [main] INFO  com.springwork.high.HighApplication - 
总结:

Father上下文中方法得到AOP增强后,children上下文可以在Father上下文中获取到增强后的方法;

children上下文中方法得到AOP增强后,Father上下文不能够在children上下文获取到增强后的方法;


http://www.ppmy.cn/news/37370.html

相关文章

高效自动化测试框架-优秀实践02-接口

高效自动化测试框架-优秀实践02-接口 高效实践点 编写接口的操作的时候只需要编写接口的url,请求方法,请求体的样例 其他的将接口封装成服务或者关键字的操作,全部使用装饰器来封装,能做到高效的解耦 在表示层编写业务测试用例的时候,可以使用函数式的编程方式,非常易读,还非…

机器学习-模型评估与选择

数据采集和预处理 数据采集和预处理是机器学习中非常重要的一步&#xff0c;因为它们决定了模型能否从数据中学到有效的模式和规律。以下是数据采集和预处理的主要任务&#xff1a; 1、数据采集 数据采集是指从各种来源&#xff08;如数据库、传感器、网站等&#xff09;收集…

软件设计模式

软件设计模式 1.设计模式分类图 2.常见的设计模式 2.1代理模式 1.代理模式&#xff1f; 结构型的设计模式。也算是行为型的。核心&#xff1a;调用方和被调用方之间增加一个中介者。也就是代理。调用方->代理->被调用方案例&#xff1a;买房子找中介&#xff0c;求职找猎…

4年资深测试总结,Jmeter 接口测试对请求字段的加密实战,即学即用......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 大家在工作中做接口…

贪心算法(四)

4.更多练习题 4&#xff09;力扣https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/这道题运用贪心算法&#xff0c;就是每天只考虑与前一天的差价&#xff0c;只要差价大于零&#xff0c;从局部最优来考虑&#xff0c;就应该卖出前一天的股票。这样可以得到全…

[JAVA]重写

1.重写的概念 重写&#xff0c;也被称为覆盖。重写是子类对父类的非静态&#xff0c;非private修饰&#xff0c;非final修饰&#xff0c;非构造的方法实现过程的重新编写。子类重写的方法的参数和返回值类型与父类的方法相同。 2.方法重写的规则 子类重写的方法与父类的参数…

让PyTorch训练速度更快,你需要掌握这17种方法

掌握这 17 种方法&#xff0c;用最省力的方式&#xff0c;加速你的 Pytorch 深度学习训练。近日&#xff0c;Reddit 上一个帖子热度爆表。主题内容是关于怎样加速 PyTorch 训练。原文作者是来自苏黎世联邦理工学院的计算机科学硕士生 LORENZ KUHN&#xff0c;文章向我们介绍了在…

python外篇(内存泄露)

目录 了解 循环引用造成的内存泄露 大量创建对象造成的内存泄漏 全局对象造成的内存泄露 不适当缓存造成的内存泄露 内存分析工具 了解 ### 以下为Python中可能会出现内存泄露的情况&#xff1a; (1) 循环引用&#xff1a;当两个或多个对象相互引用&#xff0c;造成…