当前位置: 首页 > news >正文

Spring创建Bean的过程(2)

上一节介绍了Spring创建过程中的两个重要的接口,那么它们在创建Bean的过程中起到了什么作用呢?接下来请看:

Spring有三种方式寻找 xml 配置文件,根据 xml 文件内容来构建 ApplicationContext,分别为ClassPathXmlApplicationContext,FileSystemXmlApplicationContext ,AnnotationConfigApplicationContext 和 AnnotationConfigServletWebApplicationContext。

动手创建Bean

创建接口实现类

public class beanImpl implements bean{@Overridepublic void print() {System.out.println("bean");}
}

创建xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName"><bean id="bean" class="com.beanImpl"/>
</beans>

运行

public class A01Application {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("classpath:bean.xml");context.getBean(bean.class).print();}
}D:\jdk8\bin\java.exe "-javaagent:F:\idea\IntelliJ IDEA 
22:49:09.159 [main] DEBUG org.springframework.context.s
22:49:09.261 [main] DEBUG org.springframework.beans.fac
22:49:09.282 [main] DEBUG org.springframework.beans.fac
bean进程已结束,退出代码0

那么,读取xml的时候发生了什么事呢

内部实现

public static void main(String[] args) {DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);xmlBeanDefinitionReader.loadBeanDefinitions(new ClassPathResource("bean.xml"));for (String name : beanFactory.getBeanDefinitionNames()){System.out.println(name);}}D:\jdk8\bin\java.exe "-javaagent:F:\idea\In
23:05:26.396 [main] DEBUG org.springframewo
bean进程已结束,退出代码0

注解创建Bean

public class A03Application {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(beanConfig.class);context.getBean(bean.class).print();for (String name : context.getBeanDefinitionNames()){System.out.println(name);}}
}bean
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
beanConfig
bean
与目标 VM 断开连接, 地址为: ''127.0.0.1:64717',传输: '套接字''进程已结束,退出代码0

注解创建Bean会把配置类也作为Bean注入进来,同时还会添加5个后处理器,来进行对beanConfig的解析处理。

支持WEB的注解创建Bean

创建支持web的配置类

@Configuration
public class WebConfig {//创建Servlet的web服务器@Beanpublic ServletWebServerFactory servletWebServerFactory(){return new TomcatServletWebServerFactory();}//创建前处理器,用来接收各种请求@Beanpublic DispatcherServlet dispatcherServlet(){return new DispatcherServlet();}//将dispatcherServlet注册在web服务器上@Beanpublic DispatcherServletRegistrationBean dispatcherServletRegistrationBean(DispatcherServlet dispatcherServlet){return new DispatcherServletRegistrationBean(dispatcherServlet,"/");}//Controller控制器@Bean("/bean")public Controller controller(){return new Controller() {@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {System.out.println("bean");return null;}};}
}

再运行一下主类吧

public class A04Application {public static void main(String[] args) {AnnotationConfigServletWebServerApplicationContext context = new AnnotationConfigServletWebServerApplicationContext(WebConfig.class);for (String name : context.getBeanDefinitionNames()){System.out.println(name);}}
}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
webConfig
servletWebServerFactory
dispatcherServlet
dispatcherServletRegistrationBean
/bean

 这样就能发现创建了所有的Bean,而且,还可以通过内置服务器运行接收请求。

                                                                                                                             to be continue······

http://www.lryc.cn/news/123804.html

相关文章:

  • Linux 终端操作命令(2)内部命令
  • 【Git】大大大问题之syntax error near unexpected token `(‘ 的错误解决办法
  • Flink源码之TaskManager启动流程
  • 加入微软MCPP有什么优势?
  • leetcode做题笔记78子集
  • Skywalking-9.6.0系列之本地源码编译并启动
  • proteus结合keil-arm编译器构建STM32单片机项目进行仿真
  • 第五十三天
  • gorm基本操作
  • 华为OD机试 - 排队游戏(Java JS Python)
  • 滚动条样式更改
  • 掌握Python的X篇_33_MATLAB的替代组合NumPy+SciPy+Matplotlib
  • Python解决-力扣002-两数相加
  • nginx基于源码安装的方式对静态页面、虚拟主机(IP、端口、域名)和日志文件进行配置
  • [FPAG开发]使用Vivado创建第一个程序
  • 使用 Python 在 NLP 中进行文本预处理
  • [足式机器人]Part3机构运动微分几何学分析与综合Ch03-1 空间约束曲线与约束曲面微分几何学——【读书笔记】
  • pytest框架快速进阶篇-pytest前置和pytest后置,skipif跳过用例
  • Python 基础语法 | 常量表达式,变量,注释,输入输出
  • SQL | 分组数据
  • 软件测试技术之如何编写测试用例(6)
  • 论文阅读——Adversarial Eigen Attack on Black-Box Models
  • 自然语言处理从入门到应用——LangChain:记忆(Memory)-[自定义对话记忆与自定义记忆类]
  • 【C/C++】STL queue 非线程安全接口,危险!
  • 执行Lua脚本后一直查询不到Redis中的数据(附带问题详细排查过程,一波三折)
  • [高光谱]PyTorch使用CNN对高光谱图像进行分类
  • jmeter获取mysql数据
  • Dedecms V110最新版RCE---Tricks
  • CTFshow 限时活动 红包挑战7、红包挑战8
  • Redis使用Lua脚本和Redisson来保证库存扣减中的原子性和一致性