spring应用上下文层级关系

本文深入探讨了Spring框架中applicationContext的应用与配置,详细解析了servletWebApplicationContext和rootWebApplicationContext的区别与联系,通过实例演示了如何配置AOP增强不同上下文中的bean。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

applicationContext中包含了业务的pojos对象还有配置的信息,spring将这些信息通过context的形式结合了在一起,由它来形成一个完整的系统,spring application context管理了所有组件的生命周期。
在这里插入图片描述
应用上下文一般分成两大块:一块是servlet WebApplicationContext:里面放的是与Spring mvc相关的一些bean。早期在配置componentScan会加上一些filter只要扫描controller注解的一些bean就好,在web.xml中配置其它配置文件的加载。
servlet WebApplicationContext里面放controller,root WebApplicationContext里面放service和repository。
servlet WebApplicationContext继承了root WebApplicationContext,在servlet里面找不到对应的bean时会在root里面找。

在日常开发中使用一些中间件时,中间件是通过aop来对方法进行增强从而来实现功能的。我们在配置中间件时要注意配置application上下文关系,注意是需要增强servlet WebApplication还是root WebApplication。下面我们用一个demo来理解spring上下文层级关系

我们使用springboot构建一个demo,分别用注解和xml配置的方式来创建两个applicationContext对象,其中一个上下文继承另外一个上下文,通过分别开启父类子类的aop代理来观察现象

需要增强的类

@AllArgsConstructor
@Slf4j
public class TestBean {
    private String name;

    public void print(){
        log.info("hello"+name);
    }
}

1、注解方式配置切面

@Slf4j
@Aspect     //定义为切面
public class TestAspect {
    @AfterReturning("bean(testBean*)")     //定义通知及切入点,aop增强效果是在方法执行后增加日志“after hello”
    public void after(){
        log.info("after hello");
    }
}

2、xml配置上下文

<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/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--
    <aop:aspectj-autoproxy/>      //开启aop代理
-->

    <bean id="testBeanX" class="com.changli.applicationContext.TestBean">
        <constructor-arg name="name" value="testBeanX"/>
    </bean>

<!--
    <bean id="testAspect" class="com.changli.applicationContext.parent.TestAspect"/>    //注入切面bean
-->
</beans>

3、通过注解配置上下文

@Configuration    //定义为配置类
@EnableAspectJAutoProxy     //开启aop代理
public class ParentConfig {
    @Bean
    public TestBean testBeanX(){
        return new TestBean("testBeanX");
    }
    @Bean
    public TestBean testBeanY(){
        return new TestBean("testBeanY");
    }
    @Bean
    public TestAspect testAspect(){
        return new TestAspect();
    }
}

4、主程序

@SpringBootApplication
@Slf4j
public class ApplicationContextApplication implements CommandLineRunner {

	public static void main(String[] args) {
		SpringApplication.run(ApplicationContextApplication.class, args);
	}

	@Override
	public void run(String... args) throws Exception {
		ApplicationContext parent = new AnnotationConfigApplicationContext(ParentConfig.class);   //加载注解配置的上下文
		ClassPathXmlApplicationContext child =new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"},parent);    //加载xml配置的上下文并继承注解配置的上下文

		TestBean beanFromParent = parent.getBean("testBeanX",TestBean.class);
		beanFromParent.print();
		log.info("================================================");

		TestBean beanFromChild =child.getBean("testBeanX",TestBean.class);
		beanFromChild.print();

		beanFromChild =child.getBean("testBeanY",TestBean.class);
		beanFromChild.print();
	}
}

运行结果
在这里插入图片描述
程序运行结果如上图,从父类上下文中拿出的testBeanX的方法得到了增强,从子类上下文中拿出的testBeanX,由于子类中也有定义testBeanX所以不会从父类拿,子类中没有对方法进行增强,所有没有打印after hello。子类中没有定义testBeanY,所以只能从父类中拿,父类中的方法增强了的,所以打印了after hello。
同理,你还可以将父类上下文的aop代理去掉,在子类中添加。试一试看看结果是否符合你的预期呢

demo的git地址
https://github.com/struggle1to1win/applicationContext.git

注:看丁雪峰老师教学视频后的学习笔记,侵删

在软件开发的需求分析阶段,明确系统边界和区分业务需求与软件需求至关重要。上下文关系图是一种UML图,它有助于理解系统的边界,以及系统与外部实体之间的交互。在实际操作中,应该使用上下文关系图来表示系统如何与环境(包括用户、其他系统等)进行交互,而非定义项目的具体范围。要做到这一点,需求分析师需要明确以下几点: 参考资源链接:[需求分析师笔试题目与答案解析](https://wenku.youkuaiyun.com/doc/7eggrrqdxs?spm=1055.2569.3001.10343) 首先,业务需求通常在项目立项阶段确定,包括业务目标和期望,不应包含具体的软件解决方案或设计约束。这些需求应足够抽象,能够适应未来可能的变化,同时为项目提供方向和目标。 其次,系统边界是通过与系统交互的外部实体来定义的。上下文关系图中,系统被表示为一个框,而外部实体则被表示为与系统框相连的框。这些外部实体可以是用户、其他系统或硬件设备等。系统与外部实体之间通过接口相连接,这些接口是系统边界的一部分。 在绘制上下文关系图时,需求分析师应专注于展示哪些外部实体与系统有交互,以及这些交互的性质是什么。例如,一个与采购管理子系统和客服管理子系统有关的上下文关系图,将展示这两个子系统如何与外部实体交互,而具体的业务活动或业务事件则在更详细的活动图中描述。 最后,需求分析师应当意识到,上下文关系图不是用来描述项目范围或业务活动详细事件流的工具。项目范围通常由项目目标、范围和需求大纲的初稿定义,而详细的业务事件和活动则通过活动图等更精细的UML图来表达。 综上所述,通过正确使用上下文关系图,需求分析师可以更清晰地区分业务需求与软件需求,明确系统边界,为软件项目的成功奠定基础。为了深入理解和练习这些技能,建议参考《需求分析师笔试题目与答案解析》中关于需求层次、系统边界、上下文关系图等相关知识点的讨论和题目解析。 参考资源链接:[需求分析师笔试题目与答案解析](https://wenku.youkuaiyun.com/doc/7eggrrqdxs?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值