【spring】ApplicationContext的实现

一、ClassPathXmlApplicationContext
1.1 说明
  • 1. 较为经典的容器,基于classpath下xml格式的配置文件来创建
  • 2. 在类路径下读取xml文件
  • 3. 现在已经很少用了,做个了解
1.2 代码示例
  • 1. 学生类
package com.learning.application_context;

public class Student {
	private Card card;

	public void setCard(Card card){
		this.card = card;
	}

	public Card getCard(){
		return this.card;
	}
}

  • 2. 卡类
package com.learning.application_context;

public class Card {
}

  • 3. xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="card" class="com.learning.application_context.Card"/>

	<bean id="student" class="com.learning.application_context.Student">
		<property name="card" ref="card"></property>
	</bean>
</beans>
  • 4. 测试类
package com.learning.application_context;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationContextTest {
	public static void main(String[] args) {
		testClassPathXmlApplicationContext();
	}

	private static void testClassPathXmlApplicationContext(){
		ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("class-path-xml-application-context.xml");
		for (String beanDefinitionName : classPathXmlApplicationContext.getBeanDefinitionNames()) {
			System.out.println(beanDefinitionName);
		}
		System.out.println(classPathXmlApplicationContext.getBean(Student.class).getCard());
	}
}

1.3 截图示例

在这里插入图片描述

二、FileSystemXmlApplicationContext
2.1 说明
  • 1. 基于读取文件系统的xml来创建
2.2 代码示例
package com.learning.application_context;

import org.springframework.context.support.FileSystemXmlApplicationContext;

public class ApplicationContextTest {
	public static void main(String[] args) {
		testFileSystemXmlApplicationContext();
	}

	private static void testFileSystemXmlApplicationContext(){
		// 具体配置的路径按实际情况来写
		FileSystemXmlApplicationContext fileSystemXmlApplicationContext = new FileSystemXmlApplicationContext("D:\\IdeaProject\\spring-framework\\spring-learning\\src\\main\\resources\\class-path-xml-application-context.xml");
		for (String beanDefinitionName : fileSystemXmlApplicationContext.getBeanDefinitionNames()) {
			System.out.println(beanDefinitionName);
		}
		System.out.println(fileSystemXmlApplicationContext.getBean(Student.class).getCard());
	}
}

private static void testFileSystemXmlApplicationContext(){
		// 绝对目录
//		FileSystemXmlApplicationContext fileSystemXmlApplicationContext = new FileSystemXmlApplicationContext("D:\\IdeaProject\\spring-framework\\spring-learning\\src\\main\\resources\\class-path-xml-application-context.xml");
		// 相对目录,但要设置工作目录
		FileSystemXmlApplicationContext fileSystemXmlApplicationContext = new FileSystemXmlApplicationContext("src\\main\\resources\\class-path-xml-application-context.xml");
		for (String beanDefinitionName : fileSystemXmlApplicationContext.getBeanDefinitionNames()) {
			System.out.println(beanDefinitionName);
		}
		System.out.println(fileSystemXmlApplicationContext.getBean(Student.class).getCard());
	}

在这里插入图片描述

2.3 加载xml的bean定义示例
package com.learning.application_context;

import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.ClassPathResource;

public class ApplicationContextTest {
	public static void main(String[] args) {
		loadXmlBeanDefinitionTest();
	}

	private static void loadXmlBeanDefinitionTest(){
		DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();
		System.out.println("读取前的BeanDefinitionName====");
		for (String beanDefinitionName : defaultListableBeanFactory.getBeanDefinitionNames()) {
			System.out.println(beanDefinitionName);
		}
		XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(defaultListableBeanFactory);
		xmlBeanDefinitionReader.loadBeanDefinitions(new ClassPathResource("class-path-xml-application-context.xml"));
		System.out.println("读取后的BeanDefinitionName====");
		for (String beanDefinitionName : defaultListableBeanFactory.getBeanDefinitionNames()) {
			System.out.println(beanDefinitionName);
		}
	}
}

在这里插入图片描述

三、AnnotationConfigApplicationContext
3.1 说明
  • 1. 较为经典的容器,基于java配置类来创建
  • 2. 会默认添加几个后处理器org.springframework.context.annotation.internalConfigurationAnnotationProcessor
    org.springframework.context.annotation.internalAutowiredAnnotationProcessor
    org.springframework.context.annotation.internalCommonAnnotationProcessor
    org.springframework.context.event.internalEventListenerProcessor
    org.springframework.context.event.internalEventListenerFactory
  • 3. 用xml的方式是用<context:annotation-config/>来添加的
3.2 代码示例
package com.learning.application_context;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Config {
	@Bean
	public Student student(Card card){
		Student student = new Student();
		student.setCard(card);
		return student;
	}

	@Bean
	public Card card(){
		return new Card();
	}
}

package com.learning.application_context;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class ApplicationContextTest {
	public static void main(String[] args) {
		testAnnotationConfigApplicationContext();
	}

	private static void testAnnotationConfigApplicationContext(){
		AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Config.class);
		for (String beanDefinitionName : annotationConfigApplicationContext.getBeanDefinitionNames()) {
			System.out.println(beanDefinitionName);
		}
	}
}

3.3 截图示例

在这里插入图片描述

四、AnnotationConfigServletWebServerApplicationContext
4.1 说明
  • 1. 可以加载tomcat服务来工作
  • 2. 需要加载springboot相关的jar包
4.2 代码示例
package com.learning.application_context;

import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletRegistrationBean;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Configuration
public class WebConfig {
    // 定义一个tomcat服务工厂
    @Bean
    public ServletWebServerFactory servletWebServerFactory(){
        return new TomcatServletWebServerFactory();
    }

    @Bean
    public DispatcherServlet dispatcherServlet(){
        return new DispatcherServlet();
    }

    @Bean
    public DispatcherServletRegistrationBean registrationBean(DispatcherServlet dispatcherServlet){
        return new DispatcherServletRegistrationBean(dispatcherServlet, "/");
    }

    @Bean("/hello")
    public Controller controllerOne(){
        return new Controller() {
            @Override
            public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
                httpServletResponse.getWriter().print("hello");
                return null;
            }
        };
    }
}

package com.learning.application_context;

import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletRegistrationBean;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Configuration
public class WebConfig {
    // 定义一个tomcat服务工厂
    @Bean
    public ServletWebServerFactory servletWebServerFactory(){
        return new TomcatServletWebServerFactory();
    }

    @Bean
    public DispatcherServlet dispatcherServlet(){
        return new DispatcherServlet();
    }

    @Bean
    public DispatcherServletRegistrationBean registrationBean(DispatcherServlet dispatcherServlet){
        return new DispatcherServletRegistrationBean(dispatcherServlet, "/");
    }

    @Bean("/hello")
    public Controller controllerOne(){
        return new Controller() {
            @Override
            public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
                httpServletResponse.getWriter().print("hello");
                return null;
            }
        };
    }
}

4.2 截图示例

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王佑辉

老板,赏点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值